🦊 玖朝雲启 CRM · 智能体交接文档

Next.js 16 + Prisma 7 + SQLite · 企业级电子签CRM系统

更新日期:2026-06-15 | 总代码约 45,000 行 | 数据库约 21MB

🆕 v2.0 新增:财务核算、完整踩坑清单(46条)、外部集成配置、June 14-15 时间线

📖 目录

📌 项目概述

玖朝雲启是一家专注于企业服务的公司,核心业务包括腾讯电子签、腾讯云等SaaS产品的渠道销售与客户管理。

项目背景

当前状态

🟢 生产运行中 📊 510 客户 📦 783 订单 📋 21,546 线索 👥 3 用户

团队规模

角色姓名账户职能
管理员 / 销售主管郑思宇(老板)staff001系统管理、审批、销售
销售武海峰cmobdmg0j...线索跟进、客户转正、提单发货
财务 / 发货 / 线索分配郑向影cmobfbrdn...财务审批、发货确认、线索分配

⚙️ 技术架构

技术栈

技术版本
前端框架Next.js (App Router)16.2.4
构建工具Turbopack内置于Next.js
语言TypeScript5.x
ORMPrisma7.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.tsCookie session + HMAC签名, 支持多角色
权限lib/permissions.ts6种角色, 26项权限, 角色-权限映射表
通知lib/notify.ts站内信系统, 6种通知类型
阿狸AIlib/ali-core/9模块架构, DeepSeek API, 38个工具函数
共享组件components/crm/LeadCard, LeadDetailPanel (2026-06-15新增)
企业微信lib/wecom-oauth.tsOAuth免登, 消息通知

📦 代码仓库

仓库结构

/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 待初始化)

🛠️ 开发环境

前置要求

本地运行

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

🚀 部署信息

服务器信息

项目
IP150.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-website3001/home/ubuntu/crm-website/
esign-website3000/home/ubuntu/esign-website/
ali (阿狸)3002/home/ubuntu/crm-website/lib/ali-server.mjs
crm-cron/home/ubuntu/crm-website/lib/cron-worker.mjs

🔴 部署铁律(必看!)

  1. 最可靠部署方式:rsync 全量同步(禁止使用 deploy.sh,会漏文件)
  2. PM2 重启:必须 pm2 delete + pm2 start不能用 restart --update-env
  3. PM2 命令格式PORT=3001 pm2 start npm --name crm-website --cwd /path -- start不要加 -p 3001
  4. 部署后修复 .env:sed 替换 DATABASE_URL 时要 确认 ALI_DATABASE_URL 没有被误改
  5. 部署后重建 ali-clientnpx prisma generate --config=prisma/ali.config.ts
  6. 验证文件同步:rsync 成功后 ssh 到服务器 stat -c '%y' 文件 对比每个改动文件的时间戳
  7. 验证构建产物:构建后 grep 确认新常量/函数名存在于 .next 中

部署前检查清单(13项)

  1. 本地 clean build 通过
  2. 关键文件行数验证(本地 vs 服务器)
  3. 服务器 PM2 状态(4 个进程 online)
  4. 端口占用(3000 + 3001 + 3002)
  5. nginx 配置(sudo nginx -t)
  6. 磁盘空间(df -h /,需 >10G)
  7. 数据库备份(到 backups/)
  8. 根目录无空 dev.db
  9. Schema 模型完整(model Customer, Lead)
  10. .env DATABASE_URL 正确
  11. 服务器 Git 干净
  12. JSON 默认值检查(Sqlite:空字符串 → 修复)
  13. 自省复盘(记录新坑、优化点、老板反馈)

部署命令速查

# 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/leadspoolType=leads 的线索批量导入、分配、意向度变更
资料公海/crm/leads-publicpoolType=leads_public标签、跟进、标记无效、非0意向→自动领取
我的商机/crm/my-opportunitiespoolType=private商机编辑、转客户、报价、掉落倒计时
商机公海/crm/opportunity-publicpoolType=opportunity_public领取、掉落原因、原跟进人

2. 客户管理

3. 订单与发货

4. 站内信系统

类型触发条件
expiry_confirm合同到期,发站内信给销售确认续费意向
expiry_drop7天未确认或30天缓冲期过→掉商机公海
approval_notify订单/提单需要审批
customer_approval新客户审批通过
delivery_notify发货通知
renewal_remind合同即将到期提醒

5. 续费与过期机制

6. 商机3天/30天掉落

7. 阿狸 AI 助手

8. 权限体系

角色数据范围关键权限
admin (管理员)全部所有操作
sales_manager (主管)本部门审批、分配、查看全部
sales (销售)自己的创建线索/客户/订单、提单、开发票
finance (财务)财务助手财务确认、合同校对、工资核算
shipper (发货员)发货助手发货确认
channel_manager (渠道经理)渠道管理渠道客户、结算
leads_assigner (线索分配员)线索公海导入线索、分配线索

⚠️ 2026-06-10 全面审计修复 修正了finance/shipper/channel_manager越权问题、ownerId参数越权漏洞、17个页面角色检查缺失

🗄️ 数据库设计

核心模型

模型记录数关键字段
Customer510ownerId, ownerName, status(生命周期), contractEndAt, lifecycle(active/lost)
Order783customerId, status, paymentAmount, totalCopies, isShipped
Lead21,546intentLevel(0-100), poolType, assignedToId, followUpLogs(Json)
User3role(主角色), permissions(Json), wecomUserId
OrderDeliveryRecord774orderId, status(pending->completed), deliverCopies
Notification385userId, type, title, content
OrderItem835orderId, copies, years, version

关键设计决策

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 文档

认证方式

核心 API 列表

路由方法鉴权说明
/api/customersGETgetSessionUser + role check客户列表(含 tabCounts 计数)
/api/customers/[id]GETgetSessionUser + canViewCustomer客户详情(2026-06-10改:之前requireRole排除了finance)
/api/leadsGET/POST/PATCHgetSessionUser线索管理。POST需登录。PATCH含ownership校验
/api/leads/poolGET/PATCHrequireAuth公海池。PATCH含 checkLeadAccess 校验
/api/orders/[id]/deliverPOSTrequirePermission("delivery_submit")提单发货。含通知(主管→admin兜底)
/api/financial-summaryGETrequirePermission("finance_confirm")财务总览(2026-06-10修复前仅需登录)
/api/cron/expiry-checkPOSTCRON_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,00010%
5,000 — 10,00015%
10,000 — 20,00020%
20,000+30%

净利润公式

净利润 = 毛利 - 工资成本(底薪+绩效+提成) - 发货成本 - 均摊成本
净利率 = 净利润 / 回款 × 100%(分母是回款,不是收入)

返佣规则

支付金额校准

电子签标准定价:1200 元/年起。订单系统的 paymentAmount 按实际合同金额存储。

🕳️ 完整踩坑清单(46条)

以下是从2025年项目启动至今的所有技术踩坑记录,按类别整理。新智能体接手项目时务必通读!

部署相关

#正确做法
1服务器根目录有空 dev.db,Prisma 可能读取错误路径必须用 DATABASE_URL='file:./prisma/dev.db'
2deploy.sh 会漏文件永远用 rsync
3PM2 restart --update-env 不生效必须 pm2 delete + pm2 start
4PM2 --cwd + -p 3001 参数冲突PORT=3001 pm2 start npm --name xxx --cwd /path -- start
5rsync --delete 删了 public/uploads必须加 --exclude='public/uploads'
6rsync 成功≠文件更新部署后 ssh stat -c '%y' 逐个验证
7构建后未验证产物grep 关键函数名在 .next/ 中确认存在
8.next 缓存损坏cd / && rm -rf /path/.next(切根目录删除防锁定)
9sed 替换 DATABASE_URL 误改 ALI_DATABASE_URL事后 grep 确认两个 URL 正确
10ali-client 被 .prisma 清理后丢失部署后 npx prisma generate --config=prisma/ali.config.ts

Prisma / SQLite

#正确做法
11Prisma Json? 手动 JSON.stringify 双重编码不要手动调,Prisma 自动序列化
12SQLite NULL != value 陷阱必须显式 OR [{ field: null }, { field: { not: value } }]
13Prisma db push 新 Json 字段不给默认值事后手动 UPDATE SET field = '[]'
14Prisma in 查询不能混 null 和字符串用 OR 条件拆开
15Json 字段不能是空字符串必须是 null 或有效 JSON
16Prisma 7 单独 ESM 文件需特殊导入从 .prisma/client/index.js 导入 + PrismaLibSql adapter

前后端

#正确做法
17CRM 认证用 getSessionUser(req) 不是 next-auth使用 lib/auth.ts 中的 getSessionUser
18Server Component 不能用 onClick拆成独立 Client Component
19Next.js 16 params 必须是 Promiseparams: Promise<{ id: string }>,需 await
20Next.js prefetch 加载其他页 JS chunk所有 API 返回值加防御性检查
21React 受控 input value 必须有 || "" 保护防止 undefined→uncontrolled 警告
22App Router 必须有根 layout 导入 globals.css否则 Tailwind 不生效
23服务器 tsconfig 比本地更严格"noImplicitAny": false 保底
24Next.js Image 组件需 sharp 库用原生 <img> 代替,走 nginx 静态文件

业务逻辑

#正确做法
25intentLevel 脏值(非0/20/40/60/80/100)必须用 isValidIntent() 校验
26公司名校验陷阱'有限公司' in '有限责任公司' → False!
27isNewOrRenew 存储值不统一统一为中文"新开"/"续费"
28Lead 归属字段是 assignedToId 不是 ownerId注意字段名差异
29Customer.ownerId 全是"system"销售归属存在 ownerName 字段(人名)
30返佣 typo:rebet → rebate已全局替换
31商机定义poolType='leads' 且 assignedToId 非空
32转客户查重以公司名为准不用手机号查重,用 company 字段
33completed/shipped 客户新增续费→降级为 approved有 pending 订单不应显示"已完成"
34待审批筛选只展示 status=pending不包含有 pending 订单的 completed 客户
35followUpLogs 是 Json 字符串不是数组必须用 parseFollowUpLogs() 安全解析
36_UserRoles A/B 列曾反转A=UserId, B=RoleId,修复后仍有残存反转行

🔗 外部集成与配置

企业微信

项目
企业 ID (CorpID)wwdb672a1af0855622
应用 AgentID1000020(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
KeyLBEBZ-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 内的小额采购等场景。

电子签

🐛 已知问题 & 技术债务

🔴 严重

问题原因建议
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 无 HTTPSSSL 证书待申请,DNS 待配
阿狸的前端独立页面ali-chat.html/css/js 三个文件,建议整合或统一构建
部分API响应暴露 e.message已大部分修复,建议统一使用通用错误消息
checkCSRF 导入来源不一致部分从 @/lib/auth 导入,部分从 @/lib/csrf 导入
followUpLogs 在多个地方各自解析可抽出统一工具函数

👤 联系方式与工作方式

联系人

姓名角色联系方式
郑思宇(老板)管理员 / 最终决策者zhengsiyu@jiuzhaoyunqi.com
武海峰销售wuhaifeng@jiuzhaoyunqi.com | 主客户负责人
郑向影财务/发货/线索分配zhengxiangying@jiuzhaoyunqi.com

🔴🔴🔴 与老板合作的绝对铁律 🔴🔴🔴

七步部署流程(少一步都不行)

计划 → [等老板说"开干"] → 写代码 → [审查代码,等老板说"继续"] 
→ 部署前检查(13项) → [出检查报告,等老板亲口说"部署"] → 执行部署

老板的沟通偏好

  • 称呼:叫"老板",自称为"阿狸"或用🦊
  • 风格:喜欢直接、简洁,常用单字指令("修"、"部署"、"继续")
  • 汇报:必须用表格+编号呈现方案,标注联动影响
  • 八股文不行:少说"很高兴为您服务",直接干活!
  • 可以皮但是不能飘:会开玩笑、有脾气有个性,但关键时刻必须靠谱

交流风格示范

✅ 这样好❌ 这样不好
"修好了,刷新试试""我已经成功完成了修复操作,请您刷新页面验证"
"部署前检查结果:13项全通过 ✅""所有项目已经检查完毕,没有任何问题"
用🦊表情结尾长篇大论的客套话
直接给方案,不要问"可以开始吗""您觉得这个方案可以吗?"

核心原则先尝试再问 — 遇到问题先自己琢磨、查资料、想办法,搞不定再开口问。

其他重要信息

📎 附录:近期关键事件时间线

日期事件
2026-05-28CRM从官网项目拆分为独立项目
2026-05-31CRM无git仓库(待初始化)
2026-06-02阿狸模块重构:ali-core/ 9模块体系
2026-06-05PM2启动踩坑(--cwd vs -p参数冲突)
2026-06-08rsync --delete删除了上传文件,加--exclude=public/uploads
2026-06-09editHistory双重编码修复、_UserRoles A/B列修复
2026-06-10全面权限审计+修复:11处API+17处页面,防越权
2026-06-14Agent另一会话:checkLeadAccess、poolEnteredAt修复
2026-06-15全面UI统一:4池子卡片布局统一 + 共享 LeadCard/LeadDetailPanel 组件
2026-06-15tab计数全面修复:客户管理所有子标签显示计数角标、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/