feat: 添加数据库迁移脚本并更新Dockerfile配置

- 在Dockerfile中添加alembic配置文件和目录的复制指令
- 更新alembic/env.py注册新的模块模型:events、workflows、writebacks
- 生成完整的初始数据库schema迁移脚本,包含以下表:
  - approval_requests, attendance_records, audit_logs, domain_events
  - expenses, feishu_event_receipts, fund_accounts, legacy_sync_runs
  - official_writeback_runs, performance_metrics, policies, procurements
  - projects, report_push_runs, risk_event_actions, risk_events
  - standards, suppliers, work_reports, work_tasks, workflow_actions
  - workflow_instances等21个数据表结构定义
- 在API路由器中添加新模块的路由:events、workflows、writebacks、observability
```
This commit is contained in:
2026-07-08 14:08:03 +08:00
parent 92f490b97e
commit 19e59e83cc
59 changed files with 3271 additions and 247 deletions

View File

@@ -11,6 +11,7 @@ db.close()
os.environ["DATABASE_URL"] = "sqlite:///" + db.name.replace("\\", "/")
os.environ["API_KEY"] = "test-key"
os.environ["APPROVAL_API_KEY"] = "approval-key"
os.environ["LEGACY_ALLOWED_QUERIES"] = "{}"
os.environ["LEGACY_DATABASE_URL"] = ""
os.environ["LEGACY_PROJECT_QUERY"] = ""
@@ -34,22 +35,47 @@ def request(method: str, url: str, **kwargs):
return response
def approve_change(domain: str, action: str, payload: dict, record_id: str | None = None) -> str:
approval_payload: dict[str, object] = {
"domain": domain,
"action": action,
"reason": "smoke verification",
"payload": payload,
}
if record_id is not None:
approval_payload["record_id"] = record_id
ticket = request("post", "/api/v1/approvals", json=approval_payload).json()["ticket_id"]
request(
"post",
f"/api/v1/approvals/{ticket}/approve",
headers={
HttpHeader.X_API_KEY: "test-key",
HttpHeader.X_APPROVAL_API_KEY: "approval-key",
},
json={"comment": "smoke approved"},
)
return ticket
try:
Base.metadata.create_all(bind=engine)
project_payload = {
"code": "P-VERIFY-001",
"name": "Verify Project",
"owner": "tester",
BusinessField.STATUS: StatusValue.RUNNING_CN,
"budget_amount": 1000,
"actual_amount": 200,
}
approval_ticket_id = approve_change("projects", "create:projects", project_payload)
project = request(
"post",
"/api/v1/business/projects",
json={
"actor": "smoke",
"data": {
"code": "P-VERIFY-001",
"name": "Verify Project",
"owner": "tester",
BusinessField.STATUS: StatusValue.RUNNING_CN,
"budget_amount": 1000,
"actual_amount": 200,
},
"approval_ticket_id": approval_ticket_id,
"data": project_payload,
},
).json()
print("project:", project["data"]["code"])