feat: 企业版合作模式(后端、管理端、小程序)

- API:合作模式配置、用户选择、企业版入口与迁移 SQL

- 管理端:合作方式管理、企业/用户侧设置与 CSV 导出等

- 小程序:合作模式弹窗与结果/简历等页对接;开发脚本小调整

Made-with: Cursor
This commit is contained in:
Ghost
2026-04-23 16:08:13 +08:00
parent d7137f9349
commit 830e3611d7
40 changed files with 2518 additions and 33 deletions

View File

@@ -0,0 +1,184 @@
# 企业版:简历上传 / 人脸 / MBTI → 合作模式(需完善资料)
> 文档用途:产品与开发对齐;可被 AI 直接读取用于分模块实现(小程序弹框、前置条件校验、`api` 接口与管理端配置)。
> 关联:`miniprogram/utils/phoneAuth.js` 中 `isReportProfileComplete()`(昵称+头像+手机);后端与 `Test::isWechatProfileComplete` 对齐。
---
## 1. 背景与目标
- **目标**:在企业版业务中,用户须完成 **简历上传、人脸/面相分析、MBTI 测评****三者完成顺序不限,可被打乱**),全部完成后必须再 **选择「合作模式」**
- **说明(产品口径)**:第一环对用户表述为 **「简历上传」**;上传成功后服务端可异步生成「简历分析报告」。**什么叫「简历这一环算完成」**:按你们约定的业务规则判定,通常是 **上传成功且达到约定的完成态**(例如库里已有记录、报告可查看等),详见 §3。文档里如出现「前置校验」三字指的就是**没到这一步就不让用户进下一步**。)
- **约束****选择合作模式前,用户须已「完善资料」**(手机号 + 昵称 + 头像必填)。
- **展示**:小程序侧合作模式以 **弹框Modal** 呈现;选项由 **管理端配置**
---
## 2. 适用范围
| 维度 | 说明 |
|------|------|
| 客户端 | **企业版小程序**(实现时与现有企业上下文 `enterpriseId` / `enterprisePermissions` / 入口路由对齐) |
| 用户身份 | 已登录;未完成资料则先引导 **`/pages/user-profile/index`** |
| 非适用范围 | 个人版、分享落地访客;审核/提审模式沿用现有 `reviewMode` / `miniprogramAuditMode` 等合规策略 |
---
## 3. 端到端流程(三项完成顺序不限)
**前置条件(企业版)**:以下三项在用户维度均达到「已完成」状态(**不限先后**
- **简历上传**完成(用户完成简历文件上传;是否要求报告已出齐由实现约定,建议在文档/接口层写死「完成事件」)
- 人脸(面相)分析完成
- MBTI 测评完成
```
┌─────────────────────────────────────────────────────────┐
│ 简历上传 / 人脸 / MBTI 三项可任意顺序完成(并行入口亦可) │
└─────────────────────────────────────────────────────────┘
三项均已标记完成?
【校验】「完善资料」是否满足(硬性,见 §4
弹出「合作模式」弹框§6
用户必选一项(或必选 + 备注,见 §10
提交成功 → 关闭弹框并进入后续业务(或停留提示)
```
**实现锚点**
1. **简历上传**:现有简历上传与分析链路(如上传页 + `pages/result/resume`);以 **上传成功且业务认定该环节完成**(例如已持久化简历分析任务/结果)时写入 **`resumeDone`**(服务端为准更可靠)。
2. **人脸**:现有拍照/分析链路(如 `pages/index/camera``pages/index/result`);完成时写入 **faceDone**
3. **MBTI**:现有测评与结果页(如 `pages/result/mbti`);完成时写入 **mbtiDone**
4. **合作模式**:当 **`resumeDone && faceDone && mbtiDone`**(命名可统一为 enterprise onboarding flags且 §4「完善资料」校验通过时触发弹框**最后一项完成的那一个页面**可作为「首次满足条件」的触发时机(避免重复弹窗需幂等标记)。
---
## 4. 「完善资料」前置条件(硬性)
> **用语说明**:不写「门禁」一词时,本节就是指——**头像、昵称、手机号不齐就不给弹出合作模式弹框**,须先去资料页补齐。
**判定**:与小程序 `isReportProfileComplete()` 一致——**昵称、头像、手机号均已非空**。
**未满足**:禁止打开合作模式弹框;`Toast` + 跳转 `pages/user-profile/index`(可加 query `from=cooperation_gate`)。
**满足后**:拉取 §5 配置的选项并展示弹框。
---
## 5. 管理端配置(暂定三种模式)
### 5.1 枚举(首期)
| modeCode (`code`) | 展示名 | 默认含义 |
|-------------------|--------|----------|
| `salary` | 工资 | 全职/薪资导向合作 |
| `startup_equity` | 创业分红 | 合伙/股权激励类合作 |
| `knowledge_pay` | 知识付费 | 课程/咨询/付费内容类合作 |
### 5.2 建议配置字段
| 字段 | 说明 |
|------|------|
| `enterpriseId` | 企业维度(平台默认模板可与某默认企业绑定或单独表) |
| `modeCode` | `salary` \| `startup_equity` \| `knowledge_pay` |
| `enabled` | 是否对用户展示 |
| `sortOrder` | 弹框内排序 |
| `title` / `description` | 可选覆盖默认文案 |
| `updatedAt` | 审计 |
**权限**:仅管理员可改;终端只读列表。
---
## 6. 小程序:弹框交互
### 6.1 触发
- 满足 §3**三项均完成,与完成顺序无关**、§4 后 **自动弹出一次**(建议:`cooperationChoiceSubmitted` / 服务端状态双重判断)。
- 可选:在任一相关结果页提供「选择合作模式」入口(若三项未齐则 Toast 引导未完成项);同样先走 §4。
### 6.2 内容结构
- 标题:如「请选择合作模式」。
- 简要说明一行。
- 纵向 **单选**列表,仅展示 `enabled=true` 的配置项。
- **确认**:未选时可禁用主按钮或 Toast。
- **稍后**(可选):是否允许跳过由产品决定;若企业版强制意愿收集,可不提供「稍后」。
### 6.3 反馈
- 成功:`showToast`,必要时更新本地与服务端扩展字段。
- 失败:展示服务端 `message`,保留弹框内容便于重试。
---
## 7. 接口约定(草案)
以下路径为建议命名,落地时与现有路由风格统一。
### 7.1 获取可选合作模式
- **GET** `/api/enterprise/cooperation-modes`
- 认证Bearer`enterpriseId` 从 Token 或 query 解析。
- **响应示例**
```json
{
"code": 200,
"data": {
"list": [
{ "code": "salary", "title": "工资", "description": "…", "sortOrder": 10 }
]
}
}
```
### 7.2 提交用户选择
- **POST** `/api/user/cooperation-preference`
- **Body**`{ "modeCode": "salary" }`,可选 `{ "mbtiTestResultId": 123 }` 便于审计。
- **校验**`modeCode` 必须在该企业当前启用集合内。
### 7.3 幂等
同一用户同一企业重复提交:**覆盖最近一次** 或 **409 拒绝** —— 由产品拍板。
---
## 8. 数据与状态
- 用户维度存储:`cooperation_mode_code``cooperation_chosen_at`(表名实现时与 `wechat_users`/扩展表统一)。
- 前端可选用 `storage` 缓存「已提交」以降低重复弹窗(须与服务端最终一致)。
---
## 9. 验收标准
1. 企业版路径:仅 **简历上传、人脸、MBTI 三项均完成****顺序任意**;完成事件以接口/状态为准;简历侧以「上传 + 约定完成态」为准)且 **资料完善** 后出现弹框。
2. 资料不完善:**无法提交**合作模式并跳转资料页。
3. 管理端关闭某模式:小程序 **不出现**该项。
4. 提交成功:服务端可查;客户端符合「不重复骚扰」策略。
5. 审核模式下是否与营销类入口同样隐藏:**待运营确认**,可与现有审核工具函数并列处理。
---
## 10. 待产品确认
- 「三项均完成」的精确定义(依赖哪些接口字段或页面生命周期;**与先后顺序无关**)。
- 是否允许「稍后」、是否支持多选/备注。
- 配置入口:**企业后台** 与 **超级管理后台** 的归属。
- 与个人版路径并存时的降级策略。
---
## 修订记录
| 日期 | 说明 |
|------|------|
| (创建) | 初版需求草案,存放于 `api/docs` |
| 修订 | 明确简历 / 人脸 / MBTI **完成顺序可打乱**,仅以三项均完成为必要条件 |
| 修订 | 第一环产品口径改为 **简历上传**(与分析/报告异步关系在 §3 说明) |
| 2026-04-20 | **已落地**`mbti_enterprise_cooperation_modes` / `mbti_user_cooperation_choices`、小程序接口与弹框、企业后台与超管配置页 |