近期项目总结
背景:
对现有的某汽车项目进行改造,把原有写死在业务逻辑里的上下行信息做成可配置的。同时增加项目配置、活动配置、互动配置,用户管理等功能。
实现功能:
互动配置:新增活动后,进行互动行为的配置(需支持多级互动)。
可以把互动行为的配置理解成一个短信问答题的建立:
首先发送一条下行:
诚邀您参加xx有奖问答活动,第一题:请问1+1=? A.1 B.2 C.3 D.不知道...
根据上行判断下一个应该发的信息内容:例
回复B 发下行:第二题,请问2+2=? A.1 B.2 C.3 D.不知道...
如果接到上行 A\C\D则发下行:
感谢您的参与
挺简单的一个流程,对于一个活动有一个互动配置。据此,设计表如下:
autoId | Mo | Mt | actId | pid |
---|---|---|---|---|
id | 上行内容 | 下行内容 | 所属活动ID | 父ID |
读取互动配置,与现有上行处理相结合,匹配下行信息,并根据配置进行下发。
首先, 上行信息包括:spNumber\手机号\流水号\时间. 下行表结构则可根据需求定制.
上行表结构:
id | msgId | spNumber | mobile | subtime | content |
---|---|---|---|---|---|
ID | 流水号 | 上行号 | 手机号 | 上行时间 | 上行内容 |
因为上行无法匹配下行,只能在spNumber里增加5位扩展活动标示
则下行表结构:
id | msgId | spNumber | mobile | subtime | status | node | actId | content | batch |
---|---|---|---|---|---|---|---|---|---|
ID | 流水号 | 下行号 | 手机号 | 下行时间 | 发送结果 | 节点id | 活动id | 下行内容 | 批次号 |
由此,可通过spNumber+手机号取到上行所属活动, 默认匹配最近一条下行, 通过节点id与互动表中活动的pid匹配, 得到互动数据. 既进行到哪层互动环节.
问题: 如果一次下行,对应多次上行时无法对用户上行进行定义.
解决方案: 增加多选功能, 或者增加重置流程代码(例:回复return 从第一条开始回答问题) 待讨论…
至此,可以把互动配置理解成一个森林, 通过actId可找到具体某棵树. 再通过node找到流程进行到树的哪个节点.
定时扫描活动表,到达活动开始时间后对参与活动的用户进行分批次短信下发。
新建活动时, 指定活动开始时间, 发送人群, 每次发送人数, 补发频率等.
活动表结构:
id | name | startDate | sendtime | endDate | count | reSend | status | creatTime |
---|---|---|---|---|---|---|---|---|
id | 活动名称 | 开始日期 | 发送时间 | 结束日期 | 每次发送人数 | 补发频率(间隔第1\2\5天未回复补发) | 活动状态(0-未发布;1-已发布未开始;2-进行中;3-活动结束) | 活动建立日期 |
定时任务,每天扫描活动表, 把状态为1并且开始日期等于当前日期的活动id筛选出来, 根据活动id, 找到发送人群(手机号), 批量插入待发送表中. 同时把活动状态更新为 2-进行中.
待发送表结构:
id | actId | mobile | sendtime | batch | subtime |
---|---|---|---|---|---|
id | 活动id | 手机号 | 发送时间 | 发送批次 | 插入时间 |
每小时扫描活动表, 选出活动状态为2 的活动id 和每次发送人数. 扫描待发送表, 根据活动id\发送时间(小时)等于当前系统时间, 选出发送手机号, 根据每次发送人数进行排序并发送. 发送结果存入下行表中. 发完一条在待发送表中删除一条记录.
对于已到达结束日期的活动:
-
在每天扫描活动表时, 选出活动状态为进行中,并且活动结束日期等于当前日期的活动,将其状态改为3-活动结束. 并在待发送表中删除该活动id.
-
每小时扫描待发送表时,若某活动id的待发送列表为空(当前活动用户已发完),则更新该活动id的活动状态为已结束.
-
手动停止活动时, 删除待发送列表.
定时对未回复用户,根据活动配置信息进行补发。
-
每小时扫描活动表, 选出活动状态为2-进行中的活动id, 扫描下行表中有且只有node为活动根id的用户(可认为未回复), 找到首次下行至当前时间未回复并且时间间隔等于配置的补发频率 的用户手机号. 存入待发送表中. 标示发送批次为首次下发至当前日期间隔天数, 进行接下来的发送.
-
存在问题: 刚存进待发送列表中,这个小时就可能发不了了…
-
解决方案: 写在一个类里, 先扫描补发信息, 存待发送, 再扫描待发送列表进行发送…
难点 & 总结:
-
上下行无法匹配, spNumber如果固定的话不知道回复的是哪条下行. 解决方案根据时间找到最近一条的下行进行匹配. 问题是同一条下行多次上行会出现问题. (尤其是多级互动)
感觉这种情况应该不会出现太多, 在手机短信的TL里, 实际上默认回复行为也是根据最近一条下行的回复. 因为并不存在类似微博的”回复”现象. 而领导要求多条回复都要匹配这种需求就像是大牛曾经说过的”伪需求”. 既不能考虑放弃这部分变态用户, 也不能要求产品提供比较合理的问答设置的情况下, 要么把spNumber写成随机的(感觉用户体验很不好),要么增加多选项. 现在我还在坚持固定spNumbner…
-
对于活动开始的触发和定时批量发送短信,以及补发.
开始想想觉得挺难的, 后来把表结构和思路整理了一下, 虽然觉得还是挺难的, 但是至少想出了解决方案. 其他的具体开发的时候再说吧…