feat(weibo): 区分充值资金来源并完善协作单记录

This commit is contained in:
yml
2026-11-13 21:07:50 +08:00
parent f0abca3d58
commit 76b344eb83
11 changed files with 740 additions and 10 deletions
+1 -1
View File
@@ -35,7 +35,7 @@ TESTS_DIR = Path(__file__).resolve().parent
PROJECT_ROOT = TESTS_DIR.parent
VERSIONS_DIR = PROJECT_ROOT / "web" / "backend" / "migrations" / "versions"
HEAD_REVISION = "20261113_0081"
HEAD_REVISION = "20261113_0082"
# 迁移新增、但不声明在模型里的复合查询索引。
EXTRA_INDEXES = (
+12 -1
View File
@@ -19,7 +19,13 @@ from core.weibo import (
WeiboRechargeError,
WeiboRechargeOrder,
)
from web.backend.models import AuditLog, User, WeiboAccount, WeiboWorkbenchAccount
from web.backend.models import (
AuditLog,
User,
WeiboAccount,
WeiboRechargeRecord,
WeiboWorkbenchAccount,
)
from web.backend.permissions import ROLE_PERMISSIONS
from web.backend.routers import weibo as weibo_router
from web.backend.routers.weibo import (
@@ -1587,6 +1593,11 @@ def test_manual_recharge_order_and_status_routes_serialize(
assert order["single_reward"] == 100
assert order["alipay_qr_code"] == "https://qr.alipay.com/upx-test"
assert status["status"] == "PAY_STATUS_PENDING"
record = db.query(WeiboRechargeRecord).filter_by(order_id="order-1").one()
assert record.pay_id == "pay-1"
assert record.amount_yuan == 1
assert record.status == "pending"
assert record.status_checked_at is not None
def test_recharge_failure_keeps_valid_ck_status(monkeypatch, db, current_user):
+58 -1
View File
@@ -2,10 +2,18 @@
from __future__ import annotations
from datetime import UTC, datetime
from sqlalchemy.orm import Session
from core.weibo import WeiboAuthError
from web.backend.models import AuditLog, User, WeiboAccount, WeiboExternalOrderMetric
from web.backend.models import (
AuditLog,
User,
WeiboAccount,
WeiboExternalOrderMetric,
WeiboRechargeRecord,
)
from web.backend.routers import weibo_collab as weibo_collab_router
from web.backend.schemas import WeiboCollabCkExportOut
from web.backend.services import weibo_collab_service as collab
@@ -98,9 +106,58 @@ def test_create_orders_groups_and_balance_check(monkeypatch, db):
assert first.status == collab.STATUS_RECHARGED
assert second.status == collab.STATUS_RECHARGED
assert first.recharged_at is not None
assert first.funding_source == collab.FUNDING_SOURCE_ACCOUNT_BALANCE
assert second.funding_source == collab.FUNDING_SOURCE_ACCOUNT_BALANCE
assert db.query(WeiboExternalOrderMetric).count() == 2
def test_balance_check_recognizes_paid_web_recharge(monkeypatch, db):
user = make_user(db)
account = make_account(db)
order = collab.create_order(
db,
user,
order_no="WB-WEB-RECHARGE",
shop="店铺A",
account_id=account.id,
goods_name="商品A",
required_weidou=100,
require_verified=False,
)
db.add(
WeiboRechargeRecord(
account_id=account.id,
order_id="recharge-order-1",
pay_id="pay-1",
amount_yuan=1,
single_reward=100,
status="paid",
paid_at=datetime.now(UTC),
created_by=user.id,
)
)
db.commit()
class FakeClient:
def __init__(self, *_args, **_kwargs):
pass
def list_mall(self, *_args, **_kwargs):
return {"weidou_balance": 100, "list": []}
monkeypatch.setattr(weibo_service, "WeiboClient", FakeClient)
collab.check_balance_groups(db, user, [order], threshold=100)
db.refresh(order)
assert order.funding_source == collab.FUNDING_SOURCE_WEB_RECHARGE
assert order.funding_recharge_record_id is not None
detail = collab.serialize_one(db, order)
assert detail["funding_source_label"] == "系统 Web 充值"
assert detail["recharge_records"][0]["order_id"] == "recharge-order-1"
assert detail["recharge_records"][0]["is_paid"] is True
def test_exchange_record_unique_match_and_archive(monkeypatch, db):
user = make_user(db)
account = make_account(db)