feat: 累积功能变更 — 聊天集成、租户管理、小程序更新、ETL 增强、迁移脚本

包含多个会话的累积代码变更:
- backend: AI 聊天服务、触发器调度、认证增强、WebSocket、调度器最小间隔
- admin-web: ETL 状态页、任务管理、调度配置、登录优化
- miniprogram: 看板页面、聊天集成、UI 组件、导航更新
- etl: DWS 新任务(finance_area_daily/board_cache)、连接器增强
- tenant-admin: 项目初始化
- db: 19 个迁移脚本(etl_feiqiu 11 + zqyy_app 8)
- packages/shared: 枚举和工具函数更新
- tools: 数据库工具、报表生成、健康检查
- docs: PRD/架构/部署/合约文档更新

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
This commit is contained in:
Neo
2026-04-06 00:03:48 +08:00
parent 70324d8542
commit 6f8f12314f
515 changed files with 76604 additions and 7456 deletions

View File

@@ -0,0 +1,187 @@
/**
* P18 任务引擎运营看板 API。
*
* 端点前缀:/api/admin/task-engine
*/
import { apiClient } from "./client";
/* ------------------------------------------------------------------ */
/* 类型定义 */
/* ------------------------------------------------------------------ */
export interface TransferLogItem {
id: number;
site_id: number;
site_name: string;
member_id: number;
member_name: string;
from_assistant_id: number;
from_assistant_name: string;
to_assistant_id: number;
to_assistant_name: string;
transfer_reason: string | null;
transfer_score: number | null;
guard_checks: Record<string, unknown> | null;
created_at: string;
}
export interface TransferLogPage {
items: TransferLogItem[];
total: number;
}
export interface PendingReviewItem {
id: number;
site_id: number;
site_name: string;
member_id: number;
member_name: string;
assistant_id: number;
assistant_name: string;
task_type: string;
task_type_label: string;
transfer_count: number;
priority_score: number | null;
created_at: string;
}
export interface PendingReviewPage {
items: PendingReviewItem[];
total: number;
}
export interface ConfigParam {
id: number;
site_id: number | null;
site_name: string | null;
param_key: string;
param_value: number;
description: string | null;
updated_at: string;
}
export interface ConfigParamList {
params: ConfigParam[];
}
/* ------------------------------------------------------------------ */
/* 转移日志 */
/* ------------------------------------------------------------------ */
export interface TransferLogQuery {
site_id?: number;
from_date?: string;
to_date?: string;
assistant_id?: number;
page?: number;
page_size?: number;
}
export async function fetchTransferLogs(
query: TransferLogQuery = {},
): Promise<TransferLogPage> {
const resp = await apiClient.get<TransferLogPage>(
"/admin/task-engine/transfer-log",
{ params: query },
);
return resp.data;
}
export async function fetchMemberTransferHistory(
memberId: number,
): Promise<TransferLogItem[]> {
const resp = await apiClient.get<TransferLogItem[]>(
`/admin/task-engine/transfer-log/${memberId}/history`,
);
return resp.data;
}
/* ------------------------------------------------------------------ */
/* 待审核任务 */
/* ------------------------------------------------------------------ */
export interface PendingReviewQuery {
site_id?: number;
page?: number;
page_size?: number;
}
export async function fetchPendingReviews(
query: PendingReviewQuery = {},
): Promise<PendingReviewPage> {
const resp = await apiClient.get<PendingReviewPage>(
"/admin/task-engine/pending-review",
{ params: query },
);
return resp.data;
}
export async function reassignTask(
taskId: number,
toAssistantId: number,
): Promise<{ success: boolean; new_task_id: number | null }> {
const resp = await apiClient.post(
`/admin/task-engine/pending-review/${taskId}/reassign`,
{ to_assistant_id: toAssistantId },
);
return resp.data;
}
export async function closeTask(
taskId: number,
reason: string,
): Promise<{ success: boolean }> {
const resp = await apiClient.post(
`/admin/task-engine/pending-review/${taskId}/close`,
{ reason },
);
return resp.data;
}
/* ------------------------------------------------------------------ */
/* 参数管理 */
/* ------------------------------------------------------------------ */
export async function fetchConfigParams(
siteId?: number,
): Promise<ConfigParamList> {
const resp = await apiClient.get<ConfigParamList>(
"/admin/task-engine/config",
{ params: siteId != null ? { site_id: siteId } : {} },
);
return resp.data;
}
export async function updateConfigParam(
paramId: number,
paramValue: number,
): Promise<{ success: boolean }> {
const resp = await apiClient.put(
`/admin/task-engine/config/${paramId}`,
{ param_value: paramValue },
);
return resp.data;
}
export async function createConfigParam(
siteId: number,
paramKey: string,
paramValue: number,
): Promise<{ success: boolean; id: number }> {
const resp = await apiClient.post("/admin/task-engine/config", {
site_id: siteId,
param_key: paramKey,
param_value: paramValue,
});
return resp.data;
}
export async function deleteConfigParam(
paramId: number,
): Promise<{ success: boolean }> {
const resp = await apiClient.delete(
`/admin/task-engine/config/${paramId}`,
);
return resp.data;
}