logo
0
0
WeChat Login

CodeBuddy 第三方组织架构同步服务

基于 CodeBuddy Custom Provider 规范实现的组织架构同步服务,支持与 CodeBuddy 平台的深度集成。

功能特性

  • 完整的组织架构管理(部门树、成员信息)
  • 支持 CodeBuddy 标准 API 接口
  • Bearer Token 鉴权
  • 支持精准/模糊搜索
  • 分页查询支持
  • CodeBuddy API 集成:通过工号自动匹配 CodeBuddy 用户与本地组织架构
  • 详细的请求日志:记录完整的请求/响应信息,便于调试
  • 静态 JSON 数据,易于扩展

API 接口列表

接口方法路径说明
健康检查GET/org/health验证服务可用性(无需鉴权)
获取部门树GET/org/nodes获取完整组织架构
获取单个部门GET/org/nodes/:id获取部门详情
批量获取部门POST/org/nodes/batch批量查询部门
子部门列表GET/org/nodes/:id/children获取直接子部门
部门成员列表GET/org/nodes/:id/members分页获取部门成员
路径解析节点GET/org/path根据路径查找部门
搜索GET/org/search支持精准/模糊搜索部门或用户
用户详情GET/org/users/:id通过 CodeBuddy API 查询用户并匹配本地架构
刷新缓存POST/org/cache/refresh刷新数据缓存
同步状态GET/org/sync/status查看同步状态
解析成员POST/org/members/resolve通过工号匹配用户

快速开始

1. 安装依赖

npm install

2. 配置环境变量

复制 .env.example.env

cp .env.example .env

编辑 .env 文件:

# 服务配置
PORT=3000
NODE_ENV=development

# 鉴权配置(CodeBuddy 配置中使用的 auth_token)
AUTH_TOKEN=your-secret-token-here

# 企业配置
ENTERPRISE_ID=ent-demo

# CodeBuddy API 配置(用于 /org/users/:id 接口)
CODEBUDDY_SERVICE_HOST=https://your-enterprise.copilot-staging.qq.com
CODEBUDDY_API_TOKEN=your-api-token-here

3. 启动服务

开发模式(热重载):

npm run dev

生产模式:

npm run build
npm start

服务启动后,访问 http://localhost:3000 查看服务信息。

CodeBuddy 配置

在 CodeBuddy 后台 <企业id>.copilot.qq.com/admin开放与集成组织架构同步 中配置:

{
  "name": "custom-org",
  "base_url": "http://your-server:3000",
  "enterprise_id": "ent-demo",
  "timeout_seconds": 15,
  "auth_token": "your-secret-token-here",
  "extra_headers": {
    "X-From": "org-service"
  },
  "success_code": 0
}

重要配置项:

  • base_url: 你的服务地址(必填)
  • auth_token: 鉴权令牌,必须与 .env 中的 AUTH_TOKEN 一致
  • success_code: 响应成功码,默认 0

数据结构

组织节点 (OrgNode)

{
  "id": "dept-rd",
  "name": "研发中心",
  "display_name": "研发中心",
  "parent_id": "root",
  "full_path": "/科技有限公司/研发中心",
  "has_child": true,
  "member_count": 80,
  "user_count": 65,
  "order": 1
}

成员 (OrgMember)

{
  "id": "u-001",
  "name": "zhangsan",
  "display_name": "张三",
  "email": "zhangsan@company.com",
  "mobile": "13800138001",
  "employee_number": "EMP001",
  "title": "技术总监",
  "department_path": ["科技有限公司", "研发中心", "后端开发部", "Java组"],
  "is_leader": true,
  "status": "active"
}

模拟数据

项目内置了完整的模拟数据:

  • 组织架构: 15 个部门,包含研发中心、产品中心、销售中心等
  • 成员信息: 22 名员工,包含各种职位和状态

数据文件位置:

  • src/data/org-nodes.json - 部门数据
  • src/data/members.json - 成员数据

关键员工示例

姓名工号职位部门
余朋飞EMP021技术架构师研发中心/后端开发部
叶泰林e011891后端工程师研发中心/后端开发部
张三EMP001技术总监研发中心

API 使用示例

健康检查

curl http://localhost:3000/org/health

获取部门树

curl -H "Authorization: Bearer your-token" \
  http://localhost:3000/org/nodes

搜索用户(模糊搜索)

curl -H "Authorization: Bearer your-token" \
  "http://localhost:3000/org/search?type=user&fuzzy=true&keyword=zhang"

搜索用户(精准搜索)

curl -H "Authorization: Bearer your-token" \
  "http://localhost:3000/org/search?type=user&fuzzy=false&keyword=zhangsan@company.com"

获取部门成员

curl -H "Authorization: Bearer your-token" \
  "http://localhost:3000/org/nodes/dept-rd/members?limit=10&offset=0"

解析成员(通过工号)

curl -X POST -H "Authorization: Bearer your-token" \
  -H "Content-Type: application/json" \
  -d '{"Username": "e011891"}' \
  http://localhost:3000/org/members/resolve

说明:该接口根据 Username 字段(工号)匹配本地成员的 employee_number

获取用户详情(CodeBuddy 集成)

curl -H "Authorization: Bearer your-token" \
  "http://localhost:3000/org/users/da7dc1b0-439f-42f8-902e-acaba3c88714?enterprise_id=ent-demo"

说明:该接口会:

  1. 调用 CodeBuddy API 根据用户 ID 查询用户信息
  2. 获取 CodeBuddy 用户的 nickname(工号)
  3. 根据工号匹配本地成员的 employee_number
  4. 返回本地成员详情,但使用 CodeBuddy 的用户 ID

核心功能说明

1. 成员解析(/org/members/resolve)

该接口用于通过工号匹配用户信息。

匹配逻辑

  • 使用请求参数 Username 匹配本地成员的 employee_number 字段
  • 匹配时不区分大小写
  • 如果找不到匹配的用户,返回 404 错误

请求示例

{
  "Username": "e011891"
}

响应示例

{
  "code": 0,
  "message": "ok",
  "data": {
    "member": {
      "id": "u-021",
      "name": "yetailin",
      "display_name": "叶泰林",
      "employee_number": "e011891",
      "title": "后端工程师",
      ...
    }
  }
}

2. 用户详情(/org/users/:id)

该接口集成 CodeBuddy API,实现跨平台用户匹配。

工作流程

  1. 接收 CodeBuddy 用户 ID(如 da7dc1b0-439f-42f8-902e-acaba3c88714
  2. 调用 CodeBuddy API: GET /api/v1/enterprises/{enterprise_id}/users?keyword={id}
  3. 从 CodeBuddy 响应中获取用户的 nickname(工号)
  4. 使用工号匹配本地成员的 employee_number
  5. 返回本地成员的完整信息(包括所属部门),但 id 字段使用 CodeBuddy 的 ID

配置要求

  • 需要在 .env 中配置 CODEBUDDY_SERVICE_HOSTCODEBUDDY_API_TOKEN
  • 如果未配置,接口会降级为直接查询本地数据

响应示例

{
  "code": 0,
  "message": "ok",
  "data": {
    "member": {
      "id": "da7dc1b0-439f-42f8-902e-acaba3c88714",  // CodeBuddy ID
      "name": "yetailin",
      "display_name": "叶泰林",
      "employee_number": "e011891",
      ...
    },
    "nodes": [...]  // 所属部门信息
  }
}

3. 详细日志记录

服务内置了完整的请求日志中间件,记录:

  • 请求 URL、Method、Query、Headers、Body
  • 响应状态码、耗时、Body
  • 每个请求分配唯一的 requestId 便于追踪

日志示例

[2025-01-30T10:30:45.123Z] [a1b2c3d4] ==================== REQUEST ====================
[a1b2c3d4] Method: POST
[a1b2c3d4] URL: http://localhost:9000/org/members/resolve
[a1b2c3d4] Body: {"Username": "e011891"}
[a1b2c3d4] ==================== RESPONSE ===================
[a1b2c3d4] Status: 200
[a1b2c3d4] Duration: 15ms
[a1b2c3d4] Body: {"code": 0, "message": "ok", "data": {...}}

扩展开发

接入真实数据源

  1. 修改 src/data/dataStore.ts 中的数据加载逻辑
  2. 替换静态 JSON 加载为数据库/API 查询
  3. 保持接口不变,CodeBuddy 无需修改配置

添加新字段

  1. src/types/index.ts 中更新类型定义
  2. 在数据文件中添加对应字段
  3. 控制器会自动透传新字段

部署配置

生产环境部署

项目已配置为可部署到远程服务器。参考配置:

服务器信息

  • 地址:120.79.95.108
  • 部署目录:/data/app/codebuddy-org-sync
  • 端口:9000

部署步骤

  1. 将代码上传到服务器
  2. 复制并配置 .env 文件
  3. 安装依赖:npm install
  4. 构建项目:npm run build
  5. 启动服务:npm start

生产环境变量示例

PORT=9000
NODE_ENV=production
AUTH_TOKEN=test-token-12345
ENTERPRISE_ID=your-enterprise-id
CODEBUDDY_SERVICE_HOST=https://1229miliiwang.copilot-staging.qq.com
CODEBUDDY_API_TOKEN=your-production-token

注意事项

  1. 鉴权: 除 /org/health 外,所有接口都需要 Authorization: Bearer <token> 请求头
  2. 工号匹配: /org/members/resolve/org/users/:id 都依赖工号(employee_number)进行匹配
  3. CodeBuddy 集成: /org/users/:id 需要配置 CodeBuddy API 才能正常工作,否则会降级为本地查询
  4. 搜索: 搜索接口必须同时支持精准搜索 (fuzzy=false) 和模糊搜索 (fuzzy=true)
  5. 分页: 成员列表接口支持分页,默认每页 20 条
  6. 响应格式: 统一返回 { code, message, data } 格式
  7. 日志: 所有请求都会被详细记录,便于排查问题

技术栈

  • 运行时: Node.js 18+
  • 语言: TypeScript 5.x
  • Web 框架: Express.js 4.x
  • 数据存储: 静态 JSON 文件
  • 外部集成: CodeBuddy API (可选)
  • 中间件:
    • helmet - 安全增强
    • cors - 跨域支持
    • 自定义鉴权中间件
    • 自定义日志中间件

项目结构

src/
├── controllers/        # 控制器(业务逻辑)
│   └── orgController.ts
├── data/              # 静态数据文件
│   ├── dataStore.ts   # 数据管理类
│   ├── members.json   # 成员数据
│   └── org-nodes.json # 组织架构数据
├── middleware/        # 中间件
│   ├── auth.ts        # Bearer Token 鉴权
│   ├── errorHandler.ts # 错误处理
│   └── logger.ts      # 请求日志记录
├── routes/            # 路由定义
│   └── org.ts
├── types/             # TypeScript 类型定义
│   └── index.ts
└── index.ts           # 入口文件

License

MIT

About

No description, topics, or website provided.
Language
TypeScript100%