策略模式项目应用

在这里插入图片描述
在这里插入图片描述
定义接口 UserExpireCheckProcessor

package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;

import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;

/**
 * @Author ziyang
 * @Date 2022/2/8
 */
public interface UserExpireCheckProcessor {
    /**
     * 获取渠道
     *
     * @return 渠道
     */
    String getChannel();

    /**
     * 校验
     *
     * @param context
     * @param param
     * @return
     */
    String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param);
}

零售通策略类 LSTUserExpireCheckProcessor

package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;

import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum;
import com.alibaba.lst.pos.common.enums.PosAccountStatusEnum;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;
import org.springframework.stereotype.Service;

/**
 * @Author ziyang
 * @Date 2022/2/8
 */
@Service
public class LSTUserExpireCheckProcessor implements UserExpireCheckProcessor {
    @Override
    public String getChannel() {
        return DeviceChannelTypeEnum.LST.name();
    }

    @Override
    public String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param) {
        return PosAccountStatusEnum.READY.name();
    }
}

如意策略类 RuyiUserExpireCheckProcessor

package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;

import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.common.consts.AccountConsts;
import com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum;
import com.alibaba.lst.pos.common.enums.PosAccountStatusEnum;
import com.alibaba.lst.pos.common.utils.DateUtil;
import com.alibaba.lst.pos.dao.entity.ruyi.account.RuyiAccountStoreRelationDO;
import com.alibaba.lst.pos.dao.facade.ruyi.account.RuyiAccountStoreRelationDAOFacade;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.Calendar;
import java.util.Date;

/**
 * @Author ziyang
 * @Date 2022/2/8
 */
@Service
public class RuyiUserExpireCheckProcessor implements UserExpireCheckProcessor {
    @Autowired
    private RuyiAccountStoreRelationDAOFacade ruyiAccountStoreRelationDAOFacade;

    @Override
    public String getChannel() {
        return DeviceChannelTypeEnum.RUYI.name();
    }

    @Override
    public String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param) {
        // 加个兼容逻辑
        // 新渠道不收费,但是防止老版本会受expireTime影响
        //查询账号 (如果有主子账号需要改造)
        RuyiAccountStoreRelationDO ruyiAccountStoreRelationDO = ruyiAccountStoreRelationDAOFacade.
            queryOwnerTypeAndDirectControlRuyiAccountStoreRelationByOwnerId(param.getOwnerId());
        // 增加一年
        Calendar calendar = Calendar.getInstance();
        if (ruyiAccountStoreRelationDO.getExpireDate() == null) {
            Date today = DateUtil.getDateIntegralPoint(new Date());
            calendar.setTime(today);
        } else {
            calendar.setTime(ruyiAccountStoreRelationDO.getExpireDate());
        }
        calendar.add(Calendar.DATE, AccountConsts.ONE_YEAR_DAYS);
        ruyiAccountStoreRelationDO.setExpireDate(calendar.getTime());
        ruyiAccountStoreRelationDAOFacade.update(ruyiAccountStoreRelationDO);
        return PosAccountStatusEnum.READY.name();
    }
}
	

优米策略类 SunmiUserExpireCheckProcessor

package com.alibaba.lst.pos.service.biz.ruyi.account.processor.user;

import com.alibaba.lst.pos.api.param.ruyi.account.RuyiAccountLoginParam;
import com.alibaba.lst.pos.api.param.software.ServiceOrderBatchQueryParam;
import com.alibaba.lst.pos.common.consts.AccountConsts;
import com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum;
import com.alibaba.lst.pos.common.enums.PosAccountStatusEnum;
import com.alibaba.lst.pos.dao.entity.software.RuyiServiceOrderDO;
import com.alibaba.lst.pos.service.biz.account.ModuleBizImpl;
import com.alibaba.lst.pos.service.biz.ruyi.account.impl.context.RuyiPosUserLoginContext;
import com.alibaba.lst.pos.service.biz.software.ServiceOrderBiz;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.ArrayList;
import java.util.List;
import java.util.Set;

import static com.alibaba.lst.pos.service.biz.account.ModuleBizImpl.BASE_MODULE_CODE;

/**
 * @Author ziyang
 * @Date 2022/2/8
 */
@Service
public class SunmiUserExpireCheckProcessor implements  UserExpireCheckProcessor {

    @Autowired
    private ModuleBizImpl moduleBiz;

    @Autowired
    private ServiceOrderBiz serviceOrderBiz;

    @Override
    public String getChannel() {
        return DeviceChannelTypeEnum.SUNMI.name();
    }

    @Override
    public String check(RuyiPosUserLoginContext context, RuyiAccountLoginParam param) {
        Set<String> userModuleList = moduleBiz.getUserModuleList(param.getOwnerId(), context.getDeviceDetailDTO());
        context.setModuleList(new ArrayList<>(userModuleList));
        if (userModuleList.contains(BASE_MODULE_CODE)) {
            return PosAccountStatusEnum.READY.name();
        }
        // 查询一下,如果曾经有订单,则返回需要续费
        ServiceOrderBatchQueryParam serviceOrderBatchQueryParam = new ServiceOrderBatchQueryParam();
        serviceOrderBatchQueryParam.setOwnerId(param.getOwnerId());
        serviceOrderBatchQueryParam.setChannelCode(context.getChannelInfo().name());
        List<RuyiServiceOrderDO> ruyiServiceOrderDOS = serviceOrderBiz.batchQueryServiceOrder(serviceOrderBatchQueryParam);
        if (!ruyiServiceOrderDOS.isEmpty()) {
            return PosAccountStatusEnum.NEED_RENEW.name();
        }
        return PosAccountStatusEnum.NEED_PAY.name();
    }
}

定义一个工厂类

package com.alibaba.lst.pos.service.biz.ruyi.account.processor.factory;

import com.alibaba.lst.pos.service.biz.ruyi.account.processor.user.UserExpireCheckProcessor;
import com.alibaba.lst.pos.service.biz.ruyi.account.processor.vendor.VendorActiveCheckProcessor;
import com.google.common.collect.Maps;
import org.apache.commons.collections4.CollectionUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Map;

/**
 * @Author xuzhiqiang
 * @Date 2022/2/8
 *
 * 使用策略模式 + 工厂模式
 *  登录是用户角色的判断操作
 *
 * 1:定义接口 UserExpireCheckProcessor
 *
 * 2:不同策略的类 实现接口UserExpireCheckProcessor  这里有策略
 *    LSTUserExpireCheckProcessor、RuyiUserExpireCheckProcessor、SunmiUserExpireCheckProcessor
 * 3:创建一个工厂类RuyiAccountExpireCheckProcessorFactory
 *   工厂类中定义一个map 用来保存所有的策略
 *   然后使用@Autowired注解用spring自动注入 spring会帮我们把map添加
 * 4:@Autowired
 *   private RuyiAccountExpireCheckProcessorFactory ruyiAccountExpireCheckProcessorFactory;
 *   注入工厂类
 * 5:VendorActiveCheckProcessor vendorActiveCheckProcessor = vendorActiveCheckProcessorFactory.getProcessor(channelInfo.name());
 *    boolean vendorActiveCheckPass = vendorActiveCheckProcessor.check(param);
 *
 */
@Service
public class RuyiAccountExpireCheckProcessorFactory {
    /**
     * @see com.alibaba.lst.pos.common.enums.DeviceChannelTypeEnum
     */
    private Map<String, UserExpireCheckProcessor> userExpireCheckProcessorMap;

    @Autowired
    public void setUserExpireCheckProcessorMap(List<UserExpireCheckProcessor> userExpireCheckProcessorList) {
        Map<String, UserExpireCheckProcessor> map = Maps.newHashMap();
        if (CollectionUtils.isNotEmpty(userExpireCheckProcessorList)) {
            for (UserExpireCheckProcessor processor : userExpireCheckProcessorList) {
                map.put(processor.getChannel(), processor);
            }
        }
        this.userExpireCheckProcessorMap = map;
    }

    public UserExpireCheckProcessor getProcessor(String channelCode) {
        return userExpireCheckProcessorMap.get(channelCode);
    }
}

使用
在这里插入图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值