a1886074dd
后端: FastAPI + SQLAlchemy 2.0 (async) + Alembic + MinIO + Casdoor + 企微 前端: Vue 3 + Vite + TypeScript + Element Plus + Pinia 功能清单: - 8 张数据表自动建表 / Casdoor OIDC 登录 / 企微静默登录 - 双布局: 移动端(填报) + PC端(汇总管理) - 拜访记录 CRUD + MinIO 照片直传 + 缩略图预览 + 同访人草稿 - 今日纪要 (6 分类) / 工作计划 / 小微商机 / 要客拜访 CRUD - 客户档案: 备注/收支费用/联系人/归属分配/批量转移 - 客户导入导出 + 模板下载 + 搜索/分页/筛选 - 仪表盘: 四卡统计 + 填报进度 (拜访+纪要双维度) - 周报详情: 五 Tab + 按人/客户筛选 + 时间轴 - 用户管理 / 客户经理 PC 端工作台 - 企微: 催办/公告/定时提醒 / 时区修正 - Docker 部署配置 Co-Authored-By: Claude <noreply@anthropic.com>
269 lines
10 KiB
Markdown
Executable File
269 lines
10 KiB
Markdown
Executable File
# 企迹 (qiji) — 政企周报管理系统 设计文档
|
||
|
||
## 项目背景
|
||
|
||
中国电信政企客户经理团队目前使用 Excel 进行周报管理,包含四个 Sheet:每日拜访记录、下周工作计划、小微业务商机跟单、要客拜访计划。现有方式存在填报效率低、无法挂载照片、汇总查看不便、考核靠人工点名扣分、客户数据无法沉淀等问题。
|
||
|
||
本系统以 FastAPI + Vue 3 构建,部署在本地服务器 + 云服务器的混合拓扑上,对接已有的 Casdoor(认证)、PostgreSQL(数据库)、MinIO(文件存储)、企业微信(消息推送与快捷入口)。
|
||
|
||
## 用户规模与角色
|
||
|
||
小型支局,约 5-8 人:3-5 名客户经理 + 1 名支局长 + 偶尔分管领导查看。
|
||
|
||
### 角色权限矩阵
|
||
|
||
| 角色 | 数据可见性 | 操作权限 |
|
||
|------|-----------|---------|
|
||
| 客户经理 | 只看自己的拜访记录、工作计划、商机、要客拜访 | 填/改/删自己的记录,上传照片,新建客户 |
|
||
| 支局长 | 全支局所有人的所有数据 | 增删改所有人记录,导出汇总,查看填报统计,手动触发催办/推送公告,管理客户档案与归属分配 |
|
||
| 分管领导 | 同支局长全量视图 | 仅查看和导出,不可编辑 |
|
||
|
||
## 技术架构
|
||
|
||
```
|
||
本地服务器(内网)
|
||
├── FastAPI (uvicorn, port 8000)
|
||
├── PostgreSQL(已有,复用)
|
||
└── MinIO(已有,复用)
|
||
|
||
云服务器
|
||
└── Vue 3 前端 (nginx, port 443, 域名)
|
||
↕ API 请求走 HTTPS → 本地服务器公网映射端口
|
||
|
||
Casdoor(已有部署,OIDC)
|
||
企业微信(管理后台创建自建应用)
|
||
```
|
||
|
||
开发阶段前后端均在本地:`localhost:8000` + `localhost:5173` 联调。
|
||
|
||
### 后端:FastAPI
|
||
|
||
- 单体应用,FastAPI + SQLAlchemy (async) + Alembic 做数据迁移
|
||
- JWT 鉴权,token 签发与验证对接 Casdoor OIDC
|
||
- 文件上传:客户端获取 MinIO 预签名 URL 直传,API 只记录 object key
|
||
- 定时任务:APScheduler,每日 18:00 检查填报情况触发企微提醒
|
||
|
||
### 前端:Vue 3
|
||
|
||
- Vue 3 + Vite + TypeScript
|
||
- 组件库:Element Plus(中文生态好,表格/表单组件成熟)
|
||
- 两套适配布局:PC Web 端(支局长/分管领导汇总查看)+ 移动端(客户经理外勤快速填报,也是企微应用落地页)
|
||
|
||
### 存储:MinIO
|
||
|
||
- 组织方式:`{date}/{manager}/{uuid}.jpg`
|
||
- 单张限制 10MB,一次拜访最多 9 张
|
||
- 上传走预签名 URL,绕过 API 中转
|
||
- 查看走预签名下载 URL(有效期 1 小时)
|
||
- 缩略图由 MinIO 策略自动生成
|
||
- 删除拜访记录时同步清理关联照片
|
||
|
||
### 认证:Casdoor
|
||
|
||
- FastAPI 作为 OIDC Relying Party
|
||
- 用户在 Casdoor 已分配角色(客户经理 / 支局长 / 分管领导),JWT 携带角色信息
|
||
- 企业微信用户绑定 Casdoor 账号后,可实现企微内静默登录
|
||
|
||
## 数据模型
|
||
|
||
共 7 张核心表,全部使用 PostgreSQL。
|
||
|
||
### customers — 客户档案
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | UUID | 主键 |
|
||
| name | VARCHAR(200) | 单位名称 |
|
||
| industry | VARCHAR(100) | 所属行业 |
|
||
| address | VARCHAR(500) | 单位地址 |
|
||
| in_use_services | TEXT | 在用业务(枚举文本) |
|
||
| monthly_fee | VARCHAR(100) | 月使用费 |
|
||
| created_by | UUID → users.id | 创建人 |
|
||
| created_at | TIMESTAMP | |
|
||
| updated_at | TIMESTAMP | |
|
||
|
||
### customer_contacts — 客户联系人
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | UUID | 主键 |
|
||
| customer_id | UUID → customers.id | 所属客户 |
|
||
| name | VARCHAR(50) | 联系人姓名 |
|
||
| phone | VARCHAR(20) | 联系方式 |
|
||
| role_desc | VARCHAR(100) | 角色描述(如"技术对接人") |
|
||
|
||
### customer_assignments — 客户经理归属
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | UUID | 主键 |
|
||
| customer_id | UUID → customers.id | |
|
||
| manager_id | UUID → users.id | |
|
||
| role | VARCHAR(20) | 'primary' / 'assistant' |
|
||
| assigned_at | TIMESTAMP | 分配时间 |
|
||
| assigned_by | UUID → users.id | 操作人(支局长) |
|
||
|
||
支持归属转移:支局长修改 `manager_id` 即可,历史拜访记录保留在 `visits.manager_id` 原值不变。
|
||
|
||
### visits — 每日拜访记录(对应"周报"sheet)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | UUID | 主键 |
|
||
| customer_id | UUID → customers.id | 走访单位 |
|
||
| visit_date | DATE | 拜访日期 |
|
||
| visit_method | VARCHAR(20) | 上门/电话/微信/出差 |
|
||
| time_range | VARCHAR(30) | 如 "9:00-10:00" |
|
||
| communication_content | TEXT | 沟通内容 |
|
||
| customer_demand | TEXT | 客户需求 |
|
||
| companions | UUID[] | 同访人员 ID 数组 |
|
||
| photos | TEXT[] | MinIO object key 数组 |
|
||
| manager_id | UUID → users.id | 客户经理 |
|
||
| created_at | TIMESTAMP | |
|
||
| updated_at | TIMESTAMP | |
|
||
|
||
### work_plans — 下周工作计划
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | UUID | 主键 |
|
||
| customer_id | UUID → customers.id | 计划走访单位 |
|
||
| plan_content | TEXT | 工作计划 |
|
||
| plan_date | DATE | 计划拜访时间 |
|
||
| manager_id | UUID → users.id | |
|
||
| status | VARCHAR(20) | 计划中/已完成/已取消 |
|
||
|
||
### mini_business — 小微业务商机(对应"小微业务"sheet)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | UUID | 主键 |
|
||
| customer_id | UUID → customers.id | 单位名称 |
|
||
| product_type | VARCHAR(200) | 产品类型 |
|
||
| amount | VARCHAR(100) | 金额 |
|
||
| follow_up_detail | TEXT | 跟进内容具体情况 |
|
||
| status | VARCHAR(50) | 跟进状态 |
|
||
| manager_id | UUID → users.id | |
|
||
| expected_revenue_date | VARCHAR(50) | 预计列收时间 |
|
||
|
||
### key_visits — 要客拜访计划
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | UUID | 主键 |
|
||
| customer_id | UUID → customers.id | 单位 |
|
||
| urgency_level | VARCHAR(10) | 紧急重要度:重要/一般/紧急 |
|
||
| description | TEXT | 内容描述 |
|
||
| progress_status | VARCHAR(20) | 进展状态 |
|
||
| planned_date | VARCHAR(50) | 计划拜访时间 |
|
||
| planned_visitor | VARCHAR(100) | 计划拜访人 |
|
||
| visit_target | VARCHAR(100) | 拜访对象 |
|
||
| manager_id | UUID → users.id | |
|
||
|
||
### users — 用户(对接 Casdoor)
|
||
|
||
| 字段 | 类型 | 说明 |
|
||
|------|------|------|
|
||
| id | UUID | 主键 |
|
||
| casdoor_id | VARCHAR(100) | Casdoor 用户 ID |
|
||
| name | VARCHAR(50) | 姓名 |
|
||
| role | VARCHAR(30) | manager / director / leader |
|
||
| department | VARCHAR(100) | 部门 |
|
||
| wecom_userid | VARCHAR(100) | 企业微信 userid |
|
||
|
||
## 核心功能设计
|
||
|
||
### 一、客户经理填报
|
||
|
||
**入口**:移动端「今日拜访」按钮 + 企微工作台菜单「今日拜访」。
|
||
|
||
**表单字段**:
|
||
|
||
- 客户单位:下拉选择(仅显示自己负责的客户 + 自己新建的客户),支持搜索,支持快速新建客户
|
||
- 选择客户后自动带出联系人信息
|
||
- 拜访日期:默认今天
|
||
- 拜访方式:单选(上门 / 电话 / 微信 / 出差)
|
||
- 时间范围:两个时间选择器
|
||
- 同访人员:多选,选了谁自动在对方账号下创建一条预填草稿(沟通内容留空让对方补)
|
||
- 沟通内容:自由文本
|
||
- 客户需求:自由文本(用于汇总时的关键字提取)
|
||
- 拜访照片:最多 9 张,拍照或从相册选,走 MinIO 预签名直传
|
||
|
||
**首页状态**:显示「今天已录入 N 条」,下方为当天已填记录的摘要卡片列表。
|
||
|
||
### 二、支局长汇总视图
|
||
|
||
**仪表盘首页**:
|
||
|
||
- 四张数字卡片:本周拜访次数、工作计划条数、商机跟单条数、要客拜访条数
|
||
- 填报进度条:每个客户经理的填报情况(已填/未填),未填人员红色标记 ⚠
|
||
- 快捷入口:本周周报详情、导出 Excel、历史周报
|
||
|
||
**周报详情页**:四个 Tab 对应四个业务模块
|
||
|
||
- 支持按人筛选、按客户筛选
|
||
- 时间轴模式按天分组
|
||
- 照片缩略图,点击放大查看
|
||
- 一键导出 Excel(格式与现有模板一致)
|
||
|
||
**考核与催办**:
|
||
|
||
- 每日 18:00 自动检查,企微推送提醒未填报的客户经理
|
||
- 支局长可手动点击「催办」按钮,选择人员发送应用消息
|
||
- 支局长可编辑一条自定义公告,推送到全员企微
|
||
- 支局长可设置"当日最低拜访条数"阈值,低于阈值也预警
|
||
|
||
### 三、分管领导视图
|
||
|
||
与支局长相同的全量数据视图,所有编辑按钮灰色禁用。核心目标是随时打开看,首屏加载 1 秒以内。
|
||
|
||
### 四、客户档案管理
|
||
|
||
- 独立客户档案,包含单位基本信息、在用业务、月使用费、关键联系人
|
||
- 客户经理—客户归属关系(主负责 / 协办),支局长统一管理分配
|
||
- 支持批量导入:从存量收入清单 Excel 导入客户和归属关系
|
||
- 客户查重:建客户时自动提示疑似重复,支局长定期合并
|
||
- **归属转移**:客户经理离职时,支局长将客户批量转移给新同事,历史拜访记录完整保留在原客户经理名下
|
||
|
||
### 五、数据导入导出
|
||
|
||
- **导入**:上传旧周报 Excel → 系统解析 sheet → 预览匹配字段 → 确认导入;同一天同一人同一客户自动跳过不重复
|
||
- **导出**:支局长点击「导出本周周报」,生成与原 Excel 模板格式完全一致的四 sheet .xlsx 文件
|
||
|
||
## 企业微信集成
|
||
|
||
### 工作台菜单
|
||
|
||
| 菜单名称 | 跳转目标 |
|
||
|---------|---------|
|
||
| 今日拜访 | 移动端填报页 |
|
||
| 本周周报 | 支局长汇总视图 |
|
||
| 客户查询 | 客户档案搜索页 |
|
||
|
||
### 登录流程
|
||
|
||
1. 用户从企微菜单进入,前端拿企微 `code` 换取 `userid`
|
||
2. 服务端用 `userid` 查找已绑定的 Casdoor 账号
|
||
3. 已绑定:直接签发 JWT,用户无感进入系统
|
||
4. 未绑定:引导去 Casdoor 完成一次账号绑定,之后永久生效
|
||
|
||
### 消息推送
|
||
|
||
| 场景 | 方式 | 触发 |
|
||
|------|------|------|
|
||
| 每日填报提醒 | 应用消息 → 未填人员 | 每日 18:00 自动 |
|
||
| 手动催办 | 支局长选人 → 发送应用消息 | 手动 |
|
||
| 支局长公告 | 编辑公告 → 发应用消息 → 全员 | 手动 |
|
||
|
||
### 后续扩展(首期不做)
|
||
|
||
- 企微聊天侧边栏:在跟客户的聊天窗口右侧弹出拜访记录入口,自动带入客户信息
|
||
|
||
## 部署说明
|
||
|
||
1. FastAPI 后端部署于本地服务器,通过内网访问 PostgreSQL 和 MinIO
|
||
2. API 端口通过公网映射暴露给云服务器上的前端
|
||
3. Vue 前端部署于云服务器 nginx,HTTPS 访问
|
||
4. 开发阶段前后端均在本地运行,联调结构与生产一致
|
||
5. Casdoor、PostgreSQL、MinIO、企业微信应用均为已有基础设施,本系统作为新接入方
|