Commit e1acc3f3 by 周晓航

Merge branch 'KA-消费黑名单订单限制-20220527'

parents 0067cb91 0c9b155f
......@@ -12,6 +12,10 @@
*/
package com.freemud.sdk.api.assortment.order.enums;
import java.util.Arrays;
import java.util.List;
/**
* 请勿使用已过期请用OldOrderAccountType 龚爱奇2019-05-19
*/
......@@ -44,19 +48,20 @@ public enum QueryOrderAccountType {
FULL_DISTRIBUTION_FEE("FULL_DISTRIBUTION_FEE", "满减配送费"),
OFFLINE_PAY("OFFLINE_PAY", "线下支付"),
GATHER_SPOT("GATHER_SPOT", "集点活动"),
MEMBER_PRICE_DISCOUNT("MEMBER_PRICE_DISCOUNT","会员价优惠"),
MCCAFE_MONTH_CARD("MCCAFE_MONTH_CARD","麦咖啡月卡"),
MEMBER_PRICE_DISCOUNT("MEMBER_PRICE_DISCOUNT", "会员价优惠"),
MCCAFE_MONTH_CARD("MCCAFE_MONTH_CARD", "麦咖啡月卡"),
WITH_ORDER_BUY_COUPON_FEE("WITH_ORDER_BUY_COUPON_FEE", "随单买月卡"),
COCO_PRODUCT_CASH_COUPON("COCO_PRODUCT_CASH_COUPON", "coco商品代金券"),
FULL_BUYM_SENDN("FULL_BUYM_SENDN", "满赠"),
FULL_M_COUNT_N_FOLD("FULL_M_COUNT_N_FOLD", "满M件N折"),
SCORE_PRODUCT_ACTIVITY("SCORE_PRODUCT_ACTIVITY", "积分商品活动"),
SINGLE_PRODUCT_REDUCTION("SINGLE_PRODUCT_REDUCTION", "单品立减")
;
SINGLE_PRODUCT_REDUCTION("SINGLE_PRODUCT_REDUCTION", "单品立减");
private String code;
private String desc;
public static List<QueryOrderAccountType> useCouponList = Arrays.asList(COUPON, B3S1_COUPON, FREIGHT_COUPON, PRODUCT_COUPON, DISCOUNT_COUPON);
QueryOrderAccountType(String code, String desc) {
this.code = code;
this.desc = desc;
......
......@@ -2036,7 +2036,7 @@ public class OrderAdapter {
String attr = "";
String attrEng = "";
for (OrderSpecialExtraAttrRequest special : extInfo.getSpecialAttrs()) {
if (special.getAttributeName().indexOf("冰") >= 0) {
if (Objects.nonNull(special.getAttributeName()) && special.getAttributeName().indexOf("冰") >= 0) {
attr = special.getAttributeName();
attrEng = special.getAttributeForeignName();
break;
......
package cn.freemud.entities.dto.blacklist;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 13:40
* @description :
*/
@Data
public class BlacklistDto {
/**
* 商户号
*/
private String partnerId;
/**
* 用户id
*/
private String memberId;
/**
* 是否使用用户积分
* 1=不显示积分
* 2=显示积分但不扣减
* 3=显示积分且扣减
* 消费黑名单用户 不管是否满足 都不能使用积分消费
*/
private Integer useCustomerScore;
/**
* 当前这一笔订单需要消费的金额
*/
private Long amount;
private boolean useCoupon = false;
}
package cn.freemud.entities.dto.blacklist;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 15:06
* @description : 返回前端提示数据
*/
@Data
public class OrderBlacklistResp {
@ApiModelProperty(value = "客服电话")
private String moblie;
@ApiModelProperty(value = "金额限制(单位:分)")
private Long surplusAmount;
}
package cn.freemud.entities.dto.blacklist;
import lombok.Data;
import java.util.Objects;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 14:49
* @description :
*/
@Data
public class Result<T> {
private boolean status = false;
private String message;
private T result;
private String statusCode;
public boolean isOk() {
return Objects.equals(statusCode, "200");
}
}
package cn.freemud.entities.dto.blacklist.req;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
import org.hibernate.validator.constraints.Range;
import javax.validation.constraints.NotBlank;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 14:34
* @description :
*/
@Data
public class BlackListQueryByClient {
/**
* 0储值卡黑名单
*/
public static final int RECORD_TYPE_SVC = 0;
/**
* 1消费黑名单
*/
public static final int RECORD_TYPE_CUSTOMER = 1;
@ApiModelProperty(value = "商户id")
@NotBlank(message = "商户id不能为空")
private String partnerId;
@ApiModelProperty("会员id")
private String memberId;
@ApiModelProperty("添加的黑名单类型 0储值卡黑名单 1消费黑名单")
@Range(min = 0, max = 1, message = "添加的黑名单类型 0储值卡黑名单 1消费黑名单")
private Integer recordType;
}
package cn.freemud.entities.dto.blacklist.resp;
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 14:35
* @description :
*/
@Data
public class MemberBlacklistVO {
/**
* 是否存在黑名单中
*/
private boolean exist;
// ---------> 消费黑名单才有下面的配置
@ApiModelProperty(value = "客服电话")
private String moblie;
@ApiModelProperty(value = "金额限制(单位:分)")
private Long limitAmount;
@ApiModelProperty(value = "已经消费的累积金额(单位:分)")
private Long shoppingTotalAmount;
}
......@@ -195,6 +195,7 @@ public enum ResponseResult {
ORDER_BIZ_TYPE_ERROR("45086", "订单业务类型异常",""),
COUPON_ORDER_VERIFY_FAIL("45087","买券订单校验异常",""),
COUPON_ORDER_COMMON_VERIFY_FAIL("45088","卖券订单基础校验失败",""),
TOUCH_SHOPPING_BLACK_LIST("45089","触发消费黑名单",""),
/**
* 售后单
......
package cn.freemud.handler;
import cn.freemud.constant.CustomerScoreConstant;
import cn.freemud.entities.dto.blacklist.BlacklistDto;
import cn.freemud.entities.dto.blacklist.Result;
import cn.freemud.entities.dto.blacklist.req.BlackListQueryByClient;
import cn.freemud.entities.dto.blacklist.resp.MemberBlacklistVO;
import cn.freemud.service.thirdparty.DataCenterClient;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Component;
import java.math.BigDecimal;
import java.util.Objects;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 11:59
* @description :
*/
@Component
public class MemberBlacklistHandler {
@Autowired
private DataCenterClient dataCenterClient;
/**
* 查询用户是否在黑名单中
*
* @param blacklistDto
*/
public String checkisTrueBlacklist(BlacklistDto blacklistDto) {
//step1 查询是否存在
BlackListQueryByClient req = new BlackListQueryByClient();
req.setPartnerId(blacklistDto.getPartnerId());
req.setMemberId(blacklistDto.getMemberId());
// 默认只查询消费黑名单
req.setRecordType(BlackListQueryByClient.RECORD_TYPE_CUSTOMER);
Result<MemberBlacklistVO> memberBlacklistVOResult = dataCenterClient.queryByMemberId(req);
if (!memberBlacklistVOResult.isOk()) {
return null;
}
MemberBlacklistVO result = memberBlacklistVOResult.getResult();
if (!result.isExist()) {
return null;
}
StringBuilder sb = new StringBuilder();
// 消费黑名单用户 不可使用积分支付
if (Objects.nonNull(blacklistDto.getUseCustomerScore()) && blacklistDto.getUseCustomerScore().compareTo(CustomerScoreConstant.SUBSTRACT.getValue()) == 0) {
sb.append("您已列入消费黑名单暂不可使用积分");
return sb.toString();
}
// 黑名单用户 不可使用优惠券
if (blacklistDto.isUseCoupon()) {
sb.append("您已列入消费黑名单暂不可使用优惠券");
return sb.toString();
}
//step2 存在校验剩余余额
Long limitAmount = result.getLimitAmount();
Long shoppingTotalAmount = result.getShoppingTotalAmount();
if (limitAmount.compareTo(shoppingTotalAmount + blacklistDto.getAmount()) >= 0) {
// 满足
return null;
}
// step3 余额不足组装前端参数 考虑负数默认0
long surplusAmount = limitAmount - shoppingTotalAmount;
// OrderBlacklistResp orderBlacklistResp = new OrderBlacklistResp();
// orderBlacklistResp.setMoblie(result.getMoblie());
// orderBlacklistResp.setSurplusAmount(surplusAmount < 0 ? 0L : surplusAmount);
// return orderBlacklistResp;
// 您的消费额度还有3元,暂无法支付,如有疑问,详询客服热线4008899096
BigDecimal amount = new BigDecimal(Math.max(surplusAmount, 0L)).divide(new BigDecimal("100"), 2, BigDecimal.ROUND_DOWN);
if (amount.compareTo(BigDecimal.ZERO) <= 0) {
sb.append("您的消费金额额度已用完,暂无法支付,如有疑问,详询客服热线").append(result.getMoblie());
} else {
sb.append("您的消费额度还有")
.append(amount)
.append("元,暂无法支付,如有疑问,详询客服热线")
.append(result.getMoblie());
}
return sb.toString();
}
}
......@@ -9,6 +9,7 @@ import cn.freemud.constant.RedisKeyConstant;
import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.bo.CreateOrderBONew;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.blacklist.BlacklistDto;
import cn.freemud.entities.dto.ecology.VirtualBindStoreResponse;
import cn.freemud.entities.dto.ecology.VirtualStoreRequest;
import cn.freemud.entities.dto.order.CreateOrderOperateDto;
......@@ -24,6 +25,7 @@ import cn.freemud.entities.dto.wechat.GetAuthorizerRequestDto;
import cn.freemud.entities.dto.wechat.GetTokenResponseDto;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.*;
import cn.freemud.handler.MemberBlacklistHandler;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.management.entities.dto.request.pay.PayRefundRequestDto;
import cn.freemud.management.entities.dto.response.pay.OrderRefundResponse;
......@@ -63,6 +65,7 @@ import com.freemud.application.sdk.api.ordercenter.response.orderInfo.AfterSales
import com.freemud.application.sdk.api.ordercenter.service.OrderSdkService;
import com.freemud.application.sdk.api.storecenter.response.StoreResponse;
import com.freemud.sdk.api.assortment.order.adapter.OrderSdkAdapter;
import com.freemud.sdk.api.assortment.order.enums.QueryOrderAccountType;
import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.response.order.BaseOrderResponse;
import com.freemud.sdk.api.assortment.order.response.order.CreateOrderResponse;
......@@ -149,6 +152,9 @@ public class MallOrderServiceImpl implements MallOrderService {
@Autowired
private SpellGroupOrderDataManager spellGroupOrderDataManager;
@Autowired
private MemberBlacklistHandler memberBlacklistHandler;
/**
* 创建订单
*/
......@@ -169,7 +175,9 @@ public class MallOrderServiceImpl implements MallOrderService {
checkMallOrder.checkOrderByDelivery(createOrderVo, userLoginInfoDto, storeResponseDto, shoppingCartGoodsDto.getTotalAmount(), trackingNo);
OrderExtInfoDto extInfo = this.getExtInfo(userLoginInfoDto, storeResponseDto, createOrderVo);
BaseResponse response = this.createOrderFlow(createOrderVo, storeResponseDto, shoppingCartGoodsDto, userLoginInfoDto, extInfo);
if (!Objects.equals(response.getCode(), ResponseResult.SUCCESS.getCode())) {
return response;
}
//组装支付公共方法参数
CreateOrderOperateDto createOrderOperateDto = (CreateOrderOperateDto) response.getResult();
createOrderBO.setExtInfo(extInfo);
......@@ -287,6 +295,31 @@ public class MallOrderServiceImpl implements MallOrderService {
createOrderRequest.setBaseCreateOrderRequest(baseCreateOrderRequest);
createOrderRequest.getBaseCreateOrderRequest().setUserName(userLoginInfoDto.getNickName());
createOrderRequest.setTrackingNo(LogThreadLocal.getTrackingNo());
// fisherman -> 微商城消费黑名单限制
BlacklistDto blacklistDto = new BlacklistDto();
blacklistDto.setAmount(baseCreateOrderRequest.getAmount());
blacklistDto.setPartnerId(createOrderVo.getPartnerId());
blacklistDto.setMemberId(createOrderVo.getUserId());
if (CollectionUtils.isNotEmpty(baseCreateOrderRequest.getAccounts())) {
// 过滤出券, 黑名单有用户不能用券
List<CreateOrderAccountRequest> useAccount = baseCreateOrderRequest.getAccounts()
.stream()
.filter(a -> QueryOrderAccountType.useCouponList.contains(a.getAccountType()))
.collect(Collectors.toList());
blacklistDto.setUseCoupon(CollectionUtils.isNotEmpty(useAccount));
}
blacklistDto.setUseCustomerScore(createOrderVo.getUseCustomerScore());
String touchStr = memberBlacklistHandler.checkisTrueBlacklist(blacklistDto);
if (StringUtils.isNotEmpty(touchStr)) {
CreateOrderResponse baseOrderResponse = new CreateOrderResponse();
baseOrderResponse.setErrcode(Integer.valueOf(ResponseResult.TOUCH_SHOPPING_BLACK_LIST.getCode()));
baseOrderResponse.setErrmsg(touchStr);
baseOrderResponse.setData(null);
return baseOrderResponse;
}
return orderBusinessService.createOrderFlow(createOrderRequest);
});
......
......@@ -24,6 +24,8 @@ import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.activity.PayGiftCheckAndJoinResponseDto;
import cn.freemud.entities.dto.activity.PayGiftCheckAndJoinResponseObj;
import cn.freemud.entities.dto.activity.PayGitCheckAndJoinRequestDto;
import cn.freemud.entities.dto.blacklist.BlacklistDto;
import cn.freemud.entities.dto.blacklist.OrderBlacklistResp;
import cn.freemud.entities.dto.coupon.CheckAndCancelRequest;
import cn.freemud.entities.dto.coupon.CheckAndCancelResponseDTO;
import cn.freemud.entities.dto.coupon.CouponResponseDTO;
......@@ -50,6 +52,7 @@ import cn.freemud.entities.dto.user.UserCouponCheckRequest;
import cn.freemud.entities.vo.*;
import cn.freemud.entities.vo.order.*;
import cn.freemud.enums.*;
import cn.freemud.handler.MemberBlacklistHandler;
import cn.freemud.handler.WeChatLiveMsgHandle;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.management.entities.dto.request.BatchOrderRefundV2Request;
......@@ -93,6 +96,7 @@ import com.freemud.api.assortment.datamanager.manager.customer.AssortmentCustome
import com.freemud.api.assortment.datamanager.meal.MealCacheManager;
import com.freemud.application.sdk.api.constant.ResponseConstant;
import com.freemud.application.sdk.api.constant.ResponseResultEnum;
import com.freemud.application.sdk.api.log.ApiLog;
import com.freemud.application.sdk.api.log.ErrorLog;
import com.freemud.application.sdk.api.log.LogThreadLocal;
import com.freemud.application.sdk.api.ordercenter.common.OrderAndShoppingCommonRedisKey;
......@@ -126,6 +130,7 @@ import com.freemud.sdk.api.assortment.message.service.IMessageTemplatePushServic
import com.freemud.sdk.api.assortment.order.constant.OrderRedisKeyConstant;
import com.freemud.sdk.api.assortment.order.entities.OrderRefundConfigEntity;
import com.freemud.sdk.api.assortment.order.enums.AutoOrderConfigTime;
import com.freemud.sdk.api.assortment.order.enums.QueryOrderAccountType;
import com.freemud.sdk.api.assortment.order.enums.StoreDeliveryMethod;
import com.freemud.sdk.api.assortment.order.request.order.*;
import com.freemud.sdk.api.assortment.order.response.order.*;
......@@ -295,6 +300,9 @@ public class OrderServiceImpl implements Orderservice {
private StockHandle stockHandle;
@Autowired
private MemberBlacklistHandler memberBlacklistHandler;
@Autowired
private OrderManagerAdapter orderManagerAdapter;
@Value("${sellcoupon.test.order.refund.fail:}")
......@@ -2485,6 +2493,26 @@ public class OrderServiceImpl implements Orderservice {
//组装老的创建订单数据模型
BaseCreateOrderRequest baseCreateOrderRequest = orderAdapter.convent2CreateOrderDto(createOrderVo, shoppingCartGoodsDto, storeResponseDto);
// fisherman 订单支付价格 _> 处理 消费黑面名单逻辑
Long amount = baseCreateOrderRequest.getAmount();
BlacklistDto blacklistDto = new BlacklistDto();
blacklistDto.setAmount(amount);
blacklistDto.setPartnerId(createOrderVo.getPartnerId());
blacklistDto.setMemberId(createOrderVo.getUserId());
blacklistDto.setUseCustomerScore(createOrderVo.getUseCustomerScore());
if (CollectionUtils.isNotEmpty(baseCreateOrderRequest.getAccounts())) {
// 过滤出券, 黑名单有用户不能用券
List<CreateOrderAccountRequest> useAccount = baseCreateOrderRequest.getAccounts()
.stream()
.filter(a -> QueryOrderAccountType.useCouponList.contains(a.getAccountType()))
.collect(Collectors.toList());
blacklistDto.setUseCoupon(CollectionUtils.isNotEmpty(useAccount));
}
String touchStr = memberBlacklistHandler.checkisTrueBlacklist(blacklistDto);
if (StringUtils.isNotEmpty(touchStr)) {
return ResponseUtil.error(ResponseResult.TOUCH_SHOPPING_BLACK_LIST.getCode(), touchStr);
}
// 预先前置 设置 支付方式
this.preSetPayChannelType(baseCreateOrderRequest, createOrderVo);
......
......@@ -12,6 +12,7 @@ import cn.freemud.constant.ResponseCodeConstant;
import cn.freemud.entities.Active;
import cn.freemud.entities.bo.CreateOrderBONew;
import cn.freemud.entities.dto.*;
import cn.freemud.entities.dto.blacklist.BlacklistDto;
import cn.freemud.entities.dto.coupon.CouponResponseDTO;
import cn.freemud.entities.dto.coupon.FastBatchQueryTemplateInfoRequest;
import cn.freemud.entities.dto.coupon.FastTemplateInfoResponseVO;
......@@ -29,6 +30,7 @@ import cn.freemud.entities.dto.store.StoreMixResponseDto;
import cn.freemud.entities.live.WeChatReportVO;
import cn.freemud.entities.vo.*;
import cn.freemud.enums.*;
import cn.freemud.handler.MemberBlacklistHandler;
import cn.freemud.handler.WeChatLiveMsgHandle;
import cn.freemud.interceptor.ServiceException;
import cn.freemud.manager.BuyProductOnceManager;
......@@ -180,6 +182,10 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
@Autowired
private CouponOnlineClient couponOnlineClient;
@Autowired
private MemberBlacklistHandler memberBlacklistHandler;
/**
* 抖音卖券
*/
......@@ -380,6 +386,18 @@ public class SellCouponOrderServiceImpl implements OrderFactoryService {
//标准化平台虚拟商品特价活动计算,不包含蜜雪APP买虚拟商品
List<SubtractStockVO> stockBeanDtos = calculationDiscount(partnerId, storeId, userLoginInfoDto.getMemberId(), productInfosDto.getData().getProducts().get(0), createOrderRequest);
// fisherman --> 校验是否存在用户消费黑名单 需要校验 !=null && >0
Long amount = createOrderRequest.getActualPayAmount();
if (Objects.nonNull(amount) && amount.compareTo(0L) > 0) {
BlacklistDto blacklistDto = new BlacklistDto();
blacklistDto.setAmount(amount);
blacklistDto.setPartnerId(createOrderRequest.getPartnerId());
blacklistDto.setMemberId(createOrderRequest.getUserId());
String touchStr = memberBlacklistHandler.checkisTrueBlacklist(blacklistDto);
if (StringUtils.isNotEmpty(touchStr)) {
return ResponseUtil.error(ResponseResult.TOUCH_SHOPPING_BLACK_LIST.getCode(), touchStr);
}
}
OrderBaseResp<OrderInfoReqs> orderInfoReqsBaseResponse = orderSdkService.createOrder(createOrderRequest, trackingNo);
CreateOrderResponse createOrderResponse = orderSdkAdapter.convent2NEWOrderInfoReqs(orderInfoReqsBaseResponse);
if (createOrderResponse == null || createOrderResponse.getErrcode() != 100) {
......
package cn.freemud.service.thirdparty;
import cn.freemud.entities.dto.blacklist.Result;
import cn.freemud.entities.dto.blacklist.req.BlackListQueryByClient;
import cn.freemud.entities.dto.blacklist.resp.MemberBlacklistVO;
import com.freemud.application.sdk.api.ordercenter.annotation.LogIgnoreFeign;
import org.springframework.cloud.openfeign.FeignClient;
import org.springframework.http.MediaType;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
/**
* @author : xh.Z
* @email : fisherman0510@163.com
* @Date : 2022/5/27 14:17
* @description :
*/
@FeignClient(name = "data-center")
@RequestMapping(produces = {MediaType.APPLICATION_JSON_UTF8_VALUE})
public interface DataCenterClient {
/**
* 查询用户是否在黑名单中
*/
@LogIgnoreFeign(logMessage="queryByMemberId")
@PostMapping("/blacklist/query-by-memberId")
Result<MemberBlacklistVO> queryByMemberId(@RequestBody BlackListQueryByClient req);
}
......@@ -359,7 +359,7 @@ public class CouponServiceImpl implements CouponService {
if (Objects.equals(couponStateVo.getType(), CouponTypeEnum.TYPE_1.getCode())) {
activityCouponBean.setDiscountAmount(couponStateVo.getOriginalPrice() + "");
} else if (Objects.equals(couponStateVo.getType(), CouponTypeEnum.TYPE_3.getCode())) {
// TODO 折扣券 百分值10 乘以10 前端统一除以100作为操作依据
// TODO 折扣券 百分值10 乘以10 前端统一除以100作为操作依据 _> 废弃, 现在默认 不乘10
activityCouponBean.setDiscountAmount(couponStateVo.getDiscount() != null ? couponStateVo.getDiscount() * 10 + "" : "0");
}else if (Objects.equals(couponStateVo.getType(), CouponTypeEnum.TYPE_5.getCode())) {
// 这里需要加入 配送券逻辑 如果为null 表示 配送券金额 全免, 否则就是部分减免
......
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