style: auto-format with black + isort + ruff + prettier [skip ci-format-check]
CI/CD Pipeline / Check if frontend-only change (pull_request) Successful in 2s
CI/CD Pipeline / Dedup Check - skip PR tests when covered by push pipeline (pull_request) Successful in 5s
CI/CD Pipeline / PR Build API Image (pull_request) Successful in 47s
CI/CD Pipeline / PR Build Worker Image (pull_request) Successful in 47s
Preview Deploy / Deploy Preview Environment (pull_request) Successful in 1m7s
PR Automation / Auto Approve on CI Green (pull_request) Successful in 3m5s
CI/CD Pipeline / Integration Tests (pull_request) Successful in 3m31s
CI/CD Pipeline / Validate - Python (mypy + alembic) (pull_request) Successful in 3m42s
CI/CD Pipeline / Validate - Style (pull_request) Successful in 4m40s
AI Code Review / AI Code Review (pull_request) Successful in 6m33s
CI/CD Pipeline / Validate - Security (pull_request) Successful in 7m51s
CI/CD Pipeline / Unit Tests (pull_request) Successful in 11m50s
CI/CD Pipeline / CI Gate (pull_request) Successful in 5s
CI/CD Pipeline / Production Browser E2E (pull_request) Has been skipped
PR Automation / Auto Merge on CI Green + Approved (pull_request) Successful in 8m23s
ACR Cleanup / ACR Image Cleanup (pull_request_target) Successful in 52s
Preview Cleanup / Cleanup Preview Environment (pull_request) Successful in 1m5s
CI/CD Pipeline / Build Production Web Image (pull_request) Failing after 6h6m56s
CI/CD Pipeline / Staging API Integration Tests (pull_request) Failing after 6h18m35s
CI/CD Pipeline / Retag skipped Staging Web Image (pull_request) Failing after 6h18m44s
CI/CD Pipeline / Deploy Production (pull_request) Failing after 6h6m0s
CI/CD Pipeline / PR Build Web Image (pull_request) Failing after 6h17m56s
CI/CD Pipeline / Frontend Unit Tests (pull_request) Failing after 6h17m57s
CI/CD Pipeline / Deploy Staging (Watchtower auto-deploy) (pull_request) Failing after 6h17m47s
CI/CD Pipeline / Retag skipped Staging Worker Image (pull_request) Failing after 6h17m50s
CI/CD Pipeline / Retag skipped Staging API Image (pull_request) Failing after 6h17m52s
CI/CD Pipeline / Build Staging Worker Image (pull_request) Failing after 6h17m54s
CI/CD Pipeline / Build Staging Web Image (pull_request) Failing after 6h17m54s
CI/CD Pipeline / Build Staging API Image (pull_request) Failing after 6h17m55s
CI/CD Pipeline / Check push changed paths (pull_request) Failing after 6h18m2s
CI/CD Pipeline / Build Production Worker Image (pull_request) Failing after 6h6m4s
CI/CD Pipeline / Canary Release to Production (pull_request) Failing after 6h5m59s
CI/CD Pipeline / Build Production API Image (pull_request) Failing after 6h6m4s
CI/CD Pipeline / ACR Image Cleanup (pull_request) Failing after 6h17m43s
CI/CD Pipeline / Staging E2E Tests (pull_request) Failing after 6h17m44s
CI/CD Pipeline / Frontend Lint (pull_request) Failing after 6h17m57s

This commit is contained in:
CI Bot
2026-09-16 01:04:43 +00:00
parent 1b8209bd06
commit 7ab8d4b8e8
4 changed files with 41 additions and 8 deletions
+1 -1
View File
@@ -36,9 +36,9 @@ from fastapi import APIRouter, Depends, HTTPException, Query
from sqlalchemy.orm import Session
from packages.domain.points_rules import (
MEMBERSHIP_PRICES,
FREE_USER_MULTIPLIER,
MEMBER_DISCOUNT,
MEMBERSHIP_PRICES,
POINTS_PACKAGES,
POINTS_SCENES,
calculate_points_cost,
+3 -1
View File
@@ -142,7 +142,9 @@ class PointsOrderResponse(BaseModel):
amount_cents: int
points_amount: int = Field(0, description="本次充值/购买可获得的积分(仅 points 类型订单有意义)")
status: str
pay_params: dict[str, Any] = Field(default_factory=dict, description="拉起支付所需参数(payment_url/prepay_id 等),支付通道接入后填充")
pay_params: dict[str, Any] = Field(
default_factory=dict, description="拉起支付所需参数(payment_url/prepay_id 等),支付通道接入后填充"
)
expire_at: Optional[str] = Field(None, description="订单过期时间(ISO 8601),默认创建后 48 小时")
created_at: Optional[str] = None
+36 -6
View File
@@ -8,7 +8,12 @@ import math
# 每个场景: base_points(基础积分), unit(计费单位), name(显示名称)
POINTS_SCENES: dict[str, dict] = {
"ai_voice": {"base_points": 1, "unit": "分钟", "name": "AI 配音", "description": "AI 配音每分钟消耗 1 积分(免费用户上浮 15%,会员 8~9 折)"},
"ai_voice": {
"base_points": 1,
"unit": "分钟",
"name": "AI 配音",
"description": "AI 配音每分钟消耗 1 积分(免费用户上浮 15%,会员 8~9 折)",
},
"ai_video": {
"base_points": 3,
"unit": "条",
@@ -16,12 +21,37 @@ POINTS_SCENES: dict[str, dict] = {
"extra_per_30s": 1,
"description": "智能混剪每条 3 积分起,视频超过 30 秒后每 30 秒加 1 积分;免费用户每日 2 条免费额度",
},
"ai_digital_human": {"base_points": 15, "unit": "分钟", "name": "AI 数字人", "description": "AI 数字人每分钟消耗 15 积分"},
"voice_clone_train": {"base_points": 0, "unit": "次", "name": "声音克隆训练", "description": "声音克隆训练免费(每用户限 1 个声音)"},
"voice_clone_synth": {"base_points": 1, "unit": "分钟", "name": "声音克隆合成", "description": "克隆音色合成每分钟消耗 1 积分"},
"douyin_extract": {"base_points": 1, "unit": "次", "name": "抖音链接提取", "description": "抖音文案提取每次 1 积分"},
"ai_digital_human": {
"base_points": 15,
"unit": "分钟",
"name": "AI 数字人",
"description": "AI 数字人每分钟消耗 15 积分",
},
"voice_clone_train": {
"base_points": 0,
"unit": "次",
"name": "声音克隆训练",
"description": "声音克隆训练免费(每用户限 1 个声音)",
},
"voice_clone_synth": {
"base_points": 1,
"unit": "分钟",
"name": "声音克隆合成",
"description": "克隆音色合成每分钟消耗 1 积分",
},
"douyin_extract": {
"base_points": 1,
"unit": "次",
"name": "抖音链接提取",
"description": "抖音文案提取每次 1 积分",
},
"ai_rewrite": {"base_points": 1, "unit": "次", "name": "AI 改写文案", "description": "AI 改写文案每次 1 积分"},
"ai_title": {"base_points": 1, "unit": "次", "name": "AI 标题生成", "description": "AI 生成标题每次 1 积分(免费用户实际上浮后 2 积分/次)"},
"ai_title": {
"base_points": 1,
"unit": "次",
"name": "AI 标题生成",
"description": "AI 生成标题每次 1 积分(免费用户实际上浮后 2 积分/次)",
},
"ai_cover": {"base_points": 1, "unit": "张", "name": "AI 封面生成", "description": "AI 封面生成每张 1 积分"},
}
+1
View File
@@ -181,6 +181,7 @@ class TestMultiplierConsistency:
"""check 端点 required_points 与 calculate_points_cost 结果一致。"""
from app.api.routes.points import check_points
from app.schemas.points import PointsCheckRequest
from packages.domain.points_rules import calculate_points_cost
svc = MagicMock()