Authored by wujiexiang

优惠券 扩展商品范围

... ... @@ -3,6 +3,7 @@ package com.yoho.ufo.coupon.controller;
import com.yoho.ufo.coupon.service.ICouponService;
import com.yoho.ufo.exception.PlatformException;
import com.yoho.ufo.service.impl.BatchService;
import com.yoho.ufo.service.impl.UserHelper;
import com.yoho.ufo.service.model.ApiResponse;
import com.yoho.ufo.service.model.ExportParam;
import com.yoho.ufo.util.HttpUtil;
... ... @@ -58,6 +59,8 @@ public class CouponController {
if(req == null){
return new ApiResponse.ApiResponseBuilder().code(500).message("参数有误").build();
}
// 初始化非必填数据
req.setPid(new UserHelper().getUserId());
return this.couponService.saveOrUpdateCoupon(req);
}
... ...
package com.yoho.ufo.coupon.model;
import com.yoho.ufo.model.coupon.Coupon;
import lombok.Data;
import java.util.List;
@Data
public class CouponAndProductConditions {
private boolean change = false;
//券信息
private Coupon coupon;
//券的商品条件
private List<ProductCondition> productConditions;
}
... ...
package com.yoho.ufo.coupon.model;
import lombok.Builder;
import lombok.Data;
import java.util.List;
@Data
@Builder
public class ProductCondition {
private Integer productConditionType;
private List<Integer> productIds;
}
... ...
package com.yoho.ufo.coupon.model;
public enum ProductLimitType {
//商品限制条件,1:特定商品 2:全部商品 3:排除商品 4:特定品牌 5: 特定品类 6: 特定系列
ALL(2),
Specific_Product(1),
Exclude_Product(3),
Specific_Brand(4),
Specific_Category(5),
Specific_Series(6);
private int limitType;
ProductLimitType(int limitType) {
this.limitType = limitType;
}
public int getLimitType() {
return limitType;
}
public static ProductLimitType find(int limitType) {
for (ProductLimitType v : values()) {
if (v.getLimitType() == limitType) {
return v;
}
}
throw new IllegalArgumentException("Unknown limitType:" + limitType);
}
}
... ...
... ... @@ -12,6 +12,7 @@ import lombok.ToString;
@Builder
public class UidCouponQueryResp {
private Integer couponId;
private Integer userType;
private String couponName;
private Float couponAmount;
private String couponCode;
... ...
... ... @@ -15,6 +15,11 @@ public class UserCouponQueryResp {
private Integer couponId;
/**
* 用户类型 1:买家 2:卖家
*/
private Integer userType;
private String couponName;
private String couponToken;
... ...
package com.yoho.ufo.coupon.service.builder;
import com.yoho.error.exception.ServiceException;
import com.yoho.ufo.coupon.model.CouponAndProductConditions;
import com.yoho.ufo.coupon.model.ProductCondition;
import static com.yoho.ufo.coupon.model.ProductLimitType.*;
import com.yoho.ufo.coupon.model.ProductLimitType;
import com.yoho.ufo.coupon.util.Strings;
import com.yoho.ufo.model.coupon.Coupon;
import com.yoho.ufo.util.DateUtil;
import com.yohobuy.ufo.coupon.req.CouponSaveUpdateReq;
import org.apache.commons.collections.CollectionUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
import java.util.UUID;
public class CouponAndProductConditionsBuilder {
private static final String SKUP_FORBID_TYPE_NONE = "0";
private static final int MAX_LIST_SIZE = 500;
private static final Logger logger = LoggerFactory.getLogger(CouponAndProductConditionsBuilder.class);
private CouponSaveUpdateReq request;
public CouponAndProductConditionsBuilder(CouponSaveUpdateReq request) {
this.request = request;
}
public CouponAndProductConditions build() {
CouponAndProductConditions capc = new CouponAndProductConditions();
Coupon coupon = buildCoupon();
capc.setChange(Objects.nonNull(coupon.getId()));
capc.setCoupon(coupon);
capc.setProductConditions(buildProductConditions());
return capc;
}
private Coupon buildCoupon() {
Coupon coupon = new Coupon();
coupon.setId(request.getId());
coupon.setUserType(request.getUserType());
coupon.setCouponType(request.getCouponType());
coupon.setCouponName(request.getCouponName());
coupon.setCouponAmount(request.getCouponAmount());
coupon.setCouponNum(request.getCouponNum());
coupon.setUseNum(request.getUseNum());
coupon.setUseLimitType(request.getUseLimitType());
coupon.setUseLimitValue(request.getUseLimitValue());
coupon.setStartTime(request.getStartTime());
coupon.setEndTime(request.getEndTime());
coupon.setPid(request.getPid());
coupon.setRemark(request.getRemark());
coupon.setSkupForbidType(SKUP_FORBID_TYPE_NONE);
coupon.setSkupAllowType(Strings.trimAllWhitespace(request.getSkupAllowType()));
coupon.setBusinessClient(request.getBusinessClient());
coupon.setReceiveStartTime(request.getReceiveStartTime());
coupon.setReceiveEndTime(request.getReceiveEndTime());
coupon.setCheckRequired(request.getCheckRequired());
if (Objects.isNull(coupon.getId())) {
coupon.setCouponToken(UUID.randomUUID().toString());
coupon.setCreateTime(DateUtil.getCurrentTimeSeconds());
coupon.setStatus(Coupon.CouponStatusEnum.IN_EFFECT.getValue());
}
ProductLimitType productLimitType = ProductLimitType.find(request.getProductLimitType());
switch (productLimitType) {
case Specific_Brand:
case Specific_Series:
case Specific_Category: {
String productLimitValue = Strings.trimAllWhitespace(request.getProductLimitValue());
if (Strings.isEmpty(productLimitValue)) {
logger.warn("productLimitValue must not be empty for {}", productLimitType);
throw new ServiceException(400, "没有范围");
}
coupon.setProductLimitValue(productLimitValue);
}
}
coupon.setProductLimitType(productLimitType.getLimitType());
return coupon;
}
private List<ProductCondition> buildProductConditions() {
List<ProductCondition> conditions = new ArrayList<>(2);
//排除商品
List<Integer> excludeProductIds = Strings.split(request.getExcludeProductIds());
checkListSize(excludeProductIds, MAX_LIST_SIZE);
conditions.add(ProductCondition.builder().productConditionType(Exclude_Product.getLimitType()).productIds(excludeProductIds).build());
ProductLimitType productLimitType = ProductLimitType.find(request.getProductLimitType());
switch (productLimitType) {
case Specific_Product: {
List<Integer> specificProductIds = Strings.split(request.getProductLimitValue());
if (CollectionUtils.isEmpty(specificProductIds)) {
logger.warn("productIds must not be empty for {}", productLimitType);
throw new ServiceException(400, "特定商品:没有商品");
}
checkListSize(specificProductIds, MAX_LIST_SIZE);
conditions.add(ProductCondition.builder().productConditionType(Specific_Product.getLimitType()).productIds(specificProductIds).build());
break;
}
}
return conditions;
}
private void checkListSize(List<?> list, int maxSize) {
if (CollectionUtils.isNotEmpty(list) && list.size() > maxSize) {
logger.warn("list.size over limit :{}", maxSize);
throw new ServiceException(400, "列表过长");
}
}
}
... ...
... ... @@ -2,14 +2,17 @@ package com.yoho.ufo.coupon.service.impl;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import com.google.common.collect.Iterables;
import com.google.common.collect.Lists;
import com.yoho.core.rabbitmq.YhProducer;
import com.yoho.core.rest.client.ServiceCaller;
import com.yoho.error.exception.ServiceException;
import com.yoho.ufo.coupon.model.CouponAndProductConditions;
import com.yoho.ufo.coupon.model.ProductCondition;
import com.yoho.ufo.coupon.model.ProductLimitType;
import com.yoho.ufo.coupon.service.ICouponService;
import com.yoho.ufo.coupon.service.builder.CouponAndProductConditionsBuilder;
import com.yoho.ufo.coupon.util.Strings;
import com.yoho.ufo.dal.CouponDisplayMapper;
import com.yoho.ufo.dal.CouponMapper;
import com.yoho.ufo.dal.CouponProductLimitMapper;
... ... @@ -30,7 +33,6 @@ import com.yoho.ufo.service.impl.UserHelper;
import com.yoho.ufo.service.model.ApiResponse;
import com.yohobuy.ufo.coupon.req.*;
import com.yohobuy.ufo.model.common.PageResponseBO;
import com.yohobuy.ufo.model.order.constants.SkupType;
import com.yohobuy.ufo.model.promotion.CouponDisplayBo;
import com.yohobuy.ufo.model.promotion.constant.CouponTypeEnum;
import com.yohobuy.ufo.model.promotion.constant.PositionType;
... ... @@ -157,6 +159,7 @@ public class CouponServiceImpl implements ICouponService,IBusinessExportService{
resp.setCouponToken(userCoupon.getCouponToken());
resp.setUid(userCoupon.getUid());
resp.setCouponId(userCoupon.getCouponId());
resp.setUserType(userCoupon.getUserType());
resp.setCouponType(userCoupon.getCouponType());
resp.setStartTime(startTime=userCoupon.getStartTime());
resp.setStartTimeStr(DateUtil.int2DateStr(startTime, dateFormat));
... ... @@ -192,106 +195,82 @@ public class CouponServiceImpl implements ICouponService,IBusinessExportService{
}
private static final String SKUP_FORBID_TYPE_NONE = "0";
@Override
public ApiResponse saveOrUpdateCoupon(CouponSaveUpdateReq req) {
LOGGER.info("enter saveOrUpdateCoupon,param is {}",req);
checkSaveOrUpdateCouponParam(req);
// 检查优惠券类型
Optional<CouponTypeEnum> couponTypeEnum = CouponTypeEnum.of(req.getCouponType());
if (!couponTypeEnum.isPresent()){
throw new ServiceException(400, "错误:不合法的优惠券类型");
}
//parseSkupForbidType(req);
req.setSkupForbidType(SKUP_FORBID_TYPE_NONE);
parseSkupAllowType(req);
int productLimitType = req.getProductLimitType().intValue();
List<Integer> productIds = getProductIdsAndCheckProductLimitParam(productLimitType,req.getProductLimitValue());
// 初始化非必填数据
req.setSendNum(null == req.getSendNum()?0:req.getSendNum());
req.setPid(new UserHelper().getUserId());
// 如果是修改获取并校验优惠券信息
Coupon coupon = null;
if (req.getId() != null) {
coupon = couponMapper.selectById(req.getId());
if (Objects.isNull(coupon)) {
CouponAndProductConditions capc = new CouponAndProductConditionsBuilder(req).build();
if (capc.isChange()) {
// 如果是修改获取并校验优惠券信息
if (Objects.isNull(couponMapper.selectById(req.getId()))) {
throw new ServiceException(400, "错误:优惠券信息不存在");
}
}
Integer couponId;
// 插入
if(Objects.isNull(coupon)){
LOGGER.info("before saveOrUpdateCoupon#insert,req is {}",req);
req.setCouponToken(UUID.randomUUID().toString());
req.setCreateTime(DateUtil.getCurrentTimeSeconds());
req.setStatus(Coupon.CouponStatusEnum.IN_EFFECT.getValue());
couponMapper.insertByCouponSaveUpdateReq(req);
LOGGER.info("after saveOrUpdateCoupon#insert,req is {}",req);
saveProductLimitItems(req, productLimitType, productIds);
couponId = req.getId();
}
// 更新
else {
LOGGER.info("before saveOrUpdateCoupon#deleteByCouponId,couponId is {}",req.getId());
// 已经有了优惠券的发放记录
UserCouponNum userCouponNum = userCouponMapper.selectByCouponId(couponId = coupon.getId());
if (Objects.nonNull(userCouponNum) && userCouponNum.getCnt()>0){
LOGGER.info("sendNum bigger than 0, name|couponNu|remark only can update, couponId {}", req.getId());
CouponSaveUpdateReq couponSaveUpdateReq = new CouponSaveUpdateReq();
couponSaveUpdateReq.setId(couponId);
// 名称
couponSaveUpdateReq.setCouponName(req.getCouponName());
// 数量
couponSaveUpdateReq.setCouponNum(req.getCouponNum());
// 优惠券说明
couponSaveUpdateReq.setRemark(req.getRemark());
// 是否需要校验
couponSaveUpdateReq.setCheckRequired(req.getCheckRequired());
//结束时间
Integer endTime;
if (Objects.nonNull(endTime=req.getEndTime())){
couponSaveUpdateReq.setEndTime(endTime);
}
int couponId = capc.isChange() ? changeCouponDefinition(capc) : createCouponDefinition(capc);
saveOrUpdateDisplay(couponId, req.getShowInPrdDetail());
return new ApiResponse.ApiResponseBuilder().build();
}
LOGGER.info("has coupon send, saveOrUpdateCoupon#update,req is {}",req);
couponMapper.updateByCouponSaveUpdateReq(couponSaveUpdateReq);
private int createCouponDefinition(CouponAndProductConditions capc) {
LOGGER.info("create new coupon");
Coupon coupon = capc.getCoupon();
couponMapper.insertByCouponSaveUpdateReq(coupon);
int couponId = coupon.getId();
LOGGER.info("create coupon success,couponId is {}", couponId);
saveProductLimitItems(couponId, capc.getProductConditions());
LOGGER.info("save product limit items success");
return couponId;
}
private int changeCouponDefinition(CouponAndProductConditions capc) {
Coupon coupon = capc.getCoupon();
Integer couponId = coupon.getId();
// 已经有了优惠券的发放记录
if (isCouponAlreadySend(couponId)) {
LOGGER.info("sendNum bigger than 0, name|couponNu|remark only can update, couponId {}", couponId);
updateFewFields(coupon);
} else {
LOGGER.info("has no coupon send, before saveOrUpdateCoupon#update,couponId is {}", couponId);
couponMapper.updateByCouponSaveUpdateReq(coupon);
LOGGER.info("change coupon success,couponId is {}", couponId);
saveProductLimitItems(couponId, capc.getProductConditions());
LOGGER.info("change product limit items success");
}
return couponId;
}
}else{
private boolean isCouponAlreadySend(int couponId) {
UserCouponNum userCouponNum = userCouponMapper.selectByCouponId(couponId);
return Objects.nonNull(userCouponNum) && userCouponNum.getCnt() > 0;
}
LOGGER.info("sendNum noting, all info can update, couponId {}", req.getId());
private void updateFewFields(Coupon coupon) {
Coupon toUpdateCoupon = new Coupon();
toUpdateCoupon.setId(coupon.getId());
// 名称
toUpdateCoupon.setCouponName(coupon.getCouponName());
// 数量
toUpdateCoupon.setCouponNum(coupon.getCouponNum());
LOGGER.info("has no coupon send, before saveOrUpdateCoupon#update,req is {}",req);
couponMapper.updateByCouponSaveUpdateReq(req);
// 优惠券说明
toUpdateCoupon.setRemark(coupon.getRemark());
saveProductLimitItems(req, productLimitType, productIds);
}
// 是否需要校验
toUpdateCoupon.setCheckRequired(coupon.getCheckRequired());
LOGGER.info("after saveOrUpdateCoupon#update,req is {}",req);
//结束时间
Integer endTime;
if (Objects.nonNull(endTime = coupon.getEndTime())) {
toUpdateCoupon.setEndTime(endTime);
}
saveOrUpdateDisplay(couponId, req.getShowInPrdDetail());
return new ApiResponse.ApiResponseBuilder().build();
LOGGER.info("updateFewFields,toUpdateCoupon is {}", coupon);
couponMapper.updateByCouponSaveUpdateReq(toUpdateCoupon);
LOGGER.info("updateFewFields success");
}
private void parseSkupAllowType(CouponSaveUpdateReq req) {
if (StringUtils.isBlank(req.getSkupAllowType())) {
throw new ServiceException(403, "可使用该优惠券的商品属性不能为空");
}
List<String> allowAttributeTypes = Splitter.on(",").omitEmptyStrings().trimResults().splitToList(req.getSkupAllowType());
req.setSkupAllowType(Joiner.on(",").join(allowAttributeTypes));
}
private final static String API_ADDORUPDATEDISPLAY = "coupon.addOrUpdateDisplay";
private void saveOrUpdateDisplay(Integer couponId, String showInPrdDetail){
LOGGER.info("saveOrUpdateDisplay couponId {} showInPrdDetail {}", couponId, showInPrdDetail);
... ... @@ -320,41 +299,18 @@ public class CouponServiceImpl implements ICouponService,IBusinessExportService{
}
private void parseSkupForbidType(CouponSaveUpdateReq req) {
if (StringUtils.isBlank(req.getSkupForbidType())) {
req.setSkupForbidType(SKUP_FORBID_TYPE_NONE);
return;
}
List<String> limitTypes = Splitter.on(",").omitEmptyStrings().trimResults().splitToList(req.getSkupForbidType());
if (CollectionUtils.isEmpty(limitTypes)) {
req.setSkupForbidType(SKUP_FORBID_TYPE_NONE);
return;
}
for (String limitType : limitTypes) {
if (!limitType.matches("\\d+")) {
throw new ServiceException(400, "错误:不合法的限制类型");
}
if (!SkupType.of(Integer.parseInt(limitType)).isPresent() && !SKUP_FORBID_TYPE_NONE.equals(limitType)) {
throw new ServiceException(401, "错误:不合法的限制类型");
}
}
req.setSkupForbidType(Joiner.on(",").join(limitTypes));
}
private void saveProductLimitItems(CouponSaveUpdateReq req, int productLimitType, List<Integer> productIds) {
if(req.getProductLimitType() == Coupon.PRODUCTLIMITTYPE_SPECIALPRODUCT || req.getProductLimitType() == Coupon.PRODUCTLIMITTYPE_EXCLUDE){
// 清理之前的记录
couponProductLimitMapper.deleteByCouponId(req.getId());
// 重新插入
private void saveProductLimitItems(Integer couponId, List<ProductCondition> productConditions) {
// 清理之前的记录
couponProductLimitMapper.deleteByCouponId(couponId);
// 重新插入
if (CollectionUtils.isNotEmpty(productConditions)) {
// productIds 可能超过500个 每500个插入一次
Iterable<List<Integer>> productIdBatch = Iterables.partition(productIds, 1000);
for (List<Integer> productIdPer : productIdBatch){
couponProductLimitMapper.insertBatchByProductIds(productIdPer, productLimitType, req.getId());
//Iterable<List<Integer>> productIdBatch = Iterables.partition(productIds, 1000);
for (ProductCondition pc : productConditions) {
if (CollectionUtils.isNotEmpty(pc.getProductIds())) {
couponProductLimitMapper.insertBatchByProductIds(pc.getProductIds(), pc.getProductConditionType(), couponId);
}
}
}
}
... ... @@ -412,10 +368,32 @@ public class CouponServiceImpl implements ICouponService,IBusinessExportService{
}
}
List<Integer> specificProductIds = Lists.newArrayList();
List<Integer> excludeProductIds = Lists.newArrayList();
if (CollectionUtils.isNotEmpty(productLimitList)) {
productLimitList.forEach(item -> {
switch (ProductLimitType.find(item.getLimitType())) {
case Specific_Product:
specificProductIds.add(item.getProductId());
break;
case Exclude_Product:
excludeProductIds.add(item.getProductId());
break;
default:
throw new IllegalStateException("i don't known,impossible,id: " + item.getId());
}
});
}
if (CollectionUtils.isNotEmpty(specificProductIds)) {
coupon.setProductLimitValue(Strings.join(specificProductIds));
}
JSONObject jsonObject = new JSONObject();
jsonObject.put("coupon",coupon);
jsonObject.put("showInPrdDetail", showInPrdDetail);
jsonObject.put("productLimits",productLimitList);
jsonObject.put("excludeProductIds",Strings.join(excludeProductIds));
//jsonObject.put("productLimits",productLimitList);
return new ApiResponse.ApiResponseBuilder().data(jsonObject).build();
}
... ... @@ -586,6 +564,7 @@ public class CouponServiceImpl implements ICouponService,IBusinessExportService{
.couponName(null != coupon ? coupon.getCouponName() : null)
.couponId(userCoupon.getCouponId())
.couponCode(userCoupon.getCouponCode())
.userType(userCoupon.getUserType())
.createTime(com.yoho.ufo.util.DateUtil.int2DateStr(userCoupon.getCreateTime(), "yyyy-MM-dd HH:mm:ss"))
.status(UserCoupon.UserCouponStatusEnum.getKey(userCoupon.getStatus()))
.statusValue(userCoupon.getStatus())
... ... @@ -647,6 +626,12 @@ public class CouponServiceImpl implements ICouponService,IBusinessExportService{
LOGGER.warn("checkSaveOrUpdateCouponParam failed! couponName is blank");
throw new ServiceException(400, "错误:优惠券名称为空");
}
if (null == req.getUserType()) {
LOGGER.warn("checkSaveOrUpdateCouponParam failed! userType error! userType is {}", req.getUserType());
throw new ServiceException(400, "错误:用户类型条件为空");
}
if(null == req.getUseLimitType()){
LOGGER.warn("checkSaveOrUpdateCouponParam failed! useLimitType error! useLimitType is {}",req.getUseLimitType());
throw new ServiceException(400, "错误:优惠条件为空");
... ... @@ -663,6 +648,12 @@ public class CouponServiceImpl implements ICouponService,IBusinessExportService{
LOGGER.warn("checkSaveOrUpdateCouponParam failed! useNum error! useNum is {}",req.getUseNum());
throw new ServiceException(400, "错误:使用次数无效");
}
if (StringUtils.isBlank(req.getSkupAllowType())) {
LOGGER.warn("checkSaveOrUpdateCouponParam failed! skupAllowType error! skupAllowType is {}",req.getSkupAllowType());
throw new ServiceException(403, "可使用该优惠券的商品属性不能为空");
}
Integer startTime;
if(null == (startTime=req.getStartTime()) || startTime<0){
LOGGER.warn("checkSaveOrUpdateCouponParam failed! startTime error! startTime is {}",startTime);
... ... @@ -705,6 +696,12 @@ public class CouponServiceImpl implements ICouponService,IBusinessExportService{
if (req.getCheckRequired() == null){
throw new ServiceException(400, "发券确认标记不能为空");
}
// 检查优惠券类型
Optional<CouponTypeEnum> couponTypeEnum = CouponTypeEnum.of(req.getCouponType());
if (!couponTypeEnum.isPresent()){
throw new ServiceException(400, "错误:不合法的优惠券类型");
}
}
private boolean checkUpdateCouponParam(CouponSaveUpdateReq req) {
... ...
package com.yoho.ufo.coupon.util;
import com.google.common.base.Joiner;
import com.google.common.base.Splitter;
import org.springframework.util.StringUtils;
import java.util.List;
import java.util.stream.Collectors;
public class Strings {
public static final String TOKEN_SPLIT_DELIMITER = ",";
public static List<Integer> split(String str) {
return split(str, TOKEN_SPLIT_DELIMITER);
}
public static List<Integer> split(String str, String delimiter) {
List<Integer> values = null;
if (org.apache.commons.lang3.StringUtils.isNotEmpty(str)) {
values = Splitter.on(delimiter).splitToList(str).stream().map(Integer::valueOf).collect(Collectors.toList());
}
return values;
}
public static String trimAllWhitespace(String str) {
return StringUtils.trimAllWhitespace(str);
}
public static boolean isEmpty(String str) {
return !StringUtils.hasLength(str);
}
public static String join(List<?> list) {
return join(list, TOKEN_SPLIT_DELIMITER);
}
public static String join(List<?> list, String delimiter) {
return Joiner.on(delimiter).join(list).trim();
}
}
... ...
... ... @@ -19,11 +19,9 @@ public interface CouponMapper {
Coupon selectValidByToken(@Param("token") String token);
void insertOrUpdate(@Param("param") CouponSaveUpdateReq param);
void insertByCouponSaveUpdateReq(@Param("param") Coupon param);
void insertByCouponSaveUpdateReq(@Param("param") CouponSaveUpdateReq param);
void updateByCouponSaveUpdateReq(@Param("param") CouponSaveUpdateReq param);
void updateByCouponSaveUpdateReq(@Param("param") Coupon param);
List<Coupon> selectByIds(@Param("ids") List<Integer> id);
}
... ...
... ... @@ -11,6 +11,7 @@ import java.io.Serializable;
public class Coupon implements Serializable {
private Integer id;
private Integer userType;
private String couponToken;
private String couponName;
private Float couponAmount;
... ...
... ... @@ -9,6 +9,7 @@ public class UserCoupon implements Serializable {
private Integer id;
private Integer uid;
private Integer couponId;
private Integer userType;
private Integer couponType;
private String couponCode;
private Integer status;
... ... @@ -79,6 +80,14 @@ public class UserCoupon implements Serializable {
this.couponId = couponId;
}
public Integer getUserType() {
return userType;
}
public void setUserType(Integer userType) {
this.userType = userType;
}
public Integer getCouponType() {
return couponType;
}
... ...
... ... @@ -3,6 +3,7 @@
<mapper namespace="com.yoho.ufo.dal.CouponMapper">
<resultMap id="BaseResultMap" type="com.yoho.ufo.model.coupon.Coupon">
<result column="id" property="id" jdbcType="INTEGER" />
<result column="user_type" property="userType" jdbcType="INTEGER" />
<result column="coupon_token" property="couponToken" jdbcType="VARCHAR" />
<result column="coupon_name" property="couponName" jdbcType="VARCHAR" />
<result column="coupon_amount" property="couponAmount" jdbcType="FLOAT" />
... ... @@ -29,55 +30,21 @@
</resultMap>
<sql id="Base_Column_List">
id,coupon_token,coupon_name,coupon_amount,coupon_type,coupon_num,use_num,send_num,
id,user_type,coupon_token,coupon_name,coupon_amount,coupon_type,coupon_num,use_num,send_num,
use_limit_type,use_limit_value,product_limit_type,product_limit_value,start_time,
end_time,status,create_time,pid,remark,skup_forbid_type,skup_allow_type,business_client,
receive_start_time,receive_end_time,check_required
</sql>
<insert id="insertOrUpdate" useGeneratedKeys="true" keyProperty="param.id">
insert into coupon(id,coupon_token,coupon_name,coupon_amount,coupon_type,coupon_num,use_num,send_num,
use_limit_type,
<if test="param.useLimitType == 2">
use_limit_value,
</if>
product_limit_type,
<if test="param.productLimitType != 1">
product_limit_value,
</if>
start_time,end_time,status,create_time,pid,remark)
values(#{param.id},#{param.couponToken},#{param.couponName},#{param.couponAmount},#{param.couponType}
,#{param.couponNum},#{param.useNum},#{param.sendNum},#{param.useLimitType},
<if test="param.useLimitType == 2">
#{param.useLimitValue},
</if>
#{param.productLimitType},
<if test="param.productLimitType != 1">
#{param.productLimitValue},
</if>
#{param.startTime},#{param.endTime},#{param.status},#{param.createTime},#{param.pid},#{param.remark})
on duplicate key update
coupon_name=#{param.couponName},coupon_amount=#{param.couponAmount},coupon_type=#{param.couponType},coupon_num=#{param.couponNum}
,use_num=#{param.useNum},send_num=#{param.sendNum},
use_limit_type=#{param.useLimitType},
<if test="param.useLimitType == 2">
use_limit_value=#{param.useLimitValue},
</if>
product_limit_type=#{param.productLimitType},
<if test="param.productLimitType != 1">
product_limit_value=#{param.productLimitValue},
</if>
start_time=#{param.startTime},end_time=#{param.endTime},status=#{param.status},pid=#{param.pid},remark=#{param.remark}
</insert>
<insert id="insertByCouponSaveUpdateReq" useGeneratedKeys="true" keyProperty="param.id">
insert into coupon(
coupon_token,coupon_name,coupon_amount,coupon_type,coupon_num,use_num,send_num,
user_type,coupon_token,coupon_name,coupon_amount,coupon_type,coupon_num,use_num,
use_limit_type,
<if test="param.useLimitType == 2">
use_limit_value,
</if>
product_limit_type,
product_limit_value,
start_time,end_time,
status,
create_time,
... ... @@ -90,12 +57,14 @@
check_required
)
values(
#{param.userType},
#{param.couponToken},#{param.couponName},#{param.couponAmount},#{param.couponType}
,#{param.couponNum},#{param.useNum},#{param.sendNum},#{param.useLimitType},
,#{param.couponNum},#{param.useNum},#{param.useLimitType},
<if test="param.useLimitType == 2">
#{param.useLimitValue},
</if>
#{param.productLimitType},
#{param.productLimitValue},
#{param.startTime},
#{param.endTime},
#{param.status},
... ... @@ -144,6 +113,9 @@
<if test="param.productLimitType != null">
product_limit_type=#{param.productLimitType},
</if>
<if test="param.productLimitValue != null">
product_limit_value=#{param.productLimitValue},
</if>
<if test="param.startTime != null">
start_time=#{param.startTime},
</if>
... ... @@ -189,6 +161,10 @@
and coupon_name=#{param.name}
</if>
<if test="param.userType != null">
and user_type=#{param.userType}
</if>
<if test="param.startTime != null">
and start_time>=#{param.startTime}
</if>
... ... @@ -227,6 +203,11 @@
<if test="param.name != null">
and coupon_name=#{param.name}
</if>
<if test="param.userType != null">
and user_type=#{param.userType}
</if>
<if test="param.startTime != null">
and start_time>=#{param.startTime}
</if>
... ...
... ... @@ -18,7 +18,7 @@
<properties>
<project-name>ufo-platform</project-name>
<spring.version>4.3.8.RELEASE</spring.version>
<ufo.model.version>27.0-SNAPSHOT</ufo.model.version>
<ufo.model.version>28.0-SNAPSHOT</ufo.model.version>
<inboxclient.version>1.0.0-SNAPSHOT</inboxclient.version>
<lombok.version>1.16.16</lombok.version>
</properties>
... ...
package com.yoho.ufo.coupon;
import com.yoho.ufo.coupon.service.ICouponService;
import com.yoho.ufo.service.model.ApiResponse;
import com.yohobuy.ufo.coupon.req.CouponQueryReq;
import com.yohobuy.ufo.coupon.req.CouponSaveUpdateReq;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.test.context.ContextConfiguration;
import org.springframework.test.context.junit4.SpringJUnit4ClassRunner;
import org.springframework.test.context.web.WebAppConfiguration;
@RunWith(SpringJUnit4ClassRunner.class)
@ContextConfiguration(locations = {
"classpath*:META-INF/spring/mybatis-datasource.xml",
"classpath*:META-INF/spring/spring*.xml"})
@WebAppConfiguration("src/main/resources")
public class CouponTests {
@Autowired
private ICouponService couponService;
@Test
public void test_create_coupon() {
couponService.saveOrUpdateCoupon(createRequest());
}
@Test
public void test_change_coupon() {
CouponSaveUpdateReq req = createRequest();
req.setId(1968);
req.setProductLimitType(4);
couponService.saveOrUpdateCoupon(req);
}
@Test
public void test_query() {
CouponQueryReq req = new CouponQueryReq();
req.setCurTime(1583139859);
couponService.queryCoupons(req);
}
@Test
public void test_get_by_id() {
ApiResponse couponInfo = couponService.getCouponInfo(1968);
couponInfo.getData();
}
private CouponSaveUpdateReq createRequest() {
//{"id":"1956","couponName":"[dev]满20减2","couponAmount":"2","couponNum":1,"couponType":100,"useNum":1,
// "useLimitValue":20,"productLimitType":1,"productLimitValue":"15,14,13,12,11,18",
// "remark":"测试券","useLimitType":2,"startTime":1583078400,"endTime":1583164800,
// "skupAllowType":"1-N,4","businessClient":"ufo","receiveStartTime":1582992000,"receiveEndTime":1583078400,"checkRequired":0,"showInPrdDetail":"N","debug":"XYZ"}
CouponSaveUpdateReq req = new CouponSaveUpdateReq();
req.setUserType(1);
req.setCouponName("[dev]满20减2");
req.setCouponAmount(2.0f);
req.setCouponNum(1);
req.setCouponType(100);
req.setUseNum(1);
req.setUseLimitType(2);
req.setUseLimitValue(10);
req.setProductLimitType(1);
req.setProductLimitValue("15,14,13,12,11,18");
req.setExcludeProductIds("1,2,3,4");
req.setRemark("test");
req.setStartTime(1583078400);
req.setEndTime(1583164800);
req.setSkupAllowType("1-N,4");
req.setReceiveStartTime(1582992000);
req.setReceiveEndTime(1583078400);
req.setBusinessClient("ufo");
req.setCheckRequired(0);
req.setShowInPrdDetail("N");
return req;
}
}
... ...