Files
qiji/政企周报管理系统-设计文档.md
T
v6ole a1886074dd 企迹(qiji) 政企周报管理系统 — v0.1
后端: 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>
2026-06-24 08:30:12 +08:00

10 KiB
Executable File
Raw Blame History

企迹 (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 前端部署于云服务器 nginxHTTPS 访问
  4. 开发阶段前后端均在本地运行,联调结构与生产一致
  5. Casdoor、PostgreSQL、MinIO、企业微信应用均为已有基础设施,本系统作为新接入方