feat(weibo): 优化协作单详情并增加已上脚本状态
This commit is contained in:
@@ -0,0 +1,45 @@
|
||||
"""微博外部单协作增加上脚本时间,并回填已完成订单。"""
|
||||
|
||||
from __future__ import annotations
|
||||
|
||||
from collections.abc import Sequence
|
||||
|
||||
import sqlalchemy as sa
|
||||
from alembic import op
|
||||
|
||||
revision: str = "20261112_0080"
|
||||
down_revision: str | None = "20261112_0079"
|
||||
branch_labels: str | Sequence[str] | None = None
|
||||
depends_on: str | Sequence[str] | None = None
|
||||
|
||||
TABLE = "weibo_external_orders"
|
||||
|
||||
|
||||
def upgrade() -> None:
|
||||
bind = op.get_bind()
|
||||
inspector = sa.inspect(bind)
|
||||
if not inspector.has_table(TABLE):
|
||||
return
|
||||
columns = {column["name"] for column in inspector.get_columns(TABLE)}
|
||||
if "scripted_at" not in columns:
|
||||
op.add_column(TABLE, sa.Column("scripted_at", sa.DateTime(), nullable=True))
|
||||
bind.execute(
|
||||
sa.text(
|
||||
f"""
|
||||
UPDATE {TABLE}
|
||||
SET scripted_at = COALESCE(scripted_at, exchange_started_at, done_at, updated_at)
|
||||
WHERE status IN ('scripted', 'done')
|
||||
AND scripted_at IS NULL
|
||||
"""
|
||||
)
|
||||
)
|
||||
|
||||
|
||||
def downgrade() -> None:
|
||||
bind = op.get_bind()
|
||||
inspector = sa.inspect(bind)
|
||||
if not inspector.has_table(TABLE):
|
||||
return
|
||||
columns = {column["name"] for column in inspector.get_columns(TABLE)}
|
||||
if "scripted_at" in columns:
|
||||
op.drop_column(TABLE, "scripted_at")
|
||||
@@ -1115,6 +1115,7 @@ class WeiboExternalOrder(Base):
|
||||
String(20), default="incomplete", server_default="incomplete", index=True
|
||||
)
|
||||
recharged_at: Mapped[datetime | None] = mapped_column(UTCDateTime, nullable=True)
|
||||
scripted_at: Mapped[datetime | None] = mapped_column(UTCDateTime, nullable=True)
|
||||
exchange_started_at: Mapped[datetime | None] = mapped_column(
|
||||
UTCDateTime, nullable=True
|
||||
)
|
||||
|
||||
@@ -934,6 +934,7 @@ class WeiboCollabOrderOut(BaseModel):
|
||||
exchange_verdict: str = ""
|
||||
exchange_message: str = ""
|
||||
recharged_at: datetime | None = None
|
||||
scripted_at: datetime | None = None
|
||||
done_at: datetime | None = None
|
||||
void_reason: str = ""
|
||||
is_archived: bool = False
|
||||
|
||||
@@ -33,6 +33,7 @@ from .weibo_service import query_weibo_mall, refresh_weibo_account
|
||||
STATUS_INCOMPLETE = "incomplete"
|
||||
STATUS_TO_RECHARGE = "to_recharge"
|
||||
STATUS_RECHARGED = "recharged"
|
||||
STATUS_SCRIPTED = "scripted"
|
||||
STATUS_DONE = "done"
|
||||
STATUS_WEIDOU_ERROR = "weidou_error"
|
||||
STATUS_FAILED = "failed"
|
||||
@@ -42,6 +43,7 @@ ORDER_STATUSES = (
|
||||
STATUS_INCOMPLETE,
|
||||
STATUS_TO_RECHARGE,
|
||||
STATUS_RECHARGED,
|
||||
STATUS_SCRIPTED,
|
||||
STATUS_DONE,
|
||||
STATUS_WEIDOU_ERROR,
|
||||
STATUS_FAILED,
|
||||
@@ -52,6 +54,7 @@ ORDER_STATUS_LABELS = {
|
||||
STATUS_INCOMPLETE: "待补资料",
|
||||
STATUS_TO_RECHARGE: "待充值",
|
||||
STATUS_RECHARGED: "已充值",
|
||||
STATUS_SCRIPTED: "已上脚本",
|
||||
STATUS_DONE: "兑换成功",
|
||||
STATUS_WEIDOU_ERROR: "微豆异常",
|
||||
STATUS_FAILED: "兑换失败",
|
||||
@@ -62,13 +65,15 @@ STATUS_FLOW = (
|
||||
STATUS_INCOMPLETE,
|
||||
STATUS_TO_RECHARGE,
|
||||
STATUS_RECHARGED,
|
||||
STATUS_SCRIPTED,
|
||||
STATUS_DONE,
|
||||
)
|
||||
STAGE_INDEX = {status: index for index, status in enumerate(STATUS_FLOW)}
|
||||
NEXT_STATUS = {
|
||||
STATUS_INCOMPLETE: STATUS_TO_RECHARGE,
|
||||
STATUS_TO_RECHARGE: STATUS_RECHARGED,
|
||||
STATUS_RECHARGED: STATUS_DONE,
|
||||
STATUS_RECHARGED: STATUS_SCRIPTED,
|
||||
STATUS_SCRIPTED: STATUS_DONE,
|
||||
}
|
||||
|
||||
BALANCE_GROUP_STATUSES = (
|
||||
@@ -712,15 +717,25 @@ def set_status(
|
||||
now = _now()
|
||||
if target == STATUS_TO_RECHARGE:
|
||||
order.recharged_at = None
|
||||
order.scripted_at = None
|
||||
order.exchange_started_at = None
|
||||
order.done_at = None
|
||||
elif target in (STATUS_RECHARGED, STATUS_WEIDOU_ERROR):
|
||||
if order.recharged_at is None:
|
||||
order.recharged_at = now
|
||||
if rollback:
|
||||
order.scripted_at = None
|
||||
order.exchange_started_at = None
|
||||
order.done_at = None
|
||||
elif target == STATUS_SCRIPTED:
|
||||
if order.recharged_at is None:
|
||||
raise CollabError("请先完成余额核账", code="recharge_check_required")
|
||||
if order.scripted_at is None:
|
||||
order.scripted_at = now
|
||||
order.done_at = None
|
||||
elif target == STATUS_DONE:
|
||||
if order.scripted_at is None:
|
||||
order.scripted_at = now
|
||||
if order.exchange_started_at is None:
|
||||
order.exchange_started_at = now
|
||||
order.done_at = now
|
||||
@@ -1216,7 +1231,7 @@ def check_exchange_records(
|
||||
order.exchange_record_snapshot = _json_safe(record)
|
||||
order.exchange_verdict = VERDICT_SUCCESS
|
||||
order.exchange_message = "兑换记录唯一命中"
|
||||
if order.status == STATUS_RECHARGED:
|
||||
if order.status in (STATUS_RECHARGED, STATUS_SCRIPTED):
|
||||
set_status(
|
||||
db,
|
||||
current,
|
||||
@@ -1518,6 +1533,7 @@ def serialize_order(
|
||||
"exchange_verdict": order.exchange_verdict or "",
|
||||
"exchange_message": order.exchange_message or "",
|
||||
"recharged_at": order.recharged_at,
|
||||
"scripted_at": order.scripted_at,
|
||||
"done_at": order.done_at,
|
||||
"void_reason": order.void_reason or "",
|
||||
"is_archived": order.archived_at is not None,
|
||||
|
||||
Reference in New Issue
Block a user