📌 项目概述
玖朝雲启是一家专注于企业服务的公司,核心业务包括腾讯电子签、腾讯云等SaaS产品的渠道销售与客户管理。
项目背景
- 原为腾讯电子签官网项目的一个子模块,后于 2026-05-28 独立拆分为 CRM 项目
- 设计为面向渠道销售团队的客户关系管理系统(非传统CRM,而是电子签业务定制)
- 管理销售 → 创建线索 → 跟进商机 → 转客户 → 下单发货 → 售后续费的全流程
当前状态
🟢 生产运行中
📊 510 客户
📦 783 订单
📋 21,546 线索
👥 3 用户
团队规模
| 角色 | 姓名 | 账户 | 职能 |
| 管理员 / 销售主管 | 郑思宇(老板) | staff001 | 系统管理、审批、销售 |
| 销售 | 武海峰 | cmobdmg0j... | 线索跟进、客户转正、提单发货 |
| 财务 / 发货 / 线索分配 | 郑向影 | cmobfbrdn... | 财务审批、发货确认、线索分配 |
⚙️ 技术架构
技术栈
| 层 | 技术 | 版本 |
| 前端框架 | Next.js (App Router) | 16.2.4 |
| 构建工具 | Turbopack | 内置于Next.js |
| 语言 | TypeScript | 5.x |
| ORM | Prisma | 7.7.0 |
| 数据库 | SQLite | 内置 |
| UI组件 | 自定义 + Tailwind CSS | — |
| 图表 | Recharts | — |
| AI助手 | 阿狸 (ali-server.mjs) | DeepSeek API |
| 登录 | 自定义Cookie Session + 企业微信OAuth | — |
系统架构
├── 官网 (tencentesign.com)
│ ├── Next.js + Prisma + SQLite
│ ├── 端口 3000, PM2: esign-website
│ └── 数据库: prisma/dev.db (独立)
│
├── CRM (jiuzhaoyunqi.com)
│ ├── Next.js + Prisma + SQLite
│ ├── 端口 3001, PM2: crm-website
│ ├── 数据库: prisma/dev.db (主库) + prisma/ali.db (阿狸库)
│ └── AI助手: ali-server.mjs (端口 3002, PM2: ali)
│
├── Nginx 反向代理
│ ├── esign → 3000 (HTTPS)
│ └── jiuzhaoyunqi → 3001 (HTTP,SSL待申请)
│
└── Cron 定时任务
├── crm-cron (PM2进程)
├── 9:05 expiry-check (合同过期检查)
├── 9:00 renewal-remind (续费提醒)
└── 9:10 opportunity-drop-check (商机掉落)
关键组件
| 组件 | 路径 | 说明 |
| 认证 | lib/auth.ts | Cookie session + HMAC签名, 支持多角色 |
| 权限 | lib/permissions.ts | 6种角色, 26项权限, 角色-权限映射表 |
| 通知 | lib/notify.ts | 站内信系统, 6种通知类型 |
| 阿狸AI | lib/ali-core/ | 9模块架构, DeepSeek API, 38个工具函数 |
| 共享组件 | components/crm/ | LeadCard, LeadDetailPanel (2026-06-15新增) |
| 企业微信 | lib/wecom-oauth.ts | OAuth免登, 消息通知 |
📦 代码仓库
仓库结构
/Users/jiuchaoyunqi/WorkBuddy/研发/
├── crm-website/ ← CRM 项目(主项目)
│ ├── app/ Next.js App Router
│ │ ├── api/ API 路由 (67个route.ts)
│ │ └── crm/ CRM 前端页面
│ ├── components/ 共享组件
│ │ └── crm/ 业务组件 (LeadCard, DetailPanel等)
│ ├── lib/ 工具库 (auth, permissions, notify, ali-core)
│ ├── prisma/ Schema + 数据库
│ ├── scripts/ 初始化脚本
│ └── package.json
│
├── esign-website/ ← 官网项目(独立)
│ └── (同上结构,数据库独立)
│
└── .workbuddy/
└── memory/ 智能体记忆
├── MEMORY.md 长期记忆
└── YYYY-MM-DD.md 每日工作日志
⚠️ CRM 项目无 git 仓库(2026-05-31 待初始化)
🛠️ 开发环境
前置要求
- Node.js 22.22.2 (本地开发) / Node.js 20.20.2 (服务器)
- npm 内置
- SSH Key:
~/.ssh/workbuddy.pem
本地运行
cd /Users/jiuchaoyunqi/WorkBuddy/研发/crm-website
# 安装依赖(如果 node_modules 不存在)
npm install
# 本地开发(使用本地 dev.db)
DATABASE_URL='file:./prisma/dev.db' npx prisma generate
DATABASE_URL='file:./prisma/dev.db' npm run dev
# 本地构建验证
cd / && rm -rf /path/.next # 先切目录再删防锁定
cd /path && node node_modules/.bin/next build
当地 .env 要求
DATABASE_URL="file:./prisma/dev.db" # ⚠️ 必须指向 prisma/ 下
NEXTAUTH_SECRET=... # session签名密钥
WECOM_CORP_ID=wwdb672a1af0855622 # 企业微信
WECOM_AGENT_ID=1000020 # 企微应用ID
WECOM_SECRET=... # 企微应用Secret
CRON_SECRET=... # 定时任务Token
CRM_API_TOKEN=... # 外部导入API Token
🚀 部署信息
服务器信息
| 项目 | 值 |
| IP | 150.158.137.193 |
| SSH Key | ~/.ssh/workbuddy.pem |
| 用户 | ubuntu |
| Node.js | /usr/bin/node (v20.20.2) |
| PM2 版本 | 5.x |
| nginx 配置 | /etc/nginx/sites-available/ |
PM2 进程
| 名称 | 端口 | 路径 |
| crm-website | 3001 | /home/ubuntu/crm-website/ |
| esign-website | 3000 | /home/ubuntu/esign-website/ |
| ali (阿狸) | 3002 | /home/ubuntu/crm-website/lib/ali-server.mjs |
| crm-cron | — | /home/ubuntu/crm-website/lib/cron-worker.mjs |
🔴 部署铁律(必看!)
- 最可靠部署方式:rsync 全量同步(禁止使用 deploy.sh,会漏文件)
- PM2 重启:必须
pm2 delete + pm2 start,不能用 restart --update-env
- PM2 命令格式:
PORT=3001 pm2 start npm --name crm-website --cwd /path -- start(不要加 -p 3001)
- 部署后修复 .env:sed 替换 DATABASE_URL 时要 确认 ALI_DATABASE_URL 没有被误改
- 部署后重建 ali-client:
npx prisma generate --config=prisma/ali.config.ts
- 验证文件同步:rsync 成功后 ssh 到服务器
stat -c '%y' 文件 对比每个改动文件的时间戳
- 验证构建产物:构建后 grep 确认新常量/函数名存在于 .next 中
部署前检查清单(13项)
- 本地 clean build 通过
- 关键文件行数验证(本地 vs 服务器)
- 服务器 PM2 状态(4 个进程 online)
- 端口占用(3000 + 3001 + 3002)
- nginx 配置(sudo nginx -t)
- 磁盘空间(df -h /,需 >10G)
- 数据库备份(到 backups/)
- 根目录无空 dev.db
- Schema 模型完整(model Customer, Lead)
- .env DATABASE_URL 正确
- 服务器 Git 干净
- JSON 默认值检查(Sqlite:空字符串 → 修复)
- 自省复盘(记录新坑、优化点、老板反馈)
部署命令速查
# rsync 全量同步(CRM)
rsync -avz --delete --exclude='node_modules' --exclude='.next' \
--exclude='prisma/dev.db*' --exclude='backups/' --exclude='.git' \
--exclude='ali-skills' --exclude='.env' --exclude='public/uploads' \
-e "ssh -i ~/.ssh/workbuddy.pem" \
./ ubuntu@150.158.137.193:/home/ubuntu/crm-website/
# 服务器构建
ssh -i ~/.ssh/workbuddy.pem ubuntu@150.158.137.193 \
"cd /home/ubuntu/crm-website && cd / && rm -rf /home/ubuntu/crm-website/.next ..."
"&& cd /home/ubuntu/crm-website && DATABASE_URL='file:./prisma/dev.db' npm run build"
# PM2 重启
PORT=3001 pm2 start npm --name crm-website --cwd /home/ubuntu/crm-website -- start
SSH 快捷登录
ssh -i ~/.ssh/workbuddy.pem ubuntu@150.158.137.193
🎯 关键功能
核心业务流程
线索公海 → 领取 → 我的商机 → 转客户 → 创建订单 → 提单发货 → 审批流 → 续费/流失
(leads_public) (claim) (my opps) (customer) (order) (deliver) (approve) (renew/lost)
1. 线索管理(4个池子)
| 池子 | 入口 | 数据范围 | 关键操作 |
| 线索管理 | /crm/leads | poolType=leads 的线索 | 批量导入、分配、意向度变更 |
| 资料公海 | /crm/leads-public | poolType=leads_public | 标签、跟进、标记无效、非0意向→自动领取 |
| 我的商机 | /crm/my-opportunities | poolType=private | 商机编辑、转客户、报价、掉落倒计时 |
| 商机公海 | /crm/opportunity-public | poolType=opportunity_public | 领取、掉落原因、原跟进人 |
2. 客户管理
- 状态流:pending(待审批) → approved(已审批) → finance_confirmed(财务确认) → shipped(已发货) → completed(已完成)
- 标签页:全部、本月、本周、已流失、已过期、即将到期、待审批、已驳回、已审批、财务确认、待提单、已发货、已完成
- 每个标签页右上角有计数角标(2026-06-15 最新改动)
- 归属:管理员看全部、主管看本部门、销售只看自己的
3. 订单与发货
- 提单 → 主管审批 → 财务审批 → 发货员确认
- 状态:pending → approved → finance_approved → completed
- 通知:提单后自动发站内信给主管,主管找不到→转给管理员兜底
4. 站内信系统
| 类型 | 触发条件 |
| expiry_confirm | 合同到期,发站内信给销售确认续费意向 |
| expiry_drop | 7天未确认或30天缓冲期过→掉商机公海 |
| approval_notify | 订单/提单需要审批 |
| customer_approval | 新客户审批通过 |
| delivery_notify | 发货通知 |
| renewal_remind | 合同即将到期提醒 |
5. 续费与过期机制
- 合同到期当天 → 发站内信给销售(7天确认期)
- 7天内销售确认"续费" → 30天缓冲期
- 7天内销售确认"不续费" → 标记 lost
- 7天未操作 → 自动掉商机公海 + 标记 lost
- 30天缓冲期满无订单 → 掉商机公海
6. 商机3天/30天掉落
- 3天未跟进 → 第2天发提醒 → 第3天掉公海,原销售3天禁领
- 30天未成交 → 第27-29天发提醒 → 第30天掉公海
7. 阿狸 AI 助手
- 独立 PM2 进程(ali),端口 3002
- 9 个模块(config/db/session/middleware/web/tools/tool-engine/router/index)
- 38 个 Function Calling 工具,支持流式 SSE
- 前端:ali-chat.html 骨架 + ali-chat.css 样式 + ali-chat.js 逻辑
- 数据库:prisma/ali.db(独立 SQLite,Prisma 7 + LibSQL adapter)
8. 权限体系
| 角色 | 数据范围 | 关键权限 |
| admin (管理员) | 全部 | 所有操作 |
| sales_manager (主管) | 本部门 | 审批、分配、查看全部 |
| sales (销售) | 自己的 | 创建线索/客户/订单、提单、开发票 |
| finance (财务) | 财务助手 | 财务确认、合同校对、工资核算 |
| shipper (发货员) | 发货助手 | 发货确认 |
| channel_manager (渠道经理) | 渠道管理 | 渠道客户、结算 |
| leads_assigner (线索分配员) | 线索公海 | 导入线索、分配线索 |
⚠️ 2026-06-10 全面审计修复 修正了finance/shipper/channel_manager越权问题、ownerId参数越权漏洞、17个页面角色检查缺失
🗄️ 数据库设计
核心模型
| 模型 | 记录数 | 关键字段 |
| Customer | 510 | ownerId, ownerName, status(生命周期), contractEndAt, lifecycle(active/lost) |
| Order | 783 | customerId, status, paymentAmount, totalCopies, isShipped |
| Lead | 21,546 | intentLevel(0-100), poolType, assignedToId, followUpLogs(Json) |
| User | 3 | role(主角色), permissions(Json), wecomUserId |
| OrderDeliveryRecord | 774 | orderId, status(pending->completed), deliverCopies |
| Notification | 385 | userId, type, title, content |
| OrderItem | 835 | orderId, copies, years, version |
关键设计决策
- ownerId vs ownerName:Customer 表 ownerId 存储 User.id,ownerName 存中文名用于显示。⚠️ 历史数据 ownerId 误存为"system",2026-06-10已批量修复
- followUpLogs:Prisma Json 字段,存储为 JSON 字符串数组。前端读取时必须 JSON.parse 或使用 parseFollowUpLogs() 安全解析。不能直接当数组访问
- Prisma 7 特殊处理:ali.db 使用 Prisma 7 + PrismaLibSql adapter,需要在 ali.config.ts 中独立配置。主 schema 的 prisma generate 不会生成 ali-client,需额外执行
--config=prisma/ali.config.ts
- SQLite NULL != value:Prisma where.field = { not: "approved" } 会翻译为 WHERE field != "approved",SQLite 中 NULL != "approved" 为 NULL(非TRUE)。必须显式 OR [{ field: null }, { field: { not: value } }]
- _UserRoles 表:Prisma 隐式多对多表,A=UserId, B=RoleId。⚠️ 历史上A/B列曾反转,2026-06-09已修复,但仍残存反转行(不影响查询)
Json 字段注意事项
⚠️ 禁止手动 JSON.stringify() Prisma 7 的 Json? 字段在写入时自动 JSON.stringify,读取时自动 JSON.parse。手动 JSON.stringify 会导致双重编码,数据库存为 "[{"...}]" 而不是 [{"...}],页面上 .filter() 会报错。
SQLite 中新增 Json 字段不会自动给默认值,必须事后手动 UPDATE:
UPDATE Customer SET editHistory = '[]' WHERE editHistory IS NULL OR editHistory = '';
🔌 API 文档
认证方式
- 用户登录:Cookie session(crm_session),HMAC 签名,httpOnly
- Cron 任务:x-cron-token 头(CRON_SECRET 环境变量)
- 外部导入:/api/leads/public-submit 使用 CRM_API_TOKEN(Bearer Token)
- 企微免登:/api/wecom/auth + /api/auth/auto-login
核心 API 列表
| 路由 | 方法 | 鉴权 | 说明 |
| /api/customers | GET | getSessionUser + role check | 客户列表(含 tabCounts 计数) |
| /api/customers/[id] | GET | getSessionUser + canViewCustomer | 客户详情(2026-06-10改:之前requireRole排除了finance) |
| /api/leads | GET/POST/PATCH | getSessionUser | 线索管理。POST需登录。PATCH含ownership校验 |
| /api/leads/pool | GET/PATCH | requireAuth | 公海池。PATCH含 checkLeadAccess 校验 |
| /api/orders/[id]/deliver | POST | requirePermission("delivery_submit") | 提单发货。含通知(主管→admin兜底) |
| /api/financial-summary | GET | requirePermission("finance_confirm") | 财务总览(2026-06-10修复前仅需登录) |
| /api/cron/expiry-check | POST | CRON_SECRET | 每日9:05,合同过期→通知+掉落 |
关键响应格式
// GET /api/customers
{
"customers": [...],
"total": 510,
"totalOrders": 783,
"totalAmount": 1966355,
"counts": { "active": 499, "lost": 11, "total": 510 },
"tabCounts": {
"active": 499, "lost": 11, "total": 510,
"pending": 0, "rejected": 0, "approved": 13,
"this_week": 0, "this_month": 0
}
}
// 错误响应格式
{ "error": "无权访问", "status": 403 }
{ "error": "权限不足", "status": 403 }
💰 财务核算与提成规则
毛利率计算
| 订单类型 | 毛利率公式 |
| 新开 | 回款 × 30% |
| 续费 | 回款 × 10% |
| 线索单 | 以上 × 30% |
| 渠道订单 | 回款 × 1% |
提成阶梯
| 毛利区间 | 提成比例 |
| 0 — 5,000 | 10% |
| 5,000 — 10,000 | 15% |
| 10,000 — 20,000 | 20% |
| 20,000+ | 30% |
净利润公式
净利润 = 毛利 - 工资成本(底薪+绩效+提成) - 发货成本 - 均摊成本
净利率 = 净利润 / 回款 × 100%(分母是回款,不是收入)
返佣规则
- 结算周期:次月底结算上月 → 算 N 月返佣用 N-1 月发货成本
- 估算公式:新开发货成本 × 40%,续费 × 35%
- 实际录入:RebateAdjustment 表(year + month @@unique)
- 当月显示:按日实时更新;历史月用实际数据
支付金额校准
电子签标准定价:1200 元/年起。订单系统的 paymentAmount 按实际合同金额存储。
🕳️ 完整踩坑清单(46条)
以下是从2025年项目启动至今的所有技术踩坑记录,按类别整理。新智能体接手项目时务必通读!
部署相关
| # | 坑 | 正确做法 |
| 1 | 服务器根目录有空 dev.db,Prisma 可能读取错误路径 | 必须用 DATABASE_URL='file:./prisma/dev.db' |
| 2 | deploy.sh 会漏文件 | 永远用 rsync |
| 3 | PM2 restart --update-env 不生效 | 必须 pm2 delete + pm2 start |
| 4 | PM2 --cwd + -p 3001 参数冲突 | PORT=3001 pm2 start npm --name xxx --cwd /path -- start |
| 5 | rsync --delete 删了 public/uploads | 必须加 --exclude='public/uploads' |
| 6 | rsync 成功≠文件更新 | 部署后 ssh stat -c '%y' 逐个验证 |
| 7 | 构建后未验证产物 | grep 关键函数名在 .next/ 中确认存在 |
| 8 | .next 缓存损坏 | cd / && rm -rf /path/.next(切根目录删除防锁定) |
| 9 | sed 替换 DATABASE_URL 误改 ALI_DATABASE_URL | 事后 grep 确认两个 URL 正确 |
| 10 | ali-client 被 .prisma 清理后丢失 | 部署后 npx prisma generate --config=prisma/ali.config.ts |
Prisma / SQLite
| # | 坑 | 正确做法 |
| 11 | Prisma Json? 手动 JSON.stringify 双重编码 | 不要手动调,Prisma 自动序列化 |
| 12 | SQLite NULL != value 陷阱 | 必须显式 OR [{ field: null }, { field: { not: value } }] |
| 13 | Prisma db push 新 Json 字段不给默认值 | 事后手动 UPDATE SET field = '[]' |
| 14 | Prisma in 查询不能混 null 和字符串 | 用 OR 条件拆开 |
| 15 | Json 字段不能是空字符串 | 必须是 null 或有效 JSON |
| 16 | Prisma 7 单独 ESM 文件需特殊导入 | 从 .prisma/client/index.js 导入 + PrismaLibSql adapter |
前后端
| # | 坑 | 正确做法 |
| 17 | CRM 认证用 getSessionUser(req) 不是 next-auth | 使用 lib/auth.ts 中的 getSessionUser |
| 18 | Server Component 不能用 onClick | 拆成独立 Client Component |
| 19 | Next.js 16 params 必须是 Promise | params: Promise<{ id: string }>,需 await |
| 20 | Next.js prefetch 加载其他页 JS chunk | 所有 API 返回值加防御性检查 |
| 21 | React 受控 input value 必须有 || "" 保护 | 防止 undefined→uncontrolled 警告 |
| 22 | App Router 必须有根 layout 导入 globals.css | 否则 Tailwind 不生效 |
| 23 | 服务器 tsconfig 比本地更严格 | 加 "noImplicitAny": false 保底 |
| 24 | Next.js Image 组件需 sharp 库 | 用原生 <img> 代替,走 nginx 静态文件 |
业务逻辑
| # | 坑 | 正确做法 |
| 25 | intentLevel 脏值(非0/20/40/60/80/100) | 必须用 isValidIntent() 校验 |
| 26 | 公司名校验陷阱 | '有限公司' in '有限责任公司' → False! |
| 27 | isNewOrRenew 存储值不统一 | 统一为中文"新开"/"续费" |
| 28 | Lead 归属字段是 assignedToId 不是 ownerId | 注意字段名差异 |
| 29 | Customer.ownerId 全是"system" | 销售归属存在 ownerName 字段(人名) |
| 30 | 返佣 typo:rebet → rebate | 已全局替换 |
| 31 | 商机定义 | poolType='leads' 且 assignedToId 非空 |
| 32 | 转客户查重以公司名为准 | 不用手机号查重,用 company 字段 |
| 33 | completed/shipped 客户新增续费→降级为 approved | 有 pending 订单不应显示"已完成" |
| 34 | 待审批筛选只展示 status=pending | 不包含有 pending 订单的 completed 客户 |
| 35 | followUpLogs 是 Json 字符串不是数组 | 必须用 parseFollowUpLogs() 安全解析 |
| 36 | _UserRoles A/B 列曾反转 | A=UserId, B=RoleId,修复后仍有残存反转行 |
🔗 外部集成与配置
企业微信
| 项目 | 值 |
| 企业 ID (CorpID) | wwdb672a1af0855622 |
| 应用 AgentID | 1000020(2026-06-10 更新,旧值 1000019) |
| 可信 IP | 服务器 IP 150.158.137.193(已在企微后台添加) |
| OAuth 回调 | /crm/wecom-login → /api/wecom/auth |
| 免登流程 | 静默授权(snsapi_base) → 换取企微UserId → 匹配 CRM User.wecomUserId → 自动登录 |
| 工作台入口 | 已配置应用主页 https://jiuzhaoyunqi.com/crm/wecom-login |
| 企微 MCP | 已接入(wecomcli 系列技能) |
POI 企业抓取
| 项目 | 值 |
| API | 腾讯地图 POI Search API |
| Key | LBEBZ-4ARK5-QT7IJ-I7WNQ-U4TEZ-4PB5I |
| 配额 | suggestion 30,000次/天,detail 2,000次/天 |
| 覆盖 | 57 个关键词 × 102 个城市 |
| CRM Token | 服务器 .env 需有 CRM_API_TOKEN |
| 启动方式 | 必须 nohup 后台运行 |
百度 oCPC 回传
Token 已配置在服务器 .env 中。用于广告转化数据回传。
微信支付
已开通 AI 对话中代扣能力(AI 专属卡),用于 WorkBuddy 内的小额采购等场景。
电子签
- 官网:tencentesign.com(端口 3000)
- 客服电话:15399567093 / 13129911553
- 定价:1200 元/年起
- 合规红线:公开场合严禁低价引流,只能提"一站式对接服务"
🐛 已知问题 & 技术债务
🔴 严重
| 问题 | 原因 | 建议 |
| 287个客户已过期但 lifecycle=active | 销售未处理到期确认站内信 | 系统机制正常,站内信每日补发 |
| _UserRoles 存在双份数据 | 修复A/B列swap后未删旧行 | 清理 swap 行(不影响查询) |
🟡 中等
| 问题 | 原因 | 建议 |
| 6条发货记录 deliverCopies=0 | 加购功能操作(正常),部分为销售漏填 | 金档已修复(0→600),其余待确认 |
| 25个客户手机号=00000000000 | 占位号 | 需补充真实手机号 |
| 5个客户无 contractEndAt | 新创建待审批客户 | 正常 |
| 武海峰 User.permissions=[] | 字段为空 | 角色权限自动计算,无实际影响,但建议补上 |
🟢 技术债务 & 改进建议
| 项 | 建议 |
| LeadCard/LeadDetailPanel 共享组件 | 2026-06-15 已创建,但未在所有页面充分测试 |
| lead.tsx 与 lead-public.tsx 的 IntentChangeModal 重复 | 可抽出共享组件 |
| CRM 项目无 git 仓库 | 建仓:git init + .gitignore(排 dev.db/backups/.env) |
| jiuzhaoyunqi.com 无 HTTPS | SSL 证书待申请,DNS 待配 |
| 阿狸的前端独立页面 | ali-chat.html/css/js 三个文件,建议整合或统一构建 |
| 部分API响应暴露 e.message | 已大部分修复,建议统一使用通用错误消息 |
| checkCSRF 导入来源不一致 | 部分从 @/lib/auth 导入,部分从 @/lib/csrf 导入 |
| followUpLogs 在多个地方各自解析 | 可抽出统一工具函数 |
📎 附录:近期关键事件时间线
| 日期 | 事件 |
| 2026-05-28 | CRM从官网项目拆分为独立项目 |
| 2026-05-31 | CRM无git仓库(待初始化) |
| 2026-06-02 | 阿狸模块重构:ali-core/ 9模块体系 |
| 2026-06-05 | PM2启动踩坑(--cwd vs -p参数冲突) |
| 2026-06-08 | rsync --delete删除了上传文件,加--exclude=public/uploads |
| 2026-06-09 | editHistory双重编码修复、_UserRoles A/B列修复 |
| 2026-06-10 | 全面权限审计+修复:11处API+17处页面,防越权 |
| 2026-06-14 | Agent另一会话:checkLeadAccess、poolEnteredAt修复 |
| 2026-06-15 | 全面UI统一:4池子卡片布局统一 + 共享 LeadCard/LeadDetailPanel 组件 |
| 2026-06-15 | tab计数全面修复:客户管理所有子标签显示计数角标、this_week/this_month 后端计算 |
| 2026-06-15 | 公海线索非0意向自动领取到我的商机、客户卡片新增电话拨打按钮 |
| 2026-06-15 | 生成 v2.0 交接文档:新增财务核算、46条踩坑清单、外部集成配置 |
🦊 本交接文档由阿狸(WorkBuddy AI Agent)自动生成 · 2026-06-15
项目路径:/Users/jiuchaoyunqi/WorkBuddy/研发/crm-website/