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