Files
cunkebao_v3/SuperAdmin/lib/project-workspace-api.ts
Manus AI 2753265edb sync(本地→GitHub): 2026-06-03 21:17 全量单向同步
## GitHub 同步说明

| 项 | 内容 |
|:---|:---|
| 仓库 | https://github.com/fnvtk/cunkebao_v3 |
| 分支 | develop |
| 方向 | 本地 → GitHub(单向 push) |
| 是否拉取远程 | 否(未 fetch / pull / merge) |
| 是否改本地源文件 | 否(仅 git add/commit,未编辑业务/文档正文) |
| 远程基准 | origin/develop @ b5b40e8b |
| 本批工作区变更 | 999 files, +47622 / -4007 lines |

## 一并推送的本地已有 commit(此前未 push)

1. 3aa7ecf8 deploy: 官网 ckb.quwanzhi.com 宝塔上线 DNS+SSL+验收文档
2. 16a70045 fix(官网): 桌面导航仅保留一个留资 CTA 并重新上线
3. dbe7b7aa fix(官网): Hero 改为主 CTA 按钮并去掉重复 1200+ 数据条
4. ac82726e chore(部署): 五端上线验收46项并统一留资与缓存版本

## 本 commit 目录统计

| 目录 | 文件数 | 说明 |
|:---|---:|:---|
| 开发文档/ | 639 | 10、项目管理、未完成项跨仓汇总、五端需求/部署/接口 |
| Server/ | 129 | 后端 API、迁移、部署相关 |
| Touchkebao/ | 80 | PC 工作台、获客、算力 |
| 官网/ | 61 | ckb.quwanzhi.com 静态站与 CTA 迭代 |
| Cunkebao/ | 49 | 移动端场景/设置/流量池 |
| SuperAdmin/ | 26 | 超管后台 |
| .cursor/ | 11 | 规则与 Skill |
| 其他 | 14 | docker-compose、.obsidian、.codegraph 等 |

## 重点文件(本地为准)

- 开发文档/1、需求/修改/未完成项与跨仓验收汇总.md
- 开发文档/10、项目管理/账号密码与登录环境一览.md
- 开发文档/10、项目管理/(新建项目管理目录与截图)
- 官网/ 全站 + 宝塔上线文档
- 五端上线验收 46 项(见 ac82726e)

## 刻意未上传

- node_modules/、.DS_Store、.smart-env/
- .开发文档_nested_git_backup/
- **/__pycache__/

## 验收

- 提交页(含本说明): https://github.com/fnvtk/cunkebao_v3/commit/HEAD
- 分支树: https://github.com/fnvtk/cunkebao_v3/tree/develop

Co-authored-by: Cursor <cursoragent@cursor.com>
2026-06-03 21:17:41 +08:00

120 lines
3.5 KiB
TypeScript

import { apiRequest, ApiResponse } from "./api-utils";
export interface ProjectWorkspace {
projectId: number;
companyId: number;
name: string;
status: number;
master: any;
deviceStats: { total: number; online: number; offline: number };
assetStats: {
customerTotal: number;
totalConsumption: number;
totalOrders: number;
avgRfmScore: number;
rfmDistribution: { rfmType: string; cnt: number }[];
};
wechatStats: { total: number; loggedIn: number; list: any[] };
contentCount: number;
planCount: number;
subUserCount: number;
}
export async function getProjectWorkspace(projectId: number): Promise<ApiResponse<ProjectWorkspace>> {
return apiRequest(`/project/workspace/${projectId}`);
}
export async function getProjectTraffic(
projectId: number,
page = 1,
limit = 20,
keyword = "",
sortBy = "rfmScore",
): Promise<ApiResponse<{ list: any[]; total: number }>> {
const q = new URLSearchParams({ page: String(page), limit: String(limit), sortBy });
if (keyword) q.append("keyword", keyword);
return apiRequest(`/project/traffic/${projectId}?${q.toString()}`);
}
export async function getProjectContentLibrary(
projectId: number,
page = 1,
limit = 20,
): Promise<ApiResponse<{ list: any[]; total: number }>> {
return apiRequest(`/project/content-library/${projectId}?page=${page}&limit=${limit}`);
}
export async function getProjectPlanScenes(projectId: number): Promise<ApiResponse<{ list: any[] }>> {
return apiRequest(`/project/plan-scenes/${projectId}`);
}
/** 项目级场景获客开关 */
export async function updateProjectPlanSceneStatus(
projectId: number,
sceneId: number,
status: number,
): Promise<ApiResponse<{ id: number; status: number }>> {
return apiRequest(`/project/plan-scenes/update/${projectId}`, "POST", { sceneId, status });
}
/** 项目级工作台功能列表 */
export async function getProjectWorkbenchFunctions(
projectId: number,
): Promise<ApiResponse<{ list: any[] }>> {
return apiRequest(`/project/workbench-functions/${projectId}`);
}
/** 项目级工作台功能开关 */
export async function updateProjectWorkbenchFunctionStatus(
projectId: number,
functionId: number,
status: number,
): Promise<ApiResponse<{ id: number; status: number }>> {
return apiRequest(`/project/workbench-functions/update/${projectId}`, "POST", {
functionId,
status,
});
}
export async function migrateProjectTraffic(
projectId: number,
poolCompanyIds: number[],
targetProjectId: number,
): Promise<ApiResponse<{ migrated: number }>> {
return apiRequest(`/project/traffic/migrate/${projectId}`, "POST", {
poolCompanyIds,
targetProjectId,
});
}
export async function migrateProjectWechatFriends(
projectId: number,
payload: {
wechatId: string;
devices: number[];
greeting: string;
inherit?: boolean;
firstMessage?: string;
},
): Promise<ApiResponse<{ taskId: number; friendCount: number }>> {
return apiRequest(`/project/wechat/migrate/${projectId}`, "POST", payload);
}
export async function saveProjectContentLibrary(
projectId: number,
payload: { id?: number; name?: string; status?: number },
): Promise<ApiResponse<{ id: number; action: string }>> {
return apiRequest(`/project/content-library/save/${projectId}`, "POST", payload);
}
export async function migrateProjectContentLibrary(
projectId: number,
libraryId: number,
targetProjectId: number,
): Promise<ApiResponse<null>> {
return apiRequest(`/project/content-library/migrate/${projectId}`, "POST", {
libraryId,
targetProjectId,
});
}