Skip to content

月度考核业务逻辑

摘要

#大纲项一句话表达
1一、核心目标30天内完成规定去平业绩的P5/P6/P7用户获得团队收益,否则停发以激励产能提升。
2二、核心概念P5/P6/P7分别需完成≥1500/3500/7000 USDT新增去平业绩,以支付时间计30天为一个周期。
3三、月度考核执行流程日均执行的脚本查询待考核用户,统计去平业绩,与标准比对后判定通过/未通过并存储结果。
4四、升级时的考核处理升级用户自动通过当期考核,重置新等级的新周期;V8+无需考核则删除周期记录。
5五、团队收益发放中的考核应用普通用户无需考核,V8/V9必发,P5/P6/P7需通过当期月度考核才能发放团队收益。
6六、业务流程时间线Day 0升级开始30天周期,Day 31结算判定,Day 31-59为延期期继续考核,Day 60进入下一周期。
7七、多次考核与失败处理未通过在29天延期期内可继续考核累积失败次数,超期进入新周期重新开始,升级会中断当期并重置周期。

一、核心目标

月度考核是针对P5/P6/P7等级用户(Level=2/3/4)的收益激励制度

核心逻辑:用户需要在30天内完成一定金额的新增去平业绩,才能获得团队收益;否则停发团队收益以激励产能提升。

考核结果后续处理
考核通过用户可以正常获得团队收益 ✓
考核未通过用户停发团队收益,激励产能提升 ✗

二、核心概念

用户等级与考核标准

等级代码名称考核要求说明
1Level=1普通用户不需考核
2Level=2P5新增去平业绩 ≥ 1500 USDT需月度考核
3Level=3P6新增去平业绩 ≥ 3500 USDT需月度考核
4Level=4P7新增去平业绩 ≥ 7000 USDT需月度考核
5Level=5V8不需考核,必发
6Level=6V9不需考核,必发

考核周期的时间点

考核周期为30天,包含以下关键时间节点:

时间点含义说明
kaohe_start考核周期开始升级当天0点或下一周期开始
kaohe_end考核周期结束start + 30天(统计截止)
kaohe_oper_start结算判定时间等于kaohe_end,第31天开始执行考核脚本
next_pre_start下期预计开始若本期通过,进入新周期
next_pre_end下期预计结束下期周期的结束时间

考核标准对照(基于 month_delta):

  • P5 (Level=2):≥ 1500 USDT
  • P6 (Level=3):≥ 3500 USDT
  • P7 (Level=4):≥ 7000 USDT

时间线示意:

Day 0(升级当天)
  ↓ 初始化 30 天考核周期
Day 1-30(考核周期内)
  ↓ 统计去平业绩
Day 31(结算日)
  ↓ 执行考核脚本 → 判定通过/未通过
Day 31+(进入新周期或延期)

去平业绩的定义

去平指在关系链中等级上升的节点。统计规则如下:

  1. 直接去平:下单人的直推上级等级 < 下单人等级 → 该上级为去平角色,其订单计入考核业绩

  2. 直推人必算:即使直推人等级不高,其作为直推人身份,下单金额也计入被推荐人的考核业绩

  3. 统计范围

    • 只统计 gid=2 或 3(新增理财hash交易订单)
    • 时间范围:kaohe_start ≤ pay_time < kaohe_end
    • 支付状态:state=2(已支付)、status=1(启用)、expired=1(未过期)

三、月度考核执行流程

执行时机

  • 每日 00:00 执行(Crontab)
  • 命令php yii invest/month-kaohe/do
  • 日志backend/web/logs/console/invest-month-kaohe-console.log

执行步骤

Step 1:获取待考核用户

查询符合以下条件的用户:

  • kaohe_oper_start ≤ 当前时间(已到考核结算时间)
  • status = 1(考核周期有效)
  • level IN (2,3,4)(P5/P6/P7用户)

输出统计:考核系统总人数、本期实际考核用户数、每个用户的考核周期范围。

Step 2:查询有效订单

建立有效订单映射表(基础数据):

  • 游标分页查询 FtgInvestJoinOrder(每批2000条)
  • 过滤条件:state=2、status=1、expired=1、person_stage<364、gid IN(2,3)

Step 3:统计去平业绩

对每个升级订单执行以下逻辑:

  1. 验证 order_id 是否在有效订单集合中
  2. 解析 all_relations 关系链
  3. 遍历关系链中的每个节点,判断是否为去平角色
  4. 累加去平业绩(使用 bcadd,保留6位小数)

核心算法:基于 all_relations 链的等级逐层比对,找出真正产生等级提升的节点。

Step 4:结果判定

将统计的去平业绩与考核标准比对:

等级标准金额结果
P5(L=2)≥ 1500 USDT通过(pass=2) / 未通过(pass=1)
P6(L=3)≥ 3500 USDT通过(pass=2) / 未通过(pass=1)
P7(L=4)≥ 7000 USDT通过(pass=2) / 未通过(pass=1)

使用 bccomp(考核业绩, 标准金额, 6) 进行精确比较。

Step 5:结果存储

  1. 写入 FtgInvestJoinNewP567kaohe 表(考核结果)
  2. 写入 FtgInvestJoinNewP567kaohePeriodLog 表(历史日志)
  3. 更新 FtgInvestJoinNewP567kaohePeriod 表(周期主表)

Step 6:执行统计

输出以下统计信息:

考核系统用户总人数 / 有效用户人数
本期实际考核用户数
实际通过人数 / 实际未通过人数
本次执行时间(秒)
有效订单总数
关系链订单总数
CPU计算次数

按等级分类(P5/P6/P7):
  - 考核人数
  - 通过人数
  - 未通过人数

四、升级时的考核处理

业务逻辑

当用户因业绩达标而升级时:

  1. 入口FtgInvestUpgradeService::updateYejiAndUpgrade()
  2. 流程:批量计算用户等级并执行升级
  3. 触发:对升级用户调用 MonthKaoheService::upgradeUserMonthKaohe()
  4. 结果:重置考核周期、设置新的考核目标

升级路径与处理方式

路径1:普通用户升至P5(1→2)

初始化新的30天考核周期:

kaohe_start = 今天0点
kaohe_end = 今天0点 + 30天
kaohe_oper_start = kaohe_end
next_pre_start = kaohe_end
next_pre_end = next_pre_start + 30天
pass = 1(初始状态:未通过)

意义:新获得P5资格的用户获得第一个30天的考核周期。

路径2:P5升至P6 或 P6升至P7(2→3 或 3→4)

处理三个步骤:

  1. 备份当期:将当前周期备份到历史日志表,标记 pass=2(因升级通过)
  2. 重置周期:创建新等级的新周期,重新30天
  3. 更新结果表:设置考核结果表 pass=2

意义:

  • 升级优先级高于考核周期(即使考核未结束也可升级)
  • 升级自动通过当期考核(鼓励产能提升)
  • 进入新等级后重新开始30天考核周期

路径3:P7升至V8(4→5)

处理三个步骤:

  1. 备份当期:将当前周期备份到历史日志表,标记 pass=2(因升级通过)
  2. 删除周期记录:删除 FtgInvestJoinNewP567kaohePeriod 记录
  3. 更新结果表:设置考核结果表 pass=2

意义:

  • V8及以上用户不需要月度考核
  • 享受终身分润发放权利
  • 删除周期记录,不再需要考核管理

五、团队收益发放中的考核应用

执行时机

  • 每天 07:00 执行(Crontab)
  • 命令php yii invest/income-team/send
  • 日志backend/web/logs/console/invest-income-team-console.log

发放条件判定逻辑

等级5、6(V8/V9)

条件:无需考核 行为:必发团队收益 ✓

等级1(普通用户)

检查项目(不检查业绩,不检查月度考核):

检查项条件失败原因
有效订单state=2, status=1, expired=1, person_stage<days无订单 ✗
业绩标准无要求跳过 ✓
月度考核无要求跳过 ✓
分润开关t_in == 2关闭 ✗

判定结果:有效订单和分润开关都通过 → 发放 ✓;任一项未通过 → 停发 ✗

等级2、3、4(P5/P6/P7)

优先检查:是否在免考核期?

  • YES → 直接发放 ✓
  • NO → 进行四项检查

四项检查内容:

检查项条件失败原因
有效订单state=2, status=1, expired=1, person_stage<days无订单 ✗
业绩标准个人/团队业绩符合等级要求不符 ✗
月度考核MonthKaoheService::isMonthKaohePass()=true未通过 ✗
分润开关t_in == 2关闭 ✗

判定结果:四项全部通过 → 发放 ✓;任一项未通过 → 停发 ✗

停发原因分类

对于P5/P6/P7用户,停发的四个主要原因:

原因代码原因描述说明
1无订单用户没有有效订单
2业绩不符个人或团队业绩未达标
3月度考核考核未通过(考核机制体现)
4分润开关用户关闭了分润

六、业务流程时间线

完整的30天周期流程

Day 0(升级当天)
├─ 订单支付成功
├─ 业绩累计 → 触发升级判断
├─ FtgInvestUpgradeService::updateYejiAndUpgrade()
└─ MonthKaoheService::upgradeUserMonthKaohe()
   ├─ 初始化考核周期
   ├─ kaohe_start = 今天0点
   ├─ kaohe_end = 今天0点 + 30天
   └─ kaohe_oper_start = kaohe_end

Day 1-29(考核周期内)
└─ 用户在关系链中产生的订单 → 统计为"去平业绩"

Day 30(考核周期结束)
└─ 这是最后统计去平业绩的一天

Day 31(结算日,关键时刻)
├─ 00:00 执行考核脚本 → MonthKaoheController::actionDo()
│  ├─ 查询条件:kaohe_oper_start ≤ 当前时间
│  ├─ 统计用户考核周期内的去平业绩
│  ├─ 与标准比对
│  └─ 写入考核结果(pass=1 or pass=2)

├─ 07:00 执行团队收益发放 → IncomeTeamController::actionSend()
│  ├─ MonthKaoheService::isMonthKaohePass($uid)
│  ├─ 查询考核结果
│  └─ 判断是否发放团队收益

└─ 用户进入新的30天考核周期(next_pre_start)

Day 32-60
└─ 下一个考核周期的进行

Day 60-61
└─ 下一个考核周期的结算

关键时间数学关系

时间段说明
Day 0 - Day 30第1个考核周期(30天)
Day 31 - Day 59延期考核期(29天,机会期)
Day 60+第2个考核周期开始
总计Day 0-59共59天

七、多次考核与失败处理

考核通过的流程

触发条件:用户去平业绩 ≥ 考核标准

处理步骤:

  1. 更新考核结果表

    • FtgInvestJoinNewP567kaohe.pass = 2
  2. 备份当期周期到历史日志

    • FtgInvestJoinNewP567kaohePeriodLog
    • pass = 2(通过)
    • pass_end = 当前日期
    • detail = 本期考核详情
  3. 重置为下一个周期

    • kaohe_start = 通过当天0点(可能小于30天)
    • kaohe_end = next_pre_end(下期计划结束)
    • kaohe_oper_start = kaohe_end(下次结算时间)
    • fail_cnt = 0(重置失败次数)
    • pass = 1(新周期重置为未通过)

考核未通过的两种情况

情况1:延期考核期内(Day 31-59)

触发条件

  • 去平业绩 < 考核标准
  • 距离 kaohe_oper_start < 29天
  • 用户仍有继续考核的机会

处理方式

pass = 1(保持未通过)
fail_cnt += 1(失败次数+1)
today_kaohe_detail = 本次考核数据

结果

  • 用户继续处于 pass=1 状态
  • MonthKaoheService::isMonthKaohePass() 返回 false
  • 团队收益继续停发
  • 等待下一个考核日期重新考核

示例数据变化

时间fail_cnt状态发放
Day 311第一次未通过停发 ✗
Day 402第二次未通过停发 ✗
Day 503第三次未通过停发 ✗
Day 604第四次未通过 → 进入情况2停发 ✗

情况2:已超过29天延期期(Day 60+)

触发条件

  • 去平业绩 < 考核标准
  • 距离 kaohe_oper_start ≥ 29天
  • 已给足30+29=59天的机会,必须进入新周期

处理方式

Step 1:备份到历史日志表
  pass = 1(最终未通过)
  pass_end = 0(不设置通过时间,表示未通过)
  detail = 最后一次考核数据

Step 2:重置周期进入下一个循环
  level = 当前等级(保持)
  pass = 1(重置为未通过)
  fail_cnt = 0(重置失败次数)
  kaohe_start = 今天0点
  kaohe_end = next_pre_end(原计划的下期结束)
  next_pre_end += 30天(继续推进)
  today_kaohe_detail = [](清空本期详情)

结果

  • 第1个考核周期正式关闭,进入历史
  • 用户进入第2个考核周期
  • 仍然是 pass=1 状态,需要新一轮通过考核
  • 用户获得新的30天机会

升级中断考核的处理

场景:用户在考核周期内或延期期间升级

处理逻辑:根据升级路径,升级会中断当前考核周期

升级路径处理方式
1→2(普通→P5)创建新的30天周期,pass=1
2→3(P5→P6)备份当期到日志(pass=2),创建新周期
3→4(P6→P7)备份当期到日志(pass=2),创建新周期
4→5(P7→V8)备份当期到日志(pass=2),删除周期

结果:升级用户自动通过当期考核,进入新等级的新周期。

考核逻辑决策树

执行考核脚本 actionDo()

  ├─ 查询待考核用户
  ├─ 统计去平业绩
  └─ 调用 updateUserKaoheRes() 处理结果

      ├─ 考核通过?(pass=2)
      │  ├─ YES → 【通过逻辑】
      │  │  ├─ 更新考核结果表:pass=2
      │  │  ├─ 备份到历史日志:pass=2, pass_end=当前日期
      │  │  └─ 重置为下一周期:fail_cnt=0, pass=1
      │  │
      │  └─ NO → 【未通过逻辑】
      │     │
      │     ├─ 距离 kaohe_oper_start < 29天?
      │     │  ├─ YES → 【情况1:延期考核】
      │     │  │  ├─ pass = 1
      │     │  │  ├─ fail_cnt += 1 🔴
      │     │  │  ├─ today_kaohe_detail = 本次数据
      │     │  │  └─ 等待下一个考核日
      │     │  │
      │     │  └─ NO → 【情况2:进入新周期】
      │     │     ├─ 备份到历史日志:pass=1, pass_end=0
      │     │     ├─ 重置周期:fail_cnt=0, pass=1
      │     │     ├─ kaohe_start = 今天0点
      │     │     ├─ kaohe_end = next_pre_end
      │     │     └─ next_pre_end += 30天
      │     │
      │     └─ 更新考核结果表:pass=1(无论哪种情况)

文档版本:v2.0
简化说明:精简了原文档结构,保留核心业务逻辑,便于快速理解和查阅
更新日期:2026-05-29