修改对应项目提交积分扣除规则和行业取消返回对应skill
This commit is contained in:
@@ -1,13 +1,15 @@
|
|||||||
from fastapi import APIRouter, Depends
|
from fastapi import APIRouter, Depends
|
||||||
from sqlalchemy.ext.asyncio import AsyncSession
|
from sqlalchemy.ext.asyncio import AsyncSession
|
||||||
|
from sqlalchemy import select
|
||||||
|
|
||||||
from app.dependencies import get_db, get_current_user
|
from app.dependencies import get_db, get_current_user
|
||||||
from app.models.user import User
|
from app.models.user import User
|
||||||
from app.models.credit_ratio import CreditRatio
|
from app.models.credit_ratio import CreditRatio
|
||||||
|
from app.models.video_engine import VideoEngine
|
||||||
|
from app.models.image_engine import ImageEngine
|
||||||
from app.schemas.credit import CreditBalanceOut, CreditRecordOut
|
from app.schemas.credit import CreditBalanceOut, CreditRecordOut
|
||||||
from app.schemas.credit_ratio import CreditRatioOut
|
from app.schemas.credit_ratio import CreditRatioOut
|
||||||
from app.services.credits import get_records
|
from app.services.credits import get_records
|
||||||
from sqlalchemy import select
|
|
||||||
|
|
||||||
router = APIRouter(prefix="/credits", tags=["credits"])
|
router = APIRouter(prefix="/credits", tags=["credits"])
|
||||||
|
|
||||||
@@ -29,13 +31,40 @@ async def get_credit_ratios(
|
|||||||
current_user: User = Depends(get_current_user),
|
current_user: User = Depends(get_current_user),
|
||||||
db: AsyncSession = Depends(get_db),
|
db: AsyncSession = Depends(get_db),
|
||||||
):
|
):
|
||||||
result = await db.execute(select(CreditRatio))
|
async def get_ratios_for_engine_type(gen_type: str, engine_ids: list):
|
||||||
ratios = result.scalars().all()
|
for engine_id in engine_ids:
|
||||||
|
result = await db.execute(
|
||||||
|
select(CreditRatio)
|
||||||
|
.where(CreditRatio.gen_type == gen_type)
|
||||||
|
.where(CreditRatio.model_config_id == engine_id)
|
||||||
|
)
|
||||||
|
ratios = result.scalars().all()
|
||||||
|
if ratios:
|
||||||
|
return [CreditRatioOut.model_validate(r) for r in ratios]
|
||||||
|
return []
|
||||||
|
|
||||||
|
video_engines_result = await db.execute(
|
||||||
|
select(VideoEngine.id)
|
||||||
|
.where(VideoEngine.is_active == True)
|
||||||
|
.order_by(VideoEngine.priority.desc())
|
||||||
|
)
|
||||||
|
video_engine_ids = video_engines_result.scalars().all()
|
||||||
|
|
||||||
|
image_engines_result = await db.execute(
|
||||||
|
select(ImageEngine.id)
|
||||||
|
.where(ImageEngine.is_active == True)
|
||||||
|
.order_by(ImageEngine.priority.desc())
|
||||||
|
)
|
||||||
|
image_engine_ids = image_engines_result.scalars().all()
|
||||||
|
|
||||||
grouped = {}
|
grouped = {}
|
||||||
for ratio in ratios:
|
|
||||||
if ratio.gen_type not in grouped:
|
video_ratios = await get_ratios_for_engine_type("video", video_engine_ids)
|
||||||
grouped[ratio.gen_type] = []
|
if video_ratios:
|
||||||
grouped[ratio.gen_type].append(CreditRatioOut.model_validate(ratio))
|
grouped["video"] = video_ratios
|
||||||
|
|
||||||
|
image_ratios = await get_ratios_for_engine_type("image", image_engine_ids)
|
||||||
|
if image_ratios:
|
||||||
|
grouped["image"] = image_ratios
|
||||||
|
|
||||||
return grouped
|
return grouped
|
||||||
|
|||||||
@@ -30,7 +30,10 @@ async def list_active_industries(
|
|||||||
try:
|
try:
|
||||||
raw = json.loads(ind.skills)
|
raw = json.loads(ind.skills)
|
||||||
if isinstance(raw, list):
|
if isinstance(raw, list):
|
||||||
skills = raw if raw and isinstance(raw[0], dict) else [{"key": s, "label": s} for s in raw]
|
if raw and isinstance(raw[0], dict):
|
||||||
|
skills = [s for s in raw if s.get("type") != "skill"]
|
||||||
|
else:
|
||||||
|
skills = [{"key": s, "label": s} for s in raw]
|
||||||
except (json.JSONDecodeError, TypeError):
|
except (json.JSONDecodeError, TypeError):
|
||||||
skills = []
|
skills = []
|
||||||
items.append({
|
items.append({
|
||||||
|
|||||||
@@ -6,6 +6,8 @@ from sqlalchemy.ext.asyncio import AsyncSession
|
|||||||
from app.models.user import User
|
from app.models.user import User
|
||||||
from app.models.credit_record import CreditRecord
|
from app.models.credit_record import CreditRecord
|
||||||
from app.models.system_config import SystemConfig
|
from app.models.system_config import SystemConfig
|
||||||
|
from app.models.video_engine import VideoEngine
|
||||||
|
from app.models.image_engine import ImageEngine
|
||||||
from app.models.credit_ratio import CreditRatio
|
from app.models.credit_ratio import CreditRatio
|
||||||
from app.utils.id_gen import generate_id
|
from app.utils.id_gen import generate_id
|
||||||
from app.utils.exceptions import InsufficientCreditsError
|
from app.utils.exceptions import InsufficientCreditsError
|
||||||
@@ -70,6 +72,14 @@ async def calc_video_credits(
|
|||||||
2. gen_type=video + resolution 下 base_credits/per_second_credits 最高规则;
|
2. gen_type=video + resolution 下 base_credits/per_second_credits 最高规则;
|
||||||
3. 原硬编码默认算法。
|
3. 原硬编码默认算法。
|
||||||
"""
|
"""
|
||||||
|
# 如果engine_id为空,默认查询权重最高的视频引擎积分规则
|
||||||
|
if not engine_id:
|
||||||
|
video_engines_result = await db.execute(
|
||||||
|
select(VideoEngine.id)
|
||||||
|
.where(VideoEngine.is_active == True)
|
||||||
|
.order_by(VideoEngine.priority.desc())
|
||||||
|
)
|
||||||
|
engine_id = video_engines_result.scalar_one_or_none()
|
||||||
ratio = await _get_credit_ratio(
|
ratio = await _get_credit_ratio(
|
||||||
db,
|
db,
|
||||||
gen_type="video",
|
gen_type="video",
|
||||||
@@ -82,7 +92,7 @@ async def calc_video_credits(
|
|||||||
# Fallback
|
# Fallback
|
||||||
base = 60.0
|
base = 60.0
|
||||||
duration_cost = duration * 2.0
|
duration_cost = duration * 2.0
|
||||||
multiplier = {"4K": 2.5, "1080p": 1.5, "720p": 1.0}.get(resolution, 1.0)
|
multiplier = {"480p": 1, "1080p": 2, "720p": 1.5}.get(resolution, 1.0)
|
||||||
return round((base + duration_cost) * multiplier, 2)
|
return round((base + duration_cost) * multiplier, 2)
|
||||||
|
|
||||||
|
|
||||||
@@ -90,7 +100,7 @@ def calc_credits(duration: int, resolution: str) -> float:
|
|||||||
"""Legacy: hardcoded credit calculation. Prefer calc_video_credits for new code."""
|
"""Legacy: hardcoded credit calculation. Prefer calc_video_credits for new code."""
|
||||||
base = 60.0
|
base = 60.0
|
||||||
duration_cost = duration * 2.0
|
duration_cost = duration * 2.0
|
||||||
multiplier = {"4K": 2.5, "1080p": 1.5, "720p": 1.0}.get(resolution, 1.0)
|
multiplier = {"480p": 2.5, "1080p": 1.5, "720p": 1.0}.get(resolution, 1.0)
|
||||||
return round((base + duration_cost) * multiplier, 2)
|
return round((base + duration_cost) * multiplier, 2)
|
||||||
|
|
||||||
|
|
||||||
@@ -106,6 +116,14 @@ async def calc_image_credits(
|
|||||||
2. gen_type=image + image_size 下 base_credits/per_second_credits 最高规则;
|
2. gen_type=image + image_size 下 base_credits/per_second_credits 最高规则;
|
||||||
3. 原硬编码默认算法。
|
3. 原硬编码默认算法。
|
||||||
"""
|
"""
|
||||||
|
# 如果engine_id为空,默认查询权重最高的图片引擎积分规则
|
||||||
|
if not engine_id:
|
||||||
|
image_engines_result = await db.execute(
|
||||||
|
select(ImageEngine.id)
|
||||||
|
.where(ImageEngine.is_active == True)
|
||||||
|
.order_by(ImageEngine.priority.desc())
|
||||||
|
)
|
||||||
|
engine_id = image_engines_result.scalar_one_or_none()
|
||||||
ratio = await _get_credit_ratio(
|
ratio = await _get_credit_ratio(
|
||||||
db,
|
db,
|
||||||
gen_type="image",
|
gen_type="image",
|
||||||
|
|||||||
Reference in New Issue
Block a user