制定规则

编程中想给自己的程序制定一种规则:当满足某种条件时运行某部分的代码。枚举可以完成较简单的这种规则,今天记录一个稍复杂的规则。
以用户参与多个活动为例,这几个活动都需要用户填入一些基本信息,但随后会进行不同的动作,这时我们就需要制定一个规则,在不同的条件下让用户进行不同的动作,具体代码如下:
/**
 * 活动用户组装服务实现类
 */
@Service
public class UserActionImpl extends BaseService implements UserAction {

@Transactional
@Override
public long add(ActivityUserAddReqModelactivityUserAddReqModel) throws BaseException {
log.begin("开始增加活动用户activityUserAddReqModel=%s", activityUserAddReqModel);

*// 用户输入基本信息代码 略*
boolean isLaunch = false;//用户成功参与后isLaunch =true

*// 增加活动规则*
Map<String, Object> params = new HashMap<>();//map型,你可以传入多个、多种类型的参数。
params.put("isLaunch", isLaunch); //此时的isLaunch是布尔型
activityRuleService.afterLaunch(activityUserAddReqModel.getActivityId(),activityUserAddReqModel.getUserAccountUuid(), params);//activityRuleService是规则的服务类,afterLaunch是这个服务类中的一个方法,在这里的含义为:用户成功之后进入规则。
return result;
}
}
/**
 * 活动规则服务类
 */
public interface ActivityRuleService {

    /**
     * 活动发起后
     *
     * @param activityId 活动id
     * @param userAccountUuid 用户账号随机id
     * @param params 参数
     * @throws BaseException
     */
    void afterLaunch(Long activityId, String userAccountUuid, Map<String, Object> params) throws BaseException;

活动规则服务类可以由多个实现类实现,如下图所示:
这里写图片描述

这里有一个ActivityRuleService活动规则服务类,ActivityRuleServiceImpl和DefaultActivityRuleService实现它,根据活动id来确定走哪个实现类。

活动规则枚举:

public enum ActivityRuleEnum {

    /**
     * 好声音
     */
    GOOD_VOICE(3L) {
        @Override
        public ActivityRuleService getActivityRuleService() {
            return SystemListener.getBean(GoodVoiceRuleServiceImpl.class);//这里有监听
        }
    },

    /**
     * 感谢信
     */
    THANK_LETTER(5L) {
        @Override
        public ActivityRuleService getActivityRuleService() {
            return SystemListener.getBean(ThankLetterRuleServiceImpl.class);
        }
    },

    /**
     * 城市大比拼
     */
    CITY_COMPETITION(7L) {
        public ActivityRuleService getActivityRuleService() {
            return SystemListener.getBean(CityCompetitionRuleServiceImpl.class);
        }
    };

    private Long activityId;
    private static Map<Long, ActivityRuleEnum> enumMap = new HashMap<>();

    static {
        EnumSet<ActivityRuleEnum> set = EnumSet.allOf(ActivityRuleEnum.class);
        for (ActivityRuleEnum each : set) {
            enumMap.put(each.getActivityId(), each);
        }
    }

    ActivityRuleEnum(Long activityId) {
        this.activityId = activityId;
    }

    public Long getActivityId() {
        return activityId;
    }

    /**
     * @return 获取活动规则的服务
     */
    public abstract ActivityRuleService getActivityRuleService();

    /**
     * @param value 厂商值
     * @return 获取活动规则枚举
     */
    public static ActivityRuleEnum getActivityRuleEnum(Long value) {
        return enumMap.get(value);
    }
/**
 * 系统监听类
 */
@WebListener
public class SystemListener implements ServletContextListener {

    private static ApplicationContext applicationContext;

    @Override
    public void contextInitialized(ServletContextEvent event) {
        ServletContext application = event.getServletContext();
        applicationContext = WebApplicationContextUtils.getRequiredWebApplicationContext(application);

        StaticValue.realPath = application.getRealPath("");
        StaticValue.contextPath = application.getContextPath();

        application.setAttribute(CommonConstant.CONTEXT_PATH, StaticValue.contextPath);
        this.subclassInit();
    }

    @Override
    public void contextDestroyed(ServletContextEvent event) {

    }

    /**
     * 子类可继承实现
     */
    protected void subclassInit() {

    }

    /**
     * @return 获取spring上下文
     */
    public static ApplicationContext getApplicationContext() {
        return applicationContext;
    }

    /**
     * 设置应用上下文
     *
     * @param applicationContext 应用上下文
     */
    public static void setApplicationContext(ApplicationContext applicationContext) {
        if (SystemListener.applicationContext == null) {
            SystemListener.applicationContext = applicationContext;
        }
    }

    /**
     * @param beanName     名字
     * @param requiredType class类型
     * @param <T>          类
     * @return bean对象
     */
    public static <T> T getBean(String beanName, Class<T> requiredType) {
        return applicationContext == null ? null : applicationContext.getBean(beanName, requiredType);
    }

    /**
     * @param requiredType class类型
     * @param <T>          类
     * @return bean对象
     */
    public static <T> T getBean(Class<T> requiredType) {
        return applicationContext == null ? null : applicationContext.getBean(requiredType);
    }
}

下面就根据不同的规则去实现:

/**
 * 活动规则服务实现类
 */
@Service
@Primary
public class ActivityRuleServiceImpl extends BaseService implements ActivityRuleService {

    private static Log log = LogFactory.getLog(ActivityRuleServiceImpl.class);

    @Override
    public void afterLaunch(Long activityId, String userAccountUuid, Map<String, Object> params) throws BaseException {
        log.info("活动发起完成规则activityId=%s,userAccountUuid=%s,params=%s", activityId, userAccountUuid, params);
        ActivityRuleEnum activityRuleEnum = ActivityRuleEnum.getActivityRuleEnum(activityId);
        if (activityRuleEnum != null) {
            ActivityRuleService activityRuleService = activityRuleEnum.getActivityRuleService();
            activityRuleService.afterLaunch(activityId, userAccountUuid, params);
        }
    }

    @Override
    public int getPraiseCountAfterReward(Long activityId, int praiseCount, Map<String, Object> params) throws BaseException {
        log.info("活动打赏完成规则activityId=%s,praiseCount=%s,params=%s", activityId, praiseCount, params);
        ActivityRuleEnum activityRuleEnum = ActivityRuleEnum.getActivityRuleEnum(activityId);
        if (activityRuleEnum != null) {
            ActivityRuleService activityRuleService = activityRuleEnum.getActivityRuleService();
            return activityRuleService.getPraiseCountAfterReward(activityId, praiseCount, params);
        }
        return praiseCount;
    }
}
/**
 * 默认活动规则服务类
 */
@Service
public class DefaultActivityRuleService implements ActivityRuleService {

    @Override
    public void afterLaunch(Long activityId, String userAccountUuid, Map<String, Object> params) throws BaseException {

    }

    @Override
    public int getPraiseCountAfterReward(Long activityId, int praiseCount, Map<String, Object> params) throws BaseException {
        return praiseCount;
    }
}
/**
 * 感谢信活动规则服务实现类
 */
@Service
public class ThankLetterRuleServiceImpl extends DefaultActivityRuleService implements ActivityRuleService {

    private static Log log = LogFactory.getLog(ThankLetterRuleServiceImpl.class);

    private static final String TYPE_CODE = "userEntryInfo";

    @Autowired
    private UserService userService;

    @Autowired
    private ActivityUserService activityUserService;

    @Autowired
    private ActivityUserDetailService activityUserDetailService;

    @Override
    public void afterLaunch(Long activityId, String userAccountUuid, Map<String, Object> params) throws BaseException {
        log.info("感谢信活动规则");

        // 查询用户的信息
        BaseUser baseUser = userService.getByUserAccountUuid(userAccountUuid);
        Date entryDate = baseUser.getEntryDate();
        if (entryDate == null) {
            log.info("入行日期为空");
            return;
        }

        // 查询活动用户的信息
        BaseActivityUser baseActivityUser = activityUserService.getByUserAccountUuidAndActivityId(userAccountUuid, activityId);

        // 获取当前的年份
        Calendar calendar = Calendar.getInstance();
        calendar.setTime(entryDate);
        int year = calendar.get(Calendar.YEAR);

        // 获取当前相差的天数
        String now = DateUtils.format(DateUtils.YYYY_MM_DD);
        String entryDateString = DateUtils.format(entryDate, DateUtils.YYYY_MM_DD);
        Long subtractMillisecond = DateUtils.getSubtractMillisecond(now, entryDateString, DateUtils.YYYY_MM_DD);
        int day = (int) (subtractMillisecond / (1000L * 60 * 60 * 24));

        // 获取相差的月份并计算百分比
        // Integer month = DateUtils.getSubtractMonth(entryDateString, "1970-01-01", DateUtils.YYYY_MM_DD);
        // Double ratio = DoubleUtils.format(99.99D - month * 0.156);

        // 保存活动用户详情信息
        List<BaseActivityUserDetail> baseActivityUserDetailList = new ArrayList<>();

        // 年份
        long activityUserId = baseActivityUser.getId();
        BaseActivityUserDetail yearUserDetail = getBaseActivityUserDetail(activityUserId, "year", year + "");
        baseActivityUserDetailList.add(yearUserDetail);

        // 天数
        BaseActivityUserDetail dayUserDetail = getBaseActivityUserDetail(activityUserId, "day", day + "");
        baseActivityUserDetailList.add(dayUserDetail);

        // 比率
        String ratio = ThanksLetterRuleFileConfig.getValue(DateUtils.format(entryDate, "yyyy-MM"));
        if (StringUtils.isBlank(ratio)) {
            // 是否早于1970或晚于2017
            if (year < 1970) {
                ratio = "99.99%";
            }
            else if (year > 2017) {
                ratio = "1.88%";
            }
        }
        BaseActivityUserDetail ratioUserDetail = getBaseActivityUserDetail(activityUserId, "ratio", ratio);
        baseActivityUserDetailList.add(ratioUserDetail);
        activityUserDetailService.add(baseActivityUserDetailList);
    }

    @Override
    public int getPraiseCountAfterReward(Long activityId, int praiseCount, Map<String, Object> params) throws BaseException {
        log.info("活动打赏完成规则activityId=%s,praiseCount=%s,params=%s", activityId, praiseCount, params);
        return 0;
    }

    private BaseActivityUserDetail getBaseActivityUserDetail(Long activityUserId, String name, String value) {
        BaseActivityUserDetail result = new BaseActivityUserDetail();
        result.setActivityUserId(activityUserId);
        result.setParamName(name);
        result.setParamValue(value);
        result.setTypeCode(TYPE_CODE);
        return result;
    }
/**
 * 城市大比拼活动规则服务实现类
 */
@Service
public class CityCompetitionRuleServiceImpl extends DefaultActivityRuleService implements ActivityRuleService {

    private static Log log = LogFactory.getLog(CityCompetitionRuleServiceImpl.class);

    @Autowired
    private RankService rankService;

    @Override
    public void afterLaunch(Long activityId, String userAccountUuid, Map<String, Object> params) throws BaseException {
        log.info("城市大比拼活动规则");
        if ((boolean) params.get(Constant.IS_LAUNCH)) {
            rankService.setCityLaunchRank(activityId, userAccountUuid);
        }
    }

}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值