关于积分过期的设计思路方案(原创)

  1. 业务需要 会生成 各种 过期方式的 积分权益。 过期方式有 1:无限 2:某一天过期 3:领取后多少天过期 。

  2. 一个人同时存在多种类型的积分。可能每天都存在过期 。
    这里可以得出 每天都要有批量处理才行,并且同一用户可能一天要过期多种类型的积分。
    多种类型积分过期 : 又可以往上追溯了 多种类型积分 都用了多个呢 -》 进而联想到 当用户在消耗积分时 是不是应该拆分订单
    =》 如何拆分订单 =》用户在商城购买积分时会生成订单 =》
    订单存在几种付款方式 情况 1. 全金额 唤起支付接口 那么就跟积分无关了
    情况 2. 部分积分 部分金额 需暂时扣减积分 然后唤起支付 (这里订单积分,库存校验 不做详细叙述)
    情况 3. 全积分
    其中2.3 订单使用积分情况拆分 =》 思路按发分流水这个颗粒度出发,因为这样才可以追溯 每一次的积分发分
    ,使用,以及每一笔的剩余积分,过期积分。
    为辅助理解 表结构:
    订单积分拆分表
    create table o_score_order_detail (
    detailNo varchar2(16) comment ‘拆分流水号’,
    jnlNo varchar2(16) comment ‘积分流水号’,
    orderId varchar2(64) comment ‘订单号’,
    consumeScore Number(12,2) comment ‘消耗积分数额’,
    trsTime varchar2(64) comment ‘交易时间’,
    source varchar2(16)comment ‘来源’,
    primarykey(detailNo)
    );
    积分流水表(这里去掉了一些业务字段 方便解读)
    create table O_SCORE_TRSJNL
    (
    JnlNo numeric(20) not null comment ‘流水号’,
    PersonSeq INT NULL,
    TrsTime datetime not null comment ‘交易时间’,
    TrsScoreType varchar(8) not null,
    TrsScore decimal(17,2) not null comment ‘交易积分数’,
    TrsFlag varchar(1) comment ‘0:加积分 1:减积分 2 过期’,
    TrsState varchar(1) not null comment ‘0:初始 S:成功 F;失败’,
    TrsErrorCode varchar(32) comment ‘错误码’,
    primary key (JnlNo)
    );
    拆分方式步骤如下:

    				1: 查询当前消费用户  积分流水 关联 积分拆分表  可以查出每笔流水剩余积分。有多少条方法流水就有多少结果数据
    				2.  注意排序  遵循拟定的积分使用规则  消耗过的先用,先过期先用,积分小的先用。
    				3.   循环这些流水list集合在用本次订单积分 !减去!剩余积分,直至到 本次订单积分 为0 。
    				4.  将循环中 每个流水减去的积分 加上jnlno 放入map  在将map  放入新的list中。在批量插入到o_score_order_detail表中。
    				在情况2 中  可能回出现支付失败,失败情况 在拆分中  根据失败回调批量中 会删除掉这些失败的积分拆分表(后面再做详细说明)
    

=》拆分也有了 是否数据准备完全了 可以直接过期分了呢 =》 考虑到积分过期一般是在次日00:00:00 这时候程序在处理过期积分中ing,
用户看到自己积分并未过期还可以使用(发生脏读) =》 所有既要保证功能正常运行,也要保证数据的一致性 =》过期积分也得提供一个临时表
临时表 明过期积分表 在过期跑完之后 更新这个表
create table O_USER_SCORE_INVALID_TEMP
(
PersonSeq numeric(20) not null comment ‘用户标识’,
ExirpedScore decimal(17,2) not null comment ‘过期积分数’,
ExirpedTime varchar(32) comment ‘失效时间’,
OnExirpedFlag char(1) deafual ‘0’ comment ‘0:过期未清算完成 1:过期已清算完成’,
primary key (PersonSeq,ExirpedTime)
);
1临时表作用就是结果上述问题
2 相应修改 积分余额查询 关联 临时表 当前时间= 失效时间 OnExirpedFlag =0 时 用户看到积分余额= 实际积分 -ExirpedScore;
3 用户在今天用户明日过期的分呢 这里 也做了相应的修改 明过期积分表 ExirpedScore 的值。
具体就是下单的情况2,3 都会 判断有无明日过期积分 然后 执行上面的第三部
只是 2 特殊一些 需要在订单状态批量轮询中(公司业务 可以理解为支付回调)
如果成功,是需要补充一部分表数据的(因为情况2 是欲扣分,只记了拆分流水)
如果失败,是需要如下步骤:
1.根据订单号查询订单成分组成 来自哪个流水。
2.获取流水失效时间与当前时间做对比判断
3 失效时间 = 当前时间 既明日过期 明日过期记录到 O_USER_SCORE_INVALID_TEMP
失效时间 > 当前时间 既未过期 不处理(积分回退已在业务代码中判断失败就执行了)
失效时间 < 当前时间 既已过期 (扣减掉过期积分) 然后再写入积分流水表O_SCORE_TRSJNL中TrsFlag =2
=》 数据铺垫完成 =》执行过期流程
1.查出发分流水的积分权益中 失效时间 =当前时间 剩余过期积分 = 发分积分 -使用积分 得出剩余流水过期分数数据
2.剩余流水过期分数数据 进行 拆分成多条 根据数据数量决定,线程池统一由TaskExecutor来管理
3. 多线程+lock 执行用户积分余额修改+生成过期流水
4 业务中 包含待发积分(待发放积分过期 同1 但是不需要扣减积分,只需将o_score_trsjnl_temp表数据状态改为2 过期状态)
=》执行完调用下个 明过期积分表 数据更新
1.找出明日过期数据
2.删除今日过期数据
3.批量 update 接收值 =0 则insert

  • 3
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值