我正在参加「启航计划」

前语

继上一篇积分收取&耗费&收回 之后, 基本上就能满足大部分公司的事务需求了; 但是, 还有有部分公司事务可能会涉及到冻住&解冻(比方金融交易公司), 再配合上收回能够说处理杂乱度又上了一层;

结构规划

接口仍是继续沿用之前的规划, 只需要增加对应枚举即可;

用户积分key(redis)

积分为了确保功能用redis的hash进行存储, 每个用户一个key, 保护可用积分, 冻住积分, 可用相关的流水以及总收取积分数的状态;


IntegralInfo struct {
  Available       int64           `json:"available"`       // 可用
  AvailableStream []*IntegralItem `json:"availableStream"` // 可用流水
  Total           int64           `json:"total"`           // 总收取
	Frozen          int64           `json:"frozen"`          // 冻住
}
IntegralItem struct {
  StreamId  uint             `json:"streamId"`  // 流水Id
  TaskId    string           `json:"taskId"`    // 使命Id
  Available int64            `json:"available"` // 可用
  OutTime   int64            `json:"outTime"`   // 过期时间
  Frozen    map[string]int64 `json:"frozen"`    // 冻住积分数
}

耗费功用

需求

  1. 答应多端多点一起进行积分运用;
  2. 实时进行抵扣, 不答应后置;
  3. 删去redis中无效的可用流水(含有冻住的保留);
  4. 不影响当前的功能;

流程图

手摸手教你写任务中心-积分冻结&解冻&消耗

冻住功用

需求

  1. 答应多端多点一起进行积分冻住;
  2. 积分冻住期间不触发收回;
  3. 冻住的积分不可再被运用;

流程图

手摸手教你写任务中心-积分冻结&解冻&消耗

解冻功用

需求

  1. 单笔冻住积分悉数解冻;
  2. 解冻后如果过期则直接触发收回;
  3. 解冻后未过期则康复可用;

流程图

手摸手教你写任务中心-积分冻结&解冻&消耗

冻住扣除功用

需求

  1. 单笔冻住积分悉数扣除(不处理过期);
  2. 删去redis中无效的可用流水;

流程图

手摸手教你写任务中心-积分冻结&解冻&消耗

结语

至此应该便是整体的使命中心积分逻辑了, 暂时想不到更杂乱的场景了, 大家有什么更杂乱的需求能够提出来一块讨论一下, 或者有什么功能更优的处理计划欢迎共享;