Files
fund-tracer/backend/scripts/seed.py

108 lines
5.5 KiB
Python
Raw Normal View History

2026-03-11 16:28:04 +08:00
"""Seed the database with demo case data matching the frontend mock."""
import asyncio
import uuid
from datetime import datetime, timezone
from app.core.database import async_session_factory
from app.models.case import Case, CaseStatus
from app.models.evidence_image import EvidenceImage, SourceApp, PageType, OcrStatus
from app.models.transaction import TransactionRecord, Direction
from app.models.assessment import FraudAssessment, ConfidenceLevel, ReviewStatus
async def seed():
async with async_session_factory() as db:
# Case 1
c1_id = uuid.UUID("00000000-0000-0000-0000-000000000001")
c1 = Case(
id=c1_id,
case_no="ZA-2026-001538",
title="张某被电信诈骗案",
victim_name="张某某",
handler="李警官",
status=CaseStatus.reviewing,
image_count=8,
total_amount=186500.00,
)
db.add(c1)
# Images
imgs = [
("wechat", "bill_list", "done"),
("wechat", "bill_detail", "done"),
("alipay", "bill_list", "done"),
("alipay", "transfer_receipt", "done"),
("bank", "bill_detail", "done"),
("bank", "sms_notice", "done"),
("digital_wallet", "bill_list", "done"),
("wechat", "bill_detail", "done"),
]
img_ids = []
for i, (app, pt, status) in enumerate(imgs):
iid = uuid.UUID(f"00000000-0000-0000-0001-{i:012d}")
img_ids.append(iid)
db.add(EvidenceImage(
id=iid, case_id=c1_id, file_path=f"demo/img_{i}.png", thumb_path=f"demo/img_{i}.png",
source_app=SourceApp(app), page_type=PageType(pt), ocr_status=OcrStatus(status),
file_hash=f"demohash{i:04d}",
))
# Transactions
txs_data = [
("bank", "2026-03-06T10:15:00", 50000, "out", "支付宝-张某某", "", "6621", "BK20260306001", "转账至支付宝", 0.95, True, True),
("alipay", "2026-03-06T10:16:00", 50000, "in", "银行卡(6621)", "", "", "AL20260306001", "银行卡转入", 0.92, True, True),
("alipay", "2026-03-06T10:25:00", 50000, "out", "李*华", "138****5678", "", "AL20260306002", "投资款", 0.97, False, False),
("wechat", "2026-03-07T14:30:00", 30000, "out", "财富管家-客服", "", "", "WX20260307001", "手续费", 0.88, False, False),
("wechat", "2026-03-07T16:00:00", 20000, "out", "李*华", "138****5678", "", "WX20260307002", "追加保证金", 0.91, False, False),
("digital_wallet", "2026-03-08T09:00:00", 86500, "out", "USDT-TRC20地址", "T9yD...Xk3m", "", "DW20260308001", "提币", 0.85, False, False),
("bank", "2026-03-07T20:00:00", 86500, "out", "某数字钱包充值", "", "6621", "BK20260307002", "充值", 0.90, False, True),
]
tx_ids = []
for i, (app, tt, amt, dir_, cp, ca, sat, ono, rmk, conf, dup, trans) in enumerate(txs_data):
tid = uuid.UUID(f"00000000-0000-0000-0002-{i:012d}")
tx_ids.append(tid)
db.add(TransactionRecord(
id=tid, case_id=c1_id, evidence_image_id=img_ids[min(i, len(img_ids)-1)],
source_app=SourceApp(app), trade_time=datetime.fromisoformat(tt).replace(tzinfo=timezone.utc),
amount=amt, direction=Direction.in_ if dir_ == "in" else Direction.out,
counterparty_name=cp, counterparty_account=ca, self_account_tail_no=sat,
order_no=ono, remark=rmk, confidence=conf, is_duplicate=dup, is_transit=trans,
))
# Assessments
assessments_data = [
(tx_ids[2], "high", 50000, "受害人经支付宝向涉诈账户转账5万元", "", "confirmed"),
(tx_ids[3], "high", 30000, "受害人经微信向客服转账3万元手续费", "", "confirmed"),
(tx_ids[4], "high", 20000, "受害人经微信向涉诈账户追加转账2万元", "", "pending"),
(tx_ids[5], "medium", 86500, "受害人通过数字钱包提币86500元", "如经查实为个人操作应排除", "pending"),
(tx_ids[0], "low", 0, "该笔为本人银行卡向支付宝中转", "本人账户间互转", "confirmed"),
]
for i, (tid, level, amt, reason, excl, status) in enumerate(assessments_data):
db.add(FraudAssessment(
id=uuid.UUID(f"00000000-0000-0000-0003-{i:012d}"),
case_id=c1_id, transaction_id=tid,
confidence_level=ConfidenceLevel(level), assessed_amount=amt,
reason=reason, exclude_reason=excl, review_status=ReviewStatus(status),
reviewed_by="李警官" if status == "confirmed" else "",
))
# More cases (summary only)
for idx, (cno, title, victim, handler, st) in enumerate([
("ZA-2026-001612", "王某被投资诈骗案", "王某", "李警官", "analyzing"),
("ZA-2026-001705", "刘某某被冒充客服诈骗案", "刘某某", "陈警官", "completed"),
("ZA-2026-001821", "赵某被刷单诈骗案", "赵某", "王警官", "pending"),
("ZA-2026-001890", "陈某被杀猪盘诈骗案", "陈某", "李警官", "uploading"),
], start=2):
db.add(Case(
id=uuid.UUID(f"00000000-0000-0000-0000-{idx:012d}"),
case_no=cno, title=title, victim_name=victim, handler=handler,
status=CaseStatus(st),
))
await db.commit()
print("Seed data inserted successfully.")
if __name__ == "__main__":
asyncio.run(seed())