e69788eb41
运营后台审核用户上报的「某平台比我们算的最低价更便宜」+截图。 - routers/price_report.py:列表 + /summary、approve|reject(require operator) - repositories:list_price_reports + price_report_summary(queries)、review_price_report(mutations) - core/rewards.py:PRICE_REPORT_REWARD_COINS=1000(通过即发,grant_coins 由 router 同事务调) - admin/main.py:注册 price_report_router 跨端配套:前端 admin-web feat/price-report-review;端上金币刷新 android feat/price-report-review。 🤖 Generated with [Claude Code](https://claude.com/claude-code) --------- Co-authored-by: xianze <ze@192.168.0.128> Reviewed-on: #33 Co-authored-by: zhangxianze <zhangxianze@wonderable.ai> Co-committed-by: zhangxianze <zhangxianze@wonderable.ai>
68 lines
2.0 KiB
Python
68 lines
2.0 KiB
Python
"""admin 写操作 repo(状态改写)。
|
|
|
|
涉钱的金币/提现复用 app.repositories.wallet(grant_coins / refresh_withdraw_status /
|
|
reconcile_pending_withdraws),不在这里重写——重写涉钱逻辑就是给自己埋雷。
|
|
|
|
set_user_status / update_feedback_status 支持 commit=False,让 router 把"业务写 + 审计写"
|
|
放进同一事务一起 commit(原子:改了就有审计、有审计就真改了,见 plan 风险点 1)。
|
|
"""
|
|
from __future__ import annotations
|
|
|
|
from datetime import datetime
|
|
|
|
from sqlalchemy.orm import Session
|
|
|
|
from app.core.rewards import CN_TZ
|
|
from app.models.feedback import Feedback
|
|
from app.models.price_report import PriceReport
|
|
from app.models.user import User
|
|
|
|
|
|
def set_user_status(db: Session, user: User, *, status: str, commit: bool = True) -> User:
|
|
user.status = status
|
|
if commit:
|
|
db.commit()
|
|
db.refresh(user)
|
|
else:
|
|
db.flush()
|
|
return user
|
|
|
|
|
|
def update_feedback_status(
|
|
db: Session, feedback: Feedback, *, status: str, commit: bool = True
|
|
) -> Feedback:
|
|
feedback.status = status
|
|
if commit:
|
|
db.commit()
|
|
db.refresh(feedback)
|
|
else:
|
|
db.flush()
|
|
return feedback
|
|
|
|
|
|
def review_price_report(
|
|
db: Session,
|
|
report: PriceReport,
|
|
*,
|
|
status: str,
|
|
reward_coins: int | None = None,
|
|
reject_reason: str | None = None,
|
|
commit: bool = True,
|
|
) -> PriceReport:
|
|
"""审核上报:置 approved/rejected + 记审核时间;通过填 reward_coins、拒绝填 reject_reason。
|
|
|
|
发金币(wallet.grant_coins)不在这里——由 router 在同一事务里调,涉钱逻辑不重写(见模块头注释)。
|
|
"""
|
|
report.status = status
|
|
if reward_coins is not None:
|
|
report.reward_coins = reward_coins
|
|
if reject_reason is not None:
|
|
report.reject_reason = reject_reason
|
|
report.reviewed_at = datetime.now(CN_TZ).replace(tzinfo=None) # 北京 wall-clock,同 created_at
|
|
if commit:
|
|
db.commit()
|
|
db.refresh(report)
|
|
else:
|
|
db.flush()
|
|
return report
|