ai_member_xiaoxi/skills/vala-order-amortization-stat/SKILL.md
2026-04-23 08:00:02 +08:00

9.1 KiB
Raw Blame History

SKILL.md - vala-order-amortization-stat 订单均摊结算统计技能

技能描述

用于统计指定账期内的订单均摊收入、退费冲销,按天计算均摊金额,支持部分退费场景的剩余金额和周期自动计算。

触发场景

当用户提到以下关键词组合时激活本技能:

  1. 订单均摊、按天均摊、收入均摊
  2. 账期结算、月度结算、季度结算
  3. 退费冲销、部分退款均摊

前置依赖

  1. 已连接线上PostgreSQL数据库 vala_bi 库
  2. 依赖表:
    • bi_vala_order订单主表
    • bi_refund_order退费订单表
    • bi_vala_seasonal_ticket季卡周期表
    • bi_vala_app_account用户账户表用于剔除测试账号
  3. 表关联规则:
    • bi_vala_order.trade_no ↔ bi_refund_order.trade_no 关联
    • bi_vala_order.out_trade_no ↔ bi_refund_order.out_trade_no 关联

操作流程

步骤1确认核心参数

执行前必须向用户确认以下参数:

  • 账期起始日期格式YYYY-MM-DD
  • 账期结束日期格式YYYY-MM-DD
  • 默认输出维度:账期整体汇总,无需按天/周/月拆分,无需分渠道统计

步骤2数据过滤规则

  1. 订单范围:
    • 2025-09-01 至 账期结束日 内创建的所有订单
    • bi_vala_order.status IN (3,4)(已完成、已退款订单)
    • 订单实际支付金额≥10元bi_vala_order.pay_amount_int ≥ 1000单位
    • 关联bi_vala_app_account表仅保留bi_vala_app_account.status = 1的非测试账号订单
  2. 退费范围:
    • 退费完成时间落在账期内的所有退款成功记录判定条件bi_refund_order.updated_at退款处理完成时间在账期起止时间范围内
    • bi_refund_order.status = 3退款处理完成
  3. 账期前退费订单处理规则:
    • 退费完成时间在账期起始日之前的订单,不会纳入本账期的冲销逻辑:
      • 全额退费订单:冲销动作已在退费发生的对应账期执行完毕,本账期完全不统计该订单的任何数据
      • 部分退费订单:冲销动作、剩余金额/剩余周期调整已在退费发生的对应账期完成,本账期仅按调整后的剩余金额计算均摊,不产生额外冲销金额

步骤3核心计算逻辑

3.1 周期计算

  • 每个订单的总均摊周期 = bi_vala_seasonal_ticket中同一order_no下status != -1的不同id数量 × 90天
  • 转正日期规则试用期7天包含下单日
    • 均摊起始日(转正日期)= 订单下单日 + 7天下单日取bi_vala_order.created_at的日期部分
    • 示例4月22日下单4月29日00:00:00为转正日即均摊起始日
  • 税率规则:
    • 订单下单时间在2026年5月1日之前税率1%
    • 订单下单时间在2026年5月1日及之后税率6%
    • 订单税后金额 = (bi_vala_order.pay_amount_int / 100) × (1 - 税率)(单位:元)
    • 订单税费金额 = (bi_vala_order.pay_amount_int / 100) × 税率(单位:元)
  • 均摊规则更新:所有均摊计算均基于税后金额进行,含税金额和税费单独统计
    • 日均摊金额(税后)= 订单税后金额 / 总均摊周期
    • 🔹 周期最后一天补差规则:订单均摊周期的最后一天,均摊金额不按日均摊计算,采用补差方式确保总额完全匹配:
      • 正常订单:最后一天均摊金额 = 订单税后总金额 - 前(总均摊周期-1天累计已均摊金额
      • 部分退费订单:最后一天均摊金额 = 订单剩余税后金额 - 剩余均摊周期前(剩余天数-1天累计已均摊金额 避免浮点精度导致的金额尾差

3.2 退费场景计算

所有退费冲销金额均为税后金额,税费同步对应冲销

  1. 所有退费订单(全额/部分)通用计算
    • 历史退费订单冲销均摊金额从2026年9月1日起至账期起始日之前该订单已产生的全部税后均摊金额统一显示为负数用于冲销
    • 历史退费订单冲销税费金额:上述历史均摊金额对应的税费(统一显示为负数,用于冲销)
  2. 全额退费bi_refund_order.refund_type = 2:无需额外计算补充均摊,仅执行上述通用冲销逻辑
  3. 部分退费bi_refund_order.refund_type = 3:在通用冲销逻辑基础上,额外计算:
    • 历史部分退费订单补充均摊金额:部分退费后剩余的待均摊税后金额,在本账期内产生的均摊收入
    • 历史部分退费订单补充税费金额:上述补充均摊金额对应的税费

3.3 账期内收入计算

账期内总收入 = 账期内所有正常订单的日均摊金额总和 + 账期内所有退费冲销金额总和

核心SQL模板

-- 步骤1获取所有符合条件的订单基础信息
WITH order_base AS (
  SELECT 
    o.id AS order_id,
    o.order_no,
    o.pay_amount_int / 100 AS pay_amount,
    -- 计算税率、税费、税后金额
    CASE WHEN DATE(o.created_at) < '2026-05-01' THEN 0.01 ELSE 0.06 END AS tax_rate,
    (o.pay_amount_int / 100) * CASE WHEN DATE(o.created_at) < '2026-05-01' THEN 0.01 ELSE 0.06 END AS tax_amount,
    (o.pay_amount_int / 100) * (1 - CASE WHEN DATE(o.created_at) < '2026-05-01' THEN 0.01 ELSE 0.06 END) AS after_tax_amount,
    DATE_ADD(DATE(o.created_at), INTERVAL 7 DAY) AS amortization_start_date,
    o.status AS order_status,
    a.id AS account_id,
    o.key_from,
    o.sale_channel
  FROM bi_vala_order o
  JOIN bi_vala_app_account a ON o.account_id = a.id
  WHERE 
    o.created_at >= '2025-09-01'
    AND o.status IN (3,4)
    AND o.pay_amount_int >= 1000
    AND a.status = 1
),
-- 步骤2计算每个订单的总均摊周期
order_cycle AS (
  SELECT 
    order_no,
    COUNT(DISTINCT id) * 90 AS total_cycle_days
  FROM bi_vala_seasonal_ticket
  WHERE status != -1
  GROUP BY order_no
),
-- 步骤3获取账期内的退费记录
refund_records AS (
  SELECT 
    r.out_trade_no AS order_no,
    CAST(r.refund_amount AS NUMERIC) / 100 AS refund_amount,
    r.refund_type,
    DATE(r.updated_at) AS refund_date
  FROM bi_refund_order r
  JOIN order_base o ON r.out_trade_no = o.order_no
  WHERE 
    r.status = 3
    AND r.updated_at BETWEEN '${账期起始日}' AND '${账期结束日}'
)
-- 后续按需求聚合维度计算日均摊金额和冲销金额

输出格式

  1. 优先输出Excel报表存放于output/目录下,命名格式:订单均摊结算报表_${账期起始日}_${账期结束日}.xlsx
  2. 报表包含以下Sheet
    • 汇总表:订单数、正式订单数、试用订单数、冲销前税费、冲销税费、补充税费、冲销后税费、冲销前均摊金额、冲销均摊金额、补充均摊金额、冲销后均摊金额
    • 订单明细:订单号、订单金额、税率、税额、税后金额、总均摊周期、已均摊天数、历史均摊金额、账期均摊金额、未确认收入、剩余周期
  3. 文字回复核心指标:

    📊 账期${账期起始日}至${账期结束日}均摊结算结果: 总订单数XXX单 正式订单数XXX单 试用订单数XXX单 冲销后税费XXX元 冲销后均摊金额税后净收入XXX元

汇总指标计算逻辑(所有均摊金额均为税后金额)

  1. 订单数:账期内(下单日落在账期起止时间范围内)新增的所有符合条件的订单总数量
  2. 正式订单数账期内新增的订单中截止账期结束日已过7天试用期下单日+7天 ≤ 账期结束日)的订单数量,仅正式订单开始参与均摊计算
  3. 试用订单数账期内新增的订单中截止账期结束日仍处于7天试用期内下单日+7天 > 账期结束日)的订单数量,试用订单未开始均摊,不参与金额计算
  4. 冲销前税费:账期内所有正式订单的含税订单总金额 × 各订单对应税率 的总和
  5. 冲销税费:本账期内发生退费的所有订单的含税订单总金额 × 各订单对应税率 的总和(正数展示,计算时扣除)
  6. 补充税费:本账期内发生部分退费的订单,退费后剩余的含税订单金额 × 各订单对应税率 的总和,其中:部分退费订单剩余含税金额 = 原订单含税金额 - 退费含税金额
  7. 冲销后税费:账期内最终确认的总税费,计算公式:冲销后税费 = 冲销前税费 - 冲销税费 + 补充税费
  8. 冲销前均摊金额(税后):历史未退费订单 + 账期内正式订单 在本账期内产生的税后均摊收入总和
  9. 冲销均摊金额(税后):本账期内发生退费的所有订单,需要冲销的历史均摊金额总和(正数展示,计算时扣除)
  10. 补充均摊金额(税后):本账期内发生部分退费的订单,从转正日起至账期最后一日产生的税后均摊金额总和
  11. 冲销后均摊金额(税后):账期内最终确认的税后净收入,计算公式:冲销后均摊金额 = 冲销前均摊金额 - 冲销均摊金额 + 补充均摊金额

注意事项

  1. 所有金额保留2位小数百分比保留1位小数
  2. 部分退费场景需确保bi_vala_seasonal_ticket中对应退费部分的status已更新为-1
  3. 自动剔除测试账号,无需额外过滤
  4. 冲销金额统一显示为负数