Commit d97f0e45 by hanghang.wang

【虚拟商品】商户618促销一元购买券包活动

parent 91b6c184
...@@ -97,6 +97,10 @@ public class RedisKeyConstant { ...@@ -97,6 +97,10 @@ public class RedisKeyConstant {
public final static String TAKECODEKEY = "takecode:"; public final static String TAKECODEKEY = "takecode:";
public final static String USER_BUY_PRODUCT_ONCE = "user_buy_product_once:";
/** /**
* cocoNotMadeGoods:商户号:门店号:yyyy-MM-dd * cocoNotMadeGoods:商户号:门店号:yyyy-MM-dd
* *
......
...@@ -82,6 +82,9 @@ public class ProductInfo { ...@@ -82,6 +82,9 @@ public class ProductInfo {
//Sku 规格 如果 当前是sku 则有值 //Sku 规格 如果 当前是sku 则有值
private List<SkuSpecValue> skuSpecValues; private List<SkuSpecValue> skuSpecValues;
//用于标识虚拟商品是否限制购买数量,0-否、1-是
private Integer isLimitNumProduct;
// @NoArgsConstructor // @NoArgsConstructor
// @Data // @Data
// public static class SkuProductBean { // public static class SkuProductBean {
......
...@@ -15,9 +15,9 @@ public enum BizTypeEnum { ...@@ -15,9 +15,9 @@ public enum BizTypeEnum {
} }
public static cn.freemud.enums.BizTypeEnum getByCode(Integer code) { public static cn.freemud.enums.BizTypeEnum getByCode(Integer code) {
for (cn.freemud.enums.BizTypeEnum payType : values()) { for (cn.freemud.enums.BizTypeEnum bizTypeEnum : values()) {
if (payType.getBizType().equals(code)) { if (bizTypeEnum.getBizType().equals(code)) {
return payType; return bizTypeEnum;
} }
} }
return null; return null;
......
...@@ -262,10 +262,21 @@ public enum ResponseResult { ...@@ -262,10 +262,21 @@ public enum ResponseResult {
GROUP_DOES_NOT_EXIST("720", "团不存在",""), GROUP_DOES_NOT_EXIST("720", "团不存在",""),
PARTICIPATE_IN_THE_GROUP_OVERRUN("80022", "参与拼团次数达到上限",""), PARTICIPATE_IN_THE_GROUP_OVERRUN("80022", "参与拼团次数达到上限",""),
SPELL_GROUP_REFUND_ERROR("80015", "取消拼团失败","") SPELL_GROUP_REFUND_ERROR("80015", "取消拼团失败",""),
/**
* 用于标识虚拟商品是否限制购买数量订单识别状态码 80102 - 80110
*/
USER_BUY_PRODUCT_MORE_THAN_THE_NUMBER("80102", "虚拟商品限制购买数量超过最大购买数",""),
USER_BUY_PRODUCT_ALREADY("80103", "限购商品购买达到上限",""),
; ;
private String code; private String code;
private String message; private String message;
private String enMessage; private String enMessage;
......
package cn.freemud.manager;
import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.entities.dto.product.ProductInfo;
import cn.freemud.enums.ResponseResult;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.stereotype.Component;
import java.util.List;
import java.util.concurrent.TimeUnit;
import java.util.stream.Collectors;
/**
* @author freemud
* @title: BuyProductOnceManager
* @projectName order-group
* @description: 618活动一元秒杀抢18元券包活动专属manager
* @date 2021/6/10上午9:53
*/
@Component
public class BuyProductOnceManager {
@Autowired
protected RedisTemplate redisTemplate;
//用户限购:每人每单限购一次 / 禁用
public ResponseResult checkBuyProductOnce(List<ProductInfo> products, String partnerId, String userId) {
List productsCheck = products.stream().filter(product -> product.getIsLimitNumProduct() == 1).collect(Collectors.toList());
if (CollectionUtils.isNotEmpty(productsCheck)) {
//每人每单限购一次
if (productsCheck.size() > 1) {
return ResponseResult.USER_BUY_PRODUCT_MORE_THAN_THE_NUMBER;
}
String key = this.getCheckBuyProductOnceKey(partnerId, userId);
if (redisTemplate.hasKey(key)) {
return ResponseResult.USER_BUY_PRODUCT_ALREADY;
}
redisTemplate.opsForValue().set(key, "Y");
//活动时间10天,防止redis脏数据,设置过期时间
redisTemplate.expire(key,10, TimeUnit.DAYS);
}
return ResponseResult.SUCCESS;
}
public String getCheckBuyProductOnceKey(String partnerId, String userId) {
StringBuilder key = new StringBuilder(RedisKeyConstant.USER_BUY_PRODUCT_ONCE)
.append(partnerId)
.append(":")
.append(userId);
return key.toString();
}
//清掉key
public boolean removeCheckBuyProductOnceKey(String partnerId, String userId) {
String key = this.getCheckBuyProductOnceKey(partnerId, userId);
redisTemplate.delete(key);
return true;
}
}
...@@ -64,6 +64,7 @@ import cn.freemud.management.entities.dto.response.activity.GroupWorkRefundRespo ...@@ -64,6 +64,7 @@ import cn.freemud.management.entities.dto.response.activity.GroupWorkRefundRespo
import cn.freemud.management.entities.dto.response.pay.PayBatchRefundResponse; import cn.freemud.management.entities.dto.response.pay.PayBatchRefundResponse;
import cn.freemud.management.service.handle.ActivityHandle; import cn.freemud.management.service.handle.ActivityHandle;
import cn.freemud.management.thirdparty.MulitiPaymentClient; import cn.freemud.management.thirdparty.MulitiPaymentClient;
import cn.freemud.manager.BuyProductOnceManager;
import cn.freemud.manager.OrderTackCodeManager; import cn.freemud.manager.OrderTackCodeManager;
import cn.freemud.manager.SpellGroupOrderDataManager; import cn.freemud.manager.SpellGroupOrderDataManager;
import cn.freemud.redis.RedisCache; import cn.freemud.redis.RedisCache;
...@@ -337,6 +338,9 @@ public class OrderServiceImpl implements Orderservice { ...@@ -337,6 +338,9 @@ public class OrderServiceImpl implements Orderservice {
@Autowired @Autowired
private OrderTackCodeManager orderTackCodeManager; private OrderTackCodeManager orderTackCodeManager;
@Autowired
private BuyProductOnceManager buyProductOnceManager;
@Override @Override
public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) { public BaseResponse checkBeforeCreateOrder(CheckBeforeCreateOrderRequestVo requestVo) {
String trackingNo = LogTreadLocal.getTrackingNo(); String trackingNo = LogTreadLocal.getTrackingNo();
...@@ -1988,6 +1992,8 @@ public class OrderServiceImpl implements Orderservice { ...@@ -1988,6 +1992,8 @@ public class OrderServiceImpl implements Orderservice {
return null; return null;
} }
@Override @Override
public BaseResponse deleteOrder(DeleteOrderVo deleteOrderVo) { public BaseResponse deleteOrder(DeleteOrderVo deleteOrderVo) {
if (StringUtils.isBlank(deleteOrderVo.getOid())) { if (StringUtils.isBlank(deleteOrderVo.getOid())) {
...@@ -2024,6 +2030,10 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2024,6 +2030,10 @@ public class OrderServiceImpl implements Orderservice {
// } // }
// TODO: 2019/9/10 删除订单通知 // TODO: 2019/9/10 删除订单通知
backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus()); backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus());
//取消支付时,清理key.此处不做校验是否限制次数的单子,卖券订单直接清理
if(Objects.equals(BizTypeEnum.APP_COUPON.getBizType(),orderBean.getBizType())){
buyProductOnceManager.removeCheckBuyProductOnceKey(orderBean.getCompanyId(),orderBean.getUserId());
}
return ResponseUtil.success(); return ResponseUtil.success();
} }
...@@ -2067,6 +2077,10 @@ public class OrderServiceImpl implements Orderservice { ...@@ -2067,6 +2077,10 @@ public class OrderServiceImpl implements Orderservice {
} }
// TODO: 2019/9/10 删除订单通知 // TODO: 2019/9/10 删除订单通知
backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus()); backOrdersStatusChange(orderBean.getOid(), orderBean.getStatus());
//取消支付时,清理key.此处不做校验是否限制次数的单子,卖券订单直接清理
if(Objects.equals(BizTypeEnum.APP_COUPON.getBizType(),orderBean.getBizType())){
buyProductOnceManager.removeCheckBuyProductOnceKey(orderBean.getCompanyId(),orderBean.getUserId());
}
return ResponseUtil.success(); return ResponseUtil.success();
} }
......
...@@ -18,6 +18,7 @@ import cn.freemud.enums.OrderBeanType; ...@@ -18,6 +18,7 @@ import cn.freemud.enums.OrderBeanType;
import cn.freemud.enums.ResponseResult; import cn.freemud.enums.ResponseResult;
import cn.freemud.enums.UserLoginChannelEnum; import cn.freemud.enums.UserLoginChannelEnum;
import cn.freemud.interceptor.ServiceException; import cn.freemud.interceptor.ServiceException;
import cn.freemud.manager.BuyProductOnceManager;
import cn.freemud.redis.RedisCache; import cn.freemud.redis.RedisCache;
import cn.freemud.service.CouponService; import cn.freemud.service.CouponService;
import cn.freemud.service.thirdparty.StoreItemClient; import cn.freemud.service.thirdparty.StoreItemClient;
...@@ -136,10 +137,17 @@ public class SellCouponOrderServiceImpl { ...@@ -136,10 +137,17 @@ public class SellCouponOrderServiceImpl {
private String supermarketPartnerId; private String supermarketPartnerId;
@Value("#{'${buyProductOnce.partnerId}'.split(',')}")
private List<String> buyProductOncePartnerIds;
private final String SUCCESS = "100"; private final String SUCCESS = "100";
private final String ngsCouponProductId = "76161384"; private final String ngsCouponProductId = "76161384";
@Autowired
private BuyProductOnceManager buyProductOnceManager;
/** /**
* 卖券订单创建 * 卖券订单创建
*/ */
...@@ -149,6 +157,7 @@ public class SellCouponOrderServiceImpl { ...@@ -149,6 +157,7 @@ public class SellCouponOrderServiceImpl {
String trackingNo = LogThreadLocal.getTrackingNo(); String trackingNo = LogThreadLocal.getTrackingNo();
String partnerId = userLoginInfoDto.getPartnerId(); String partnerId = userLoginInfoDto.getPartnerId();
String storeId = requestVo.getShopId(); String storeId = requestVo.getShopId();
String userId = userLoginInfoDto.getMemberId();
//查询门店信息 //查询门店信息
StoreInfoRequest storeInfoRequest = new StoreInfoRequest(partnerId, storeId,null); StoreInfoRequest storeInfoRequest = new StoreInfoRequest(partnerId, storeId,null);
StoreResponse storeResponse = storeCenterService.getStoreInfo(storeInfoRequest, trackingNo); StoreResponse storeResponse = storeCenterService.getStoreInfo(storeInfoRequest, trackingNo);
...@@ -171,6 +180,20 @@ public class SellCouponOrderServiceImpl { ...@@ -171,6 +180,20 @@ public class SellCouponOrderServiceImpl {
ApiLog.info("查询商品信息失败,getProductInfoDto,baseResponse",getProductInfoDto,productInfosDto); ApiLog.info("查询商品信息失败,getProductInfoDto,baseResponse",getProductInfoDto,productInfosDto);
return ResponseUtil.error(productInfosDto.getCode().toString(),"商品不存在"); return ResponseUtil.error(productInfosDto.getCode().toString(),"商品不存在");
} }
//通过商户号配置进阿波罗,识别哪些商户走仅限一次卖券业务 wanghanghang 0610
if (buyProductOncePartnerIds != null && buyProductOncePartnerIds.contains(partnerId)) {
try {
ResponseResult checkRequest = buyProductOnceManager.checkBuyProductOnce(productInfosDto.getData().getProducts(),partnerId,userId);
if(!checkRequest.equals(ResponseResult.SUCCESS)){
return ResponseUtil.error(checkRequest);
}
}catch (Exception e){
ApiLog.info("校验用户每人每单限购一次异常",getProductInfoDto,productInfosDto);
}
}
// GetProductInfoRequest request = new GetProductInfoRequest(); // GetProductInfoRequest request = new GetProductInfoRequest();
// request.setChannel(requestVo.getMenuType()); // request.setChannel(requestVo.getMenuType());
// request.setPartnerId(partnerId); // request.setPartnerId(partnerId);
...@@ -231,6 +254,8 @@ public class SellCouponOrderServiceImpl { ...@@ -231,6 +254,8 @@ public class SellCouponOrderServiceImpl {
CancelOrderRequest cancelOrderRequest = orderSdkAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(), CancelOrderRequest cancelOrderRequest = orderSdkAdapter.convent2CancelOrderRequest(orderBean.getOid(), orderBean.getCompanyId(),
AfterSalesType.SYSTEM_CANCEL, "商品库存不足", "", null); AfterSalesType.SYSTEM_CANCEL, "商品库存不足", "", null);
BaseOrderResponse orderResponse = orderCenterSdkService.orderCancel(cancelOrderRequest); BaseOrderResponse orderResponse = orderCenterSdkService.orderCancel(cancelOrderRequest);
//异常清理掉key
buyProductOnceManager.removeCheckBuyProductOnceKey(partnerId,userId);
return ResponseUtil.error(baseResponse.getCode(),"商品库存不足"); return ResponseUtil.error(baseResponse.getCode(),"商品库存不足");
} }
} }
......
package cn.freemud.manager;
import cn.freemud.entities.dto.product.ProductInfo;
import cn.freemud.enums.ResponseResult;
import cn.freemud.utils.ResponseUtil;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.test.context.junit4.SpringRunner;
import java.util.ArrayList;
import java.util.List;
/**
* @author freemud
* @title: BuyProductOnceTest
* @projectName order-group
* @description: TODO
* @date 2021/6/10下午2:52
*/
@RunWith(SpringRunner.class)
@SpringBootTest
public class BuyProductOnceTest {
@Autowired
private BuyProductOnceManager buyProductOnceManager;
@Test
public void buyProductOnceTest(){
List<ProductInfo> products = new ArrayList<>();
ProductInfo productInfo = new ProductInfo();
productInfo.setIsLimitNumProduct(1);
products.add(productInfo);
ResponseResult re = buyProductOnceManager.checkBuyProductOnce(products,"1864","wanghanghang");
System.out.println(re.getCode() + " " + re.getMessage());
}
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment