Authored by chenchao

auth large settlement super

... ... @@ -28,6 +28,8 @@ public enum CacheKeyEnum {
USER_PRODUCT_FAVORITE_ZSET_KEY("ufo:user:product:favorite:","用户商品收藏集合", 180, TimeUnit.DAYS),
SUPER_ENTRY_SELLER_LIST("ufo:user:superEntrySeller:list","超级入驻商家集合", 1, TimeUnit.HOURS)
;
// 缓存的key
... ...
... ... @@ -78,7 +78,9 @@ public class CacheKeyBuilder {
SELLER_GOODS_FEE_RATE("ufo:order:seller:goods:service:feeRate", ""),
SELLER_GOODS_PLATFORM_FEE("ufo:order:seller:goods:platform:fee", ""),
BUYER_ORDER_FEE("ufo:order:buyer:order:fee",""),
BUYER_ORDER_CUT_POLICY("ufo:buyer:order:cut:policy:","type:{}");
BUYER_ORDER_CUT_POLICY("ufo:buyer:order:cut:policy:","type:{}"),
LARGE_SETTLEMENT_SUPER_NOTICE_WALLET_NOT_ENOUGH("ufo:seller:largeSettlement:walletNotEnough:notice:","uid:{}:cnt")
;
private String fix;
... ... @@ -174,4 +176,8 @@ public class CacheKeyBuilder {
public static RedisKeyBuilder orderDeliverNoticeTimesKey(long orderCode, String date){
return KeyTemp.ORDER_DELIVER_NOTICE_TIMES.builderKey(new Object[]{orderCode, date});
}
public static RedisKeyBuilder noticeLargeSettlementSuperWalletNotEnoughKey(int uid){
return KeyTemp.LARGE_SETTLEMENT_SUPER_NOTICE_WALLET_NOT_ENOUGH.builderKey(new Object[]{uid});
}
}
... ...
... ... @@ -118,4 +118,14 @@ public class StoredSellerCacheService {
cacheClient.delete(cke.getCacheKey());
}
public void setNoticeCntWhenWalletNotEnough(int uid, int cnt){
RedisKeyBuilder ckb = CacheKeyBuilder.noticeLargeSettlementSuperWalletNotEnoughKey(uid);
set(ckb, cnt, 7, TimeUnit.DAYS);
}
public Integer getNoticeCntWhenWalletNotEnough(int uid){
RedisKeyBuilder ckb = CacheKeyBuilder.noticeLargeSettlementSuperWalletNotEnoughKey(uid);
return get(ckb, Integer.class);
}
}
... ...
... ... @@ -24,6 +24,7 @@ import com.yohoufo.dal.order.model.StoredSeller;
import com.yohoufo.order.constants.SellerConfig;
import com.yohoufo.order.service.IStoredSellerService;
import com.yohoufo.order.service.MerchantOrderPaymentService;
import com.yohoufo.order.service.cache.StoredSellerCacheService;
import com.yohoufo.order.service.proxy.InBoxFacade;
import com.yohoufo.order.service.proxy.ProductProxyService;
import com.yohoufo.order.utils.LoggerUtils;
... ... @@ -38,6 +39,7 @@ import java.math.BigDecimal;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.function.Supplier;
/**
* Created by chao.chen on 2019/1/14.
... ... @@ -80,6 +82,9 @@ public class SellerEnterApplyService {
@Autowired
private ConfigReader configReader;
@Autowired
private StoredSellerCacheService storedSellerCacheService;
/**
* 申请成为超级卖家
* 对于未支付的某一种身份申请做订单号替换
... ... @@ -457,43 +462,100 @@ public class SellerEnterApplyService {
//身份等级配置
Map<EntrySellerType,EntryThreshold> estMap = metaConfigService.getEntryThreshold();
EntryThreshold set = estMap.get(currentEST);
Supplier<SellerLevelFuncBo> slfSupplier = () ->SellerHelper.getSellerLevelFunc(currentEST, set, left);
//目标身份对应的等级
SellerLevelFuncBo bslfb = SellerHelper.getSellerLevelFunc(currentEST, set, left);
Integer level = bslfb.getLevel();
logger.info("in changeLevel4Super ready change StoredSeller level func, uid {} currentEnterType {} target Level {}",
uid, currentEnterType, level);
//超级卖家
logger.info("in changeLevel4Super ready change StoredSeller targetFuncLevel func, uid {} currentEnterType {}",
uid, currentEnterType);
int result = 0;
if (sellerBo.isNormalSuper()) {
SellerLevelFuncBo bslfb = slfSupplier.get();
Integer targetFuncLevel = bslfb.getLevel();
//
EntryLevelNode eln = buildEntryLevelNode(sellerWrapper, bslfb);
Integer currentLevel = eln.currentLevel;
boolean levelNeedUpgrade = eln.needUpgrade;
StoredSeller pss = sellerWrapper.getStoredSeller();
boolean isValid = Objects.equals(pss.getValidStatus(), StoredSellerStatusEnum.entered.getId());
logger.info("in changeLevel4Super update StoredSeller, uid {} currentLevel {} target targetFuncLevel {} levelNeedUpgrade {} isValid {}",
uid, currentLevel, targetFuncLevel, levelNeedUpgrade, isValid);
doUpgradeSuper(currentEST, currentLevel, targetFuncLevel, uid);
SuperEnterStageLevel targetSESL = SuperEnterStageLevel.getSuperEnterStageLevel(targetFuncLevel);
inBoxFacade.noticeSuperSellerDegrade(uid, targetSESL, bslfb.getWalletThreshold());
}
processLargeSettlementSuperWhenWalletChange(sellerWrapper, left, slfSupplier);
return result;
}
static class EntryLevelNode{
Integer currentLevel;
Integer targetLevel;
boolean needUpgrade;
}
private EntryLevelNode buildEntryLevelNode(SellerWrapper sellerWrapper, SellerLevelFuncBo bslfb){
Integer targetFuncLevel = bslfb.getLevel();
//
sellerWrapper.buildSuperEnterStageLevel(sellerLevelFuncMapper::selectByPrimaryKey);
SellerBo sellerBo = sellerWrapper.buildSellerBo();
SuperEnterStageLevel sesl = sellerBo.getSuperEnterStageLevel();
Integer currentLevel = null;
boolean levelNeedUpgrade = Objects.nonNull(sesl)
&& Objects.nonNull(currentLevel = sesl.getCode())
&& !currentLevel.equals(level);
StoredSeller pss = sellerWrapper.getStoredSeller();
boolean isValid = Objects.equals(pss.getValidStatus(), StoredSellerStatusEnum.entered.getId());
logger.info("in changeLevel4Super update StoredSeller, uid {} currentLevel {} target level {} levelNeedUpgrade {} isValid {}",
uid, currentLevel, level, levelNeedUpgrade, isValid);
int result = 0;
if (levelNeedUpgrade && isValid) {
doUpgradeSuper(currentEST, currentLevel, level, uid);
if (sellerBo.isNormalSuper()) {
SuperEnterStageLevel targetSESL = SuperEnterStageLevel.getSuperEnterStageLevel(level);
inBoxFacade.noticeSuperSellerDegrade(uid, targetSESL, bslfb.getWalletThreshold());
}
&& !currentLevel.equals(targetFuncLevel);
if (sellerBo.isLargeSettlementSuper()){
EntryLevelNode eln = new EntryLevelNode();
eln.currentLevel = currentLevel;
eln.targetLevel = targetFuncLevel;
eln.needUpgrade = levelNeedUpgrade;
return eln;
}
private EntryLevelNode buildEntryLevelNode(SellerWrapper sellerWrapper, Supplier<SellerLevelFuncBo> slfbSupplier){
SellerLevelFuncBo bslfb = slfbSupplier.get();
return buildEntryLevelNode(sellerWrapper, bslfb);
}
private void processLargeSettlementSuperWhenWalletChange(SellerWrapper sellerWrapper, BigDecimal left,Supplier<SellerLevelFuncBo> slfSupplier){
SellerBo sellerBo = sellerWrapper.buildSellerBo();
if (sellerBo.isLargeSettlementSuper() ){
SellerLevelFuncBo bslfb = slfSupplier.get();
int uid = sellerBo.getUid();
Integer noticeCnt = null ;
boolean walletNotEnough = (bslfb.getLevel() == SuperEnterStageLevel.FULL.getCode()
&& bslfb.getWalletThreshold().compareTo(left) > 0 );
boolean notNotice = (Objects.isNull(noticeCnt= storedSellerCacheService.getNoticeCntWhenWalletNotEnough(uid)) || noticeCnt<1);
if (notNotice && walletNotEnough){
try {
logger.info("in changeLevel4Super send mail uid {} sellerBo {} noticeCnt {}",
uid, sellerBo, noticeCnt);
String mailTo = configReader.getString("ufo.order.seller.noticeHKSellerEmailTo", "chao.chen@yoho.cn,xiuchun.luo@yoho.cn");
MailSender.newMailSender()
.subject("UFO香港卖家结算")
.to(configReader.getString("ufo.order.seller.noticeHKSellerEmailTo", "chao.chen@yoho.cn,xiuchun.luo@yoho.cn"))
.to(mailTo)
.body("您的钱包金额不足,请及时充值", "text/html;charset=utf-8")
.send();
storedSellerCacheService.setNoticeCntWhenWalletNotEnough(uid, 1);
}catch (Exception ex){
logger.info("changeLevel4Super send mail fail, uid {} left wallet {}", uid, left, ex);
logger.warn("changeLevel4Super send mail fail, uid {} left wallet {}", uid, left, ex);
}
}
logger.info("in changeLevel4Super uid {} sellerBo {} noticeCnt {}",
uid, sellerBo, noticeCnt);
//hidden sale product
boolean needHiddenPrds = bslfb.getLevel() == SuperEnterStageLevel.DISABLE.getCode()
&& bslfb.getWalletThreshold().compareTo(left) > 0;
boolean cancelHidden = bslfb.getLevel() != SuperEnterStageLevel.DISABLE.getCode()
&& bslfb.getWalletThreshold().compareTo(left) < 0;
EntrySellerType currentEST = sellerBo.getEntrySellerType();
if (needHiddenPrds || cancelHidden){
EntryLevelNode eln = buildEntryLevelNode(sellerWrapper, bslfb);
doUpgradeSuper(currentEST, eln.currentLevel, eln.targetLevel, uid);
}
}
return result;
}
... ...
... ... @@ -109,19 +109,21 @@ public class SellerWrapper {
EntrySellerType entrySellerType = sellerBo.getEntrySellerType();
if (Objects.nonNull(entrySellerType)){
//
Integer entryType = sellerBo.getEntryTypeCode();
if(Objects.equals(entryType, EntrySellerType.SUPER_ENTRY.getCode())){
Integer levelFuncId = sellerBo.getLevelFuncId();
if(Objects.nonNull(levelFuncId)){
SellerLevelFunc slf = slfDS.apply(levelFuncId);
logger.info("buildSuperEnterStageLevel SellerLevelFunc uid {} levelFuncId {} SellerLevelFunc {}",
uid, levelFuncId, slf);
Integer level = slf.getLevel();
SuperEnterStageLevel sesl = SuperEnterStageLevel.getSuperEnterStageLevel(level);
sellerBo.setSuperEnterStageLevel(sesl);
}
switch (entrySellerType){
case SUPER_ENTRY:
case LARGE_SETTLEMENT:
Integer levelFuncId = sellerBo.getLevelFuncId();
if(Objects.nonNull(levelFuncId)){
SellerLevelFunc slf = slfDS.apply(levelFuncId);
logger.info("buildSuperEnterStageLevel SellerLevelFunc uid {} levelFuncId {} SellerLevelFunc {}",
uid, levelFuncId, slf);
Integer level = slf.getLevel();
SuperEnterStageLevel sesl = SuperEnterStageLevel.getSuperEnterStageLevel(level);
sellerBo.setSuperEnterStageLevel(sesl);
}
break;
}
}
return this;
}
... ...
... ... @@ -30,6 +30,7 @@ public class SellerHelper {
}
break;
case SUPER_ENTRY:
case LARGE_SETTLEMENT:
level = getSuperLevel(et,left);
if (level == SuperEnterStageLevel.FULL.getCode()) {
theshold = et.getPrepaymentAmount();
... ...
... ... @@ -53,7 +53,7 @@ public class SellerEnterApplyServiceTest extends BaseWebTest {
public void testChangeLevel4Super(){
int uid = 500031424;
SellerWrapper sellerWrapper =sellerService.getBaseSellerWrapper(uid);
BigDecimal left = new BigDecimal(100);
BigDecimal left = new BigDecimal(200);
sellerEnterApplyService.changeLevel4Super(sellerWrapper, left);
}
}
... ...
redis:
gwNoSyncRedis :
servers:
- 192.168.102.45:6379
auth: redis9646
\ No newline at end of file
- 192.168.104.246:6379
\ No newline at end of file
... ...