"""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