1.需求描述
1.任务体系,任务动态配置
- 任务目前分三大类,每个大类分很多小类。两层树状结构,可以同一张表进行数据管理,通过fatherId进行关联
- 细分规则,进行任务规则管理
2.任务与业务降低耦合度
- 现有业务不受活动影响
- 业务关联可自动化配置关联
- 任务关联个性化返回活动数据
3.任务完成记录信息
- 已经完成任务信息记录
4.对接积分和橙值记录接口
- 用户橙值计算和积分计算的接口要进行对接
5.自定义规则实现
- 提供可配置化的方式,提供动态的规则配置方式
2.设计分析点
2.1 需要考虑的核心点
- 1.任务的抽象化,可配置化
- 2.规则的规范化,特殊规则可以通过自定义类实现,可通过反射类配置实现。
- 3.复杂规则,通过规则引擎的使用
- 4.拦截器统一配置处理任务体系数据
- 5.对接积分和橙长值接口
2.2 基于上面的这些核心点,首先要知道任务配置的数据结构,任务完成的记录结构
任务主表配置结构
- 任务大类和任务分类
- 进行相关排序
- 任务的状态是否有效
- 任务对应“去完成”按钮的跳转路径配置
- 关联的业务的url(这里的作用是解耦具体业务)
任务规则表
- 任务类型:用于区分任务,方便任务缓存及个性化处理
- 通用任务类型
- 会员任务类型
- 个性化任务类型
- 任务时间类型:
- 一次性任务(once):表示只需要完成一次的任务,例如新手任务
- 周期性任务(cycle):表示固定周期内完成制定数量任务,例如:7天一个周期的签到积分
- 永久性任务(persist):表示不受限制的任务
- 任务周期: 表示本任务的计算周期
- 例如,新手任务周期为30天
- 积分任务的周期为7天
- 任务周期单位:可以指定任务的计时单位
- 考核时长(可为空):表示在制定的考核时长
- 考核单位:小时/天/月
- 考核任务完成次数:任务在考核时长中的完成次数
- 例如:积分签到,1天要有1次,且只能一次。则通过限制考核次数和时长进行限制,且7天为一个周期的周期性任务
- 再如:新手任务,考核时长30天,只需要完成1次的1次性任务
- 是否固定模式:
- 用于判断任务是否固定任务,如果固定任务,则取对应积分值和橙长值
- 如果不属于,两种情况,一种是可以直接配置相对复杂的规则表达式,规则引擎执行
- 设计跨越多个业务的,提供了通用接口,实现接口,重写接口方法。通d过反射进行
- 开始日期:考核任务完成的起始时间,结束日期为当前时间
- Today:当天——适用积分任务。。。。当然也要和对应的考核单位进行匹配,如果是小时考核的话,进行小时数匹配
- RegisterDate:注册时间——新手任务
- Now-7:从今天前推N天完成任务情况
- Monday:周一开始到今天
- PastTime:表示往昔的时间中任务完成次数
- 规则表达式
- 规则实现类
任务记录表
记录任务类型和任务完成的具体时间
3.流程设计
3.1 任务规则处理流程
3.2 拦截器任务规则处理逻辑
- 使用postHandler,后置拦截
- 判断url是否需要拦截
- 判断任务是否完成
- 更改响应的response,增加任务体系通用响应参数
4.设计及说明
4.1 任务列表接口设计
接口文档地址:
响应数据格式
{
"errCode": "0",
"errMsg": "成功",
"result": [
{
"id": 1,
"taskName": "新人任务",
"taskCode": "NEW_USER_TASK",
"taskDesc": "新用户注册一个月(30天)任务",
"children": [
{
"id": "2",
"taskName": "关注公众号",
"taskCode": "FLLOW_WECHAT",
"taskDesc": "",
"startTime": "2020-12-01",
"endTime": "2020-12-30",
"totalTask": "1",
"completedTask": "0",
"taskSkipUrlurl:"{\"app\":\"\"/user/info\",\"h5\":\"/app/user/info\"}" -----1.小程序,2.App
"children": []
}
],
"startTime": "2020-12-01",
"endTime": "2020-12-30",
"totalTask": "",
"completedTask": ""
}
]
}
4.2 拦截器处理 及 页面任务列表请求UML
5.数据库设计
drop table if exists t_task_system_detail;
/*==============================================================*/
/* Table: t_task_system_detail */
/*==============================================================*/
create table t_task_system_detail
(
id int not null comment "id",
task_type varchar(10) not null comment "任务类型",
task_name varchar null comment '任务名称',
task_code varchar null comment '任务code',
task_desc varchar(500) null comment "任务描述",
father_id int null comment '父id',
"order" int null comment '顺序',
status varchar null comment '是否有效:0-无效,1有效',
task_cycle_type varchar null comment '任务周期类型:once- 一次性,cycle-周期性,persist-永久性',
task_cycle_time varchar null comment '任务时间,周期性表示周期时间,一次性任务表示任务必须在时间内完成',
task_cycle_time_unit varchar null comment '任务时间戳',
check_time varchar null comment '考核时间',
check_time_unit varchar null comment '考核时间戳',
check_task_num int null comment '考核时间内完成次数考核',
is_normal_pattern varchar null comment '是否正常校验模式:0-否,1是',
start_time_type varchar null comment '考核开始时间类型:now-当天,RegisterDate-注册日期,Now-7从今天往前7天,Monday-周一,PastTime-往昔',
orange_high_level int null comment '非会员橙长值',
points int null comment '非会员积分',
vip_orange_high_level int null comment '会员橙长值' ,
vip_points int null comment '会员积分',
task_skip_url varchar null comment '任务跳转url',
task_relate_url varchar null comment '任务关联url',
rule_press varchar(100) null comment '规则表达式',
rule_class varchar(100) null comment '规则实现类' ,
create_time date null,
create_user varchar null,
update_time date null,
update_user varchar null,
constraint PK_T_TASK_SYSTEM_DETAIL primary key clustered (id)
)ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '任务体系明细表' ROW_FORMAT = Dynamic;
drop table if exists t_task_history;
/*==============================================================*/
/* Table: t_task_history */
/*==============================================================*/
create table t_task_history
(
id int null comment 'id',
task_id int null comment '任务id',
user_id int null comment '用户id',
is_vip char null comment '是否会员:0-不是,1-是',
complete_time date null comment '完成时间',
create_time date null,
create_user int null,
update_time date null,
update_user int null
)ENGINE = InnoDB AUTO_INCREMENT = 13 CHARACTER SET = utf8 COLLATE = utf8_general_ci COMMENT = '用户任务完成明细表' ROW_FORMAT = Dynamic;
6.需求程序开发难点分析
1. 对接已有任务的接口,对接积分计算保存的接口
- 任务数量多,需要关联测试的接口会有十几个
- 对应用户积分保存的接口,需要积分和橙长值接口已经完成
2.任务体系的配置
- 任务数据量比较多
- 可以增加后台配置页面,避免直接数据库操作
3.拦截器模块涉及的内容比较广,也比较重要
- 任务规则,提供通过接口,特殊规则需要自定义实现类进行配置。这一块比较重要,容易出错,所以要化一些时间
- 使用规则引擎 , 整合规则引擎使用
4.数据缓存
- 任务数和用户完成记录缓存