Procházet zdrojové kódy

[init] 项目初始化

- 后端服务:Spring Boot 1.5.9 单体项目(Maven),基础目录结构
- 微信小程序:app.json + project.config.json
- 后台管理前端:package.json(Vue + Element UI)
- 文档:需求规格、阶段规划、任务清单、开发流程
- 交付目录:deliveries/team-{a,b,c,d}/
wubinggen před 8 hodinami
revize
e6232ac514

+ 51 - 0
.gitignore

@@ -0,0 +1,51 @@
+# ===== Java / Gradle =====
+target/
+build/
+*.class
+*.jar
+*.war
+*.ear
+.gradle/
+!gradle/wrapper/gradle-wrapper.jar
+
+# ===== IDE =====
+.idea/
+*.iml
+*.ipr
+*.iws
+.vscode/
+.settings/
+.project
+.classpath
+*.swp
+*.swo
+*~
+
+# ===== 系统文件 =====
+.DS_Store
+Thumbs.db
+desktop.ini
+*.log
+
+# ===== 环境配置(含密钥) =====
+.env
+.env.local
+.env.*.local
+application-local.properties
+application-prod.properties
+application-test.properties
+
+# ===== Node / 前端 =====
+node_modules/
+dist/
+.npm
+*.tgz
+
+# ===== 微信小程序 =====
+wxapp/unpackage/
+wxapp/node_modules/
+
+# ===== 临时文件 =====
+*.tmp
+*.bak
+*.cache

+ 164 - 0
CLAUDE.md

@@ -0,0 +1,164 @@
+# CLAUDE.md
+
+This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
+
+## 项目概述
+
+洒渔镇苹果产业供需对接平台,服务于云南昭通洒渔镇苹果产业的四类主体(果农/工人/客商/农资商),包含三个子项目:
+
+| 子项目 | 目录 | 说明 |
+|--------|------|------|
+| 后端服务 | `service/` | Java 后端 API 服务 |
+| 微信小程序 | `wxapp/` | 面向用户的微信小程序端(四类用户角色) |
+| 后台管理 | `wxbackstage/` | 政府管理部门使用的运营管理后台 |
+
+## 技术栈
+
+- **后端**: Java 8 / Spring Boot 1.5.9 / Gradle 多模块构建
+- **数据库**: MySQL(`crrc` 库)
+- **ORM**: MyBatis(XML 映射文件位于 `src/main/resources/mapper/`)
+- **测试**: JUnit 4 + Spring Boot Test
+- **小程序**: 微信原生开发
+- **视频存储**: 阿里云 OSS(前端直传,后端申请凭证)
+- **短信服务**: 阿里云短信 API
+- **缓存**: Redis(数据大屏统计缓存)
+
+## 项目结构(CRRC 多模块模式)
+
+项目采用 Gradle 多模块结构,每个模块独立 `build.gradle` 和 `gradlew`,根目录无 `settings.gradle`:
+
+```
+service/
+├── com.fenzhitech.crrc.service-common/    # 共享库(DTO/VO/常量),只读,修改需走返工流程
+├── com.fenzhitech.crrc.service-user/      # 用户模块
+├── com.fenzhitech.crrc.service-bill/      # 账单模块
+├── com.fenzhitech.crrc.service-message/   # 消息模块
+├── com.fenzhitech.crrc.service-*/         # 其他业务模块
+├── com.fenzhitech.crrc.gateway-pc/        # PC 网关
+├── com.fenzhitech.crrc.gateway-mobile/    # 移动端网关
+└── com.fenzhitech.crrc.gateway-management/# 管理端网关
+```
+
+每个模块内部结构:
+```
+com.fenzhitech.crrc.service-xxx/
+├── build.gradle
+├── gradlew
+├── src/main/java/         # 业务代码
+├── src/main/resources/    # 配置 + MyBatis XML
+└── src/test/java/         # 测试代码
+```
+
+## 常用命令
+
+编译验证(必须进入具体模块目录执行):
+```bash
+cd com.fenzhitech.crrc.service-xxx
+./gradlew compileJava
+```
+
+依赖链编译(修改 service-common 后,先编译公共库再编译业务模块):
+```bash
+cd com.fenzhitech.crrc.service-common && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-bill && ./gradlew compileJava
+```
+
+运行测试:
+```bash
+cd com.fenzhitech.crrc.service-xxx
+./gradlew test
+```
+
+启动服务:
+```bash
+cd com.fenzhitech.crrc.service-xxx
+./gradlew bootRun
+```
+
+## API 设计规范
+
+- 小程序端接口前缀:`/api/wx/*`
+- 后台管理端接口前缀:`/api/admin/*`
+- 认证机制:小程序端微信 code→JWT,后台端账号密码→JWT,独立拦截器
+- 权限模型:RBAC,默认拒绝,显式授权
+- 数据过滤:接口返回过滤敏感字段,手机号通过单独拨号接口获取(记录拨号日志)
+
+## 数据库设计要点
+
+- 手机号 AES 加密存储,`phone_hash`(SHA256) 建唯一索引用于查询
+- 所有业务表带 `user_identity_id` 字段,实现数据隔离(一人多职场景)
+- 经纬度复合索引用于距离查询(Haversine 公式)
+- 核心表:`sys_user`、`user_identity`、`grower_profile`、`worker_profile`、`recruit_info`、`buyer_profile`、`phone_unlock_record`、`call_log`、`sms_daily_limit`、`market_price`
+
+## 关键业务规则
+
+- **招工发布**:免审核直接发布,敏感关键词自动标记+待复核列表
+- **工人状态**:手动切换+3天无操作自动恢复"空闲",信用机制(投诉1警告→2限24h→3锁定)
+- **联系授权**:客商勾选批次→解锁果农电话,有效期7天
+- **防骚扰**:同一工人每天对同一果农最多1条短信(自然日)
+- **审核SLA**:≤24小时提醒,48小时升级给超级管理员
+- **视频上传**:前端直传 OSS,≤50MB/720p/2Mbps/≤5分钟,前端清除 EXIF
+- **适老化**:正文≥18px(rem)、按钮≥88×88px、高对比度、语音输入
+
+## 开发流程
+
+本项目采用多 Agent 协同开发流程(详见 `docs/multi-agent-git-workflow-v2.1.md`),核心流程:
+
+1. **需求分析** (Team A) → `phase/01-requirement`
+2. **架构设计** (Team B) → `phase/02-architecture`
+3. **编码实现** (Team C) → `phase/03-coding`(含编译自检门控)
+4. **测试验收** (Team D) → `phase/04-testing`(JUnit 4 风格自动化测试)
+
+每个阶段产出 `DELIVERY-MANIFEST.md` 交付清单,业务领导审批通过后合并到 `main`。
+
+### Git 分支命名
+
+```
+main                          # 主分支
+phase/01-requirement          # 各阶段工作分支
+phase/02-architecture
+phase/03-coding
+phase/04-testing
+rework/XX-阶段名              # 返工分支
+backport/xxx-description      # 回溯分支
+```
+
+### Commit Message 格式
+
+```
+[milestone-N] 简述内容
+[rework-N] 简述返工内容
+[backport-N] 简述回溯修改内容
+```
+
+## 关键约束
+
+- `service-common` 是共享库,修改公共 DTO/VO/常量后需优先编译验证,且修改需走返工流程
+- MyBatis XML 中参数必须使用 `#{}` 语法,禁止 `${}`(防 SQL 注入)
+- 网关层(`gateway-pc`、`gateway-mobile`、`gateway-management`)的免登录/免权限路径配置需在新增公开接口时同步检查
+- 多模块间 Feign 调用路径和包名需与 `SERVICE_NAME` / `SERVICE_CONTEXT_PATH` 常量一致
+- 测试目录为标准 `src/test/java/`,不得在 `src/main/` 下创建测试文件
+
+## 历史遗留拼写(不要误报)
+
+- `contanst`(非 `constant`)— 常量/枚举包名
+- `bootstrapt`(非 `bootstrap`)— `service-file` 模块启动包名
+- `annotion`(非 `annotation`)— 框架注解包名
+
+## 文档目录
+
+| 文档 | 路径 | 说明 |
+|------|------|------|
+| 功能清单 | `docs/洒渔镇苹果产业供需对接平台功能清单-V1.0.docx` | 原始产品功能需求(45个功能点) |
+| 需求规格说明书 | `docs/requirements-specification.md` | 完整需求文档(功能/数据模型/接口/非功能需求) |
+| 需求研讨记录 | `docs/requirements-discussion.md` | 6角色7议题正反论证+投票过程 |
+| 阶段规划说明书 | `docs/phase-planning.md` | 4阶段划分+各阶段功能清单+验收标准+测试重点 |
+| 阶段划分研讨记录 | `docs/phase-planning-discussion.md` | 6角色阶段划分讨论过程 |
+| 开发流程设计 | `docs/multi-agent-git-workflow-v2.1.md` | 多 Agent 协同开发流程(v2.2) |
+| 阶段零任务清单 | `docs/phase-0-tasks.md` | 环境准备详细任务(9项,0.5周) |
+| 阶段一任务清单 | `docs/phase-1-tasks.md` | 基础设施与用户体系(M1-M4,20功能点) |
+| 阶段2a任务清单 | `docs/phase-2a-tasks.md` | 果农核心功能(M1-M4,14功能点) |
+| 阶段2b任务清单 | `docs/phase-2b-tasks.md` | 工人+客商+农资(M1-M4,13功能点) |
+| 阶段三任务清单 | `docs/phase-3-tasks.md` | 运营功能与统计(M1-M4,14功能点) |
+| 数据库配置 | `docs/mysql数据库配置.txt` | MySQL 连接配置 |
+| Git 远程仓库 | `docs/git远程仓库.txt` | Gogs 远程仓库信息 |

+ 0 - 0
deliveries/team-a-requirement/.gitkeep


+ 0 - 0
deliveries/team-b-architecture/.gitkeep


+ 0 - 0
deliveries/team-c-coding/.gitkeep


+ 0 - 0
deliveries/team-d-testing/.gitkeep


+ 3 - 0
docs/git远程仓库.txt

@@ -0,0 +1,3 @@
+地址: https://gogs.wxapp.info/
+账号: lio
+密码: 123456

+ 1096 - 0
docs/multi-agent-git-workflow-v2.1.md

@@ -0,0 +1,1096 @@
+# 多 Agent + Git 协同开发流程设计 (v2.2)
+
+> 沉淀日期:2026-05-27
+> 最近更新:2026-05-28(基于 v2.1 分析,8 项改进集成)
+> 版本变更:v2.1 → v2.2(CRRC 项目适配、交付验证改革、编译自检、自动化测试、回溯流程、分层抽查、日志度量)
+
+---
+
+## 一、核心理念
+
+每个需求/任务以文档为启动点,初始化为 Git 仓库。多个不同职能的 Agent 团队按阶段接力开发,通过 Git 分支隔离工作,里程碑合并汇总成果。贯穿全流程的业务领导角色负责审批和管控。
+
+### 设计原则
+
+- **少即是多**:只保留真正必要的流程,避免为流程而流程
+- **职责清晰**:每个角色只做自己擅长的事
+- **可执行**:每个流程步骤都必须有明确的执行者和可操作的方法
+- **闭环验证**:每个交付物都必须有可验证的检查方式
+
+### v2.1 核心改进(相比 v1.0)
+
+| 改进项 | 解决的问题 |
+|--------|-----------|
+| 业务领导提炼上下文 | 子Agent无状态导致上下游信息断裂 |
+| 并行开发合并策略 | 多团队并行时文件冲突无预案 |
+| 返工升级路径 | 返工死循环无兜底方案 |
+| 代码质量抽查 | 编译通过≠质量合格 |
+| 环境就绪检查 | M3→M4 环境问题导致阻塞 |
+| 交付物可验证 | 防止交付物检查流于形式 |
+| 测试重点指定 | 防止测试阶段缺乏策略指导 |
+
+### v2.2 核心改进(相比 v2.1)
+
+| 改进项 | 解决的问题 |
+|--------|-----------|
+| CRRC 项目适配(附录 C) | 流程与实际 Gradle 多模块项目不匹配 |
+| 覆盖度检查替代行数校验 | 行数校验流于形式,无法反映交付质量 |
+| 对上团队的问题通道 | 下游发现问题时无快速反馈机制 |
+| Team C 编译自检门控 | 编译验证依赖业务领导手动执行 |
+| Team D 自动化测试集成 | 测试交付物缺少可执行测试代码 |
+| 跨阶段回溯流程 | M3/M4 发现上游问题时无标准化处理流程 |
+| 风险导向分层抽查 | 单一文件抽查覆盖率过低 |
+| 项目日志过程度量 | 缺少阶段耗时、失败原因分类等改进数据 |
+
+---
+
+## 二、组织架构
+
+```
+业务领导 (Business Owner)
+  │  贯穿全流程,负责:
+  │  - 定义项目目标、验收标准
+  │  - 审批每个里程碑是否达标
+  │  - Go / No-Go 决策
+  │  - 返工决策和方向调整
+  │  - 最终验收
+  │  - 维护项目生命周期日志
+  │  - 派单时提炼关键上下文传递给下游团队
+  │
+  ├── Team A  需求分析师
+  ├── Team B  架构师
+  ├── Team C  开发者
+  └── Team D  测试工程师
+```
+
+### 角色分工
+
+| 角色 | 模型 | 职责 |
+|------|------|------|
+| 业务领导 | GLM-5.1 | 全局管控、审批、决策、派单、上下文传递。不参与具体执行 |
+| 需求分析师 | MiniMax M2.7 | 产出需求规格、用例、约束条件 |
+| 架构师 | MiniMax M2.7 | 产出架构设计、接口定义、技术选型 |
+| 开发者 | MiniMax M2.7 | 按架构编码,分模块分阶段提交 |
+| 测试工程师 | MiniMax M2.7 | 基于业务领导指定的测试重点,执行测试,提交报告 |
+
+### 上下文传递机制
+
+**原则**:由业务领导在派单时提炼关键上下文,同时要求当前团队在 DELIVERY-MANIFEST.md 中填写"给下游团队的关键信息"。
+
+**双重保障**:
+
+1. **当前团队填写**:在 DELIVERY-MANIFEST.md 中填写"给下游团队的关键信息"
+   - 他们最清楚自己的决策和约束
+   - 业务领导审查时可以补充或修正
+
+2. **业务领导提炼**:派单时将关键信息嵌入 prompt
+   - 来源:DELIVERY-MANIFEST.md 中的"给下游团队的关键信息" + 业务领导自己的判断
+   - 不是简单复制,而是提炼和筛选
+
+**示例**(业务领导派单给Team B时的prompt片段):
+```
+## 上游关键信息
+
+### Team A 的关键决策
+- 用户认证采用JWT方案,原因是系统需要支持移动端
+- 权限控制采用RBAC模型,每个用户绑定一个角色
+
+### 隐含约束
+- 数据库必须使用MySQL 5.7(客户环境限制)
+- 所有接口必须支持租户隔离(tenant_id字段)
+
+### 特别注意
+- 需求中的"报表导出"功能优先级较低,可简化设计
+```
+
+---
+
+## 三、整体流程
+
+```
+[业务领导] 制定项目目标 + 验收标准
+     │
+     ▼ git init main
+     │  1. 创建 .gitignore(排除 target/、*.class、.idea/、*.iml、.DS_Store、*.log)
+     │  2. 提交 .gitignore 到 main
+     │  3. 提交 docs/charter.md、docs/acceptance-criteria.md
+     │
+[业务领导] 派单 → Team A(prompt中明确项目目标和验收标准)
+     │
+┌─ Team A 需求分析 ──→ branch: phase/01-requirement
+│    输出: spec.md, use-cases.md, constraints.md, DELIVERY-MANIFEST.md
+│         │
+│         ▼ merge request → main
+│         │
+[业务领导] 审查 DELIVERY-MANIFEST.md → Go/No-Go
+     │  (含对上团队问题处理)
+[业务领导] 派单 → Team B(prompt中嵌入 Team A 的关键信息)
+     │
+┌─ Team B 架构设计 ──→ branch: phase/02-architecture
+│    输出: design.md, api-definition.md, tech-stack.md, DELIVERY-MANIFEST.md
+│         │
+│         ▼ merge request → main
+│         │
+[业务领导] 审查 DELIVERY-MANIFEST.md → Go/No-Go
+     │  (含对上团队问题处理)
+[业务领导] 派单 → Team C(prompt中嵌入 Team B 的关键信息)
+     │
+┌─ Team C 编码实现 ──→ branch: phase/03-coding
+│    输出: 代码 + DELIVERY-MANIFEST.md
+│         │
+│         ▼ 编译自检(Team C 执行)
+│         │  cd {affected_module} && ./gradlew compileJava
+│         │  通过 → 自检结果写入 DELIVERY-MANIFEST.md → 提交 merge request
+│         │  失败 → 修复后重新自检
+│         │
+│         ▼ merge request → main
+│         │
+[业务领导] 风险导向分层代码抽查 + 审查 DELIVERY-MANIFEST.md → Go/No-Go
+     │  (含对上团队问题处理)
+     ▼ 环境就绪检查(./gradlew bootRun + 冒烟,在具体模块目录内执行)
+     │
+[业务领导] 派单 → Team D(prompt中嵌入测试重点 + Team C 的关键信息)
+     │
+┌─ Team D 测试验收 ──→ branch: phase/04-testing
+│    输出:
+│      - test-cases.md          # 测试用例说明
+│      - test-report.md         # 测试执行报告
+│      - bug-list.md            # Bug 清单
+│      - DELIVERY-MANIFEST.md   # 交付清单
+│      - {module}/src/test/java/  # 可执行的自动化测试代码
+│    执行:
+│      1. 手动验证核心接口(冒烟)
+│      2. 编写自动化测试(JUnit 4 + Spring Boot Test)
+│      3. ./gradlew test 确认全部通过
+│      4. 结果写入 test-report.md
+│         │
+│         ▼ merge request → main
+│         │
+[业务领导] 审查 DELIVERY-MANIFEST.md → 最终验收
+     │  (含对上团队问题处理)
+```
+
+### 附录A:并行开发合并策略
+
+当 Team C 拆分为 Backend 和 Frontend 并行开发时:
+
+**1. 文件所有权划分(业务领导派单时明确)**
+
+```
+Team C-Backend 拥有:
+  - src/main/java/**(所有 Java 代码)
+  - src/main/resources/mapper/**(MyBatis XML)
+  - schema.sql
+
+Team C-Frontend 拥有:
+  - src/main/resources/templates/**(HTML 模板)
+  - src/main/resources/static/**(CSS/JS/图片)
+
+共享文件(由业务领导预先定义模板):
+  - src/main/resources/application.properties
+    → Backend 负责:server.port、数据库配置、MyBatis 配置
+    → Frontend 负责:静态资源路径、模板引擎配置
+    → 双方只填充各自段落,不得修改对方段落
+
+禁止修改的文件(任何一方都不允许修改):
+  - pom.xml(由业务领导统一管理)
+  - .gitignore(由业务领导统一管理)
+  - 已合并到 main 的其他团队交付物
+```
+
+**2. 合并流程**
+
+```
+1. Backend 和 Frontend 各自完成
+2. 业务领导对比两方的 DELIVERY-MANIFEST.md 中的修改文件清单
+3. 检查清单:
+   a. 是否有重叠文件 → 手动解决冲突
+   b. 是否有修改"禁止修改"的文件 → 打回
+   c. 是否有修改未明确归属的文件 → 业务领导判定归属
+4. 无冲突 → 统一 commit
+```
+
+**3. DELIVERY-MANIFEST.md 补充字段**
+
+```markdown
+## 修改文件清单(Team C 必填)
+
+| 序号 | 文件路径 | 操作类型 | 说明 |
+|------|----------|----------|------|
+| 1 | src/main/java/.../UserController.java | 新增 | 用户模块 Controller |
+| 2 | src/main/resources/application.properties | 修改 | 添加数据库配置(仅 DB 段落) |
+```
+
+### 附录B:环境就绪检查清单
+
+M3→M4 派单前,业务领导必须完成以下检查:
+
+| 序号 | 检查项 | 状态 |
+|------|--------|------|
+| 1 | `./gradlew bootRun` 启动无报错(在具体模块目录内执行) | □ |
+| 2 | 启动日志无 ERROR | □ |
+| 3 | 核心 API 冒烟测试通过(≥2个) | □ |
+
+- **通过**:所有检查项均为 ✓
+- **不通过**:记录失败项,先修复环境问题,再派单 Team D
+
+检查结果记录到 `docs/environment-checklist.md`。
+
+---
+
+## 四、Git 分支命名规范
+
+```
+main                          # 主分支,每个里程碑合并
+phase/01-requirement          # 各阶段工作分支
+phase/02-architecture
+phase/03-coding
+phase/04-testing
+rework/01-requirement         # 返工分支
+rework/02-architecture
+rework/03-coding
+backport/arch-api-fix          # 回溯分支:修复架构接口定义
+backport/req-clarification     # 回溯分支:澄清需求歧义
+```
+
+### Commit Message 规范
+
+```
+[milestone-N] 简述内容
+例: [milestone-1] 完成用户模块需求规格
+
+[rework-N] 简述返工内容
+例: [rework-1] 补充用户权限约束条件
+
+[backport-N] 简述回溯修改内容
+例: [backport-1] 修正 User API 返回值定义,增加 errorCode 字段
+```
+
+---
+
+## 五、仓库目录结构
+
+```
+repo/
+├── docs/
+│   ├── charter.md                  # 业务领导:项目章程、目标、验收标准
+│   ├── acceptance-criteria.md      # 业务领导:每个里程碑的通过条件
+│   ├── project-log.md              # 业务领导:项目生命周期日志
+│   ├── environment-checklist.md    # 业务领导:环境就绪检查(M3→M4)
+│   └── reviews/
+│       ├── milestone-1-review.md   # 业务领导评审记录
+│       ├── milestone-2-review.md
+│       └── ...
+│
+├── deliveries/                     # ===== 各团队交付目录 =====
+│   │
+│   ├── team-a-requirement/         # Team A 独属目录
+│   │   ├── DELIVERY-MANIFEST.md    # 交付清单
+│   │   ├── spec.md                 # 需求规格
+│   │   ├── use-cases.md            # 用例文档
+│   │   └── constraints.md          # 约束条件
+│   │
+│   ├── team-b-architecture/        # Team B 独属目录
+│   │   ├── DELIVERY-MANIFEST.md    # 交付清单
+│   │   ├── design.md               # 架构设计文档
+│   │   ├── api-definition.md       # 接口定义
+│   │   └── tech-stack.md           # 技术选型说明
+│   │
+│   ├── team-c-coding/              # Team C 独属目录
+│   │   ├── DELIVERY-MANIFEST.md    # 交付清单
+│   │   └── impl-notes.md           # 实现说明(可选)
+│   │
+│   └── team-d-testing/             # Team D 独属目录
+│       ├── DELIVERY-MANIFEST.md    # 交付清单
+│       ├── test-cases.md           # 测试用例
+│       ├── test-report.md          # 测试报告
+│       └── bug-list.md             # Bug 清单
+│
+├── com.fenzhitech.crrc.service-xxx/   # Team C 代码产物(各业务模块)
+│   ├── src/main/java/...              #   业务代码
+│   ├── src/main/resources/...         #   配置 + MyBatis XML 映射
+│   └── src/test/java/...              #   Team D 自动化测试代码
+├── com.fenzhitech.crrc.service-common/ # 共享库模块(只读,修改需返工流程)
+├── tests/                              # Team D 测试文档目录(deliveries 内的子目录备选)
+│
+└── rework/                             # 返工请求
+    └── rework-01.md                # 返工请求文档
+```
+
+### 目录归属规则
+
+- 每个团队只能在自己的 `deliveries/team-X-xxx/` 目录下提交交付产物
+- 跨目录修改需要通过返工流程
+- 各业务模块 `com.fenzhitech.crrc.service-*/src/main/java/` 由 Team C 产出
+- 各业务模块 `com.fenzhitech.crrc.service-*/src/test/java/` 由 Team D 产出
+- `com.fenzhitech.crrc.service-common/` 是共享库模块,修改需通过返工流程,且修改后需优先编译验证
+
+---
+
+## 六、交付清单机制 (DELIVERY-MANIFEST.md)
+
+每个团队在提交最终交付前,必须在自己的交付目录下维护一份 `DELIVERY-MANIFEST.md`。
+
+### 清单模板
+
+```markdown
+# 交付清单 — [团队名称]
+
+## 里程碑信息
+- 阶段: [需求分析 / 架构设计 / 编码实现 / 测试验收]
+- 里程碑编号: milestone-N
+- 提交时间: YYYY-MM-DD HH:MM
+- 负责团队: Team X
+
+## 交付产物
+
+| 序号 | 文件路径 | 说明 | 覆盖度检查 | 核心内容摘要 |
+|------|----------|------|------------|--------------|
+| 1 | deliveries/team-a-requirement/spec.md | 需求规格文档 | 模块数: 3/3, 功能点: 12/12 | 包含用户模块、订单模块、报表模块 |
+| 2 | deliveries/team-a-requirement/use-cases.md | 用例文档 | 用例数: 20/20, 覆盖需求: 全部 | 覆盖所有功能点 |
+
+## 修改文件清单(Team C 必填,其他团队可选)
+
+| 序号 | 文件路径 | 操作类型 | 说明 |
+|------|----------|----------|------|
+| 1 | src/main/java/.../UserController.java | 新增 | 用户模块 Controller |
+
+## 交付说明
+(简要说明本次交付的核心内容、关键决策)
+
+## 给下游团队的关键信息(必填)
+- 关键决策:(本次交付中最重要的技术/业务决策)
+- 隐含约束:(下游必须遵守的限制)
+- 特别注意:(需要提醒下游的事项)
+
+## 对上团队的问题(可选)
+(当前团队在工作中发现的、需要上游团队澄清或修正的问题。
+  业务领导审查时应当关注这些问题,必要时触发跨阶段回溯。)
+- 问题:(描述问题,引用上游交付物中的具体章节/行号)
+- 期望:(期望上游如何修正)
+- 影响范围:(问题影响哪些下游工作)
+
+## 待确认事项
+(如有需要业务领导确认的问题,列在此处)
+```
+
+### 覆盖度检查字段说明
+
+每个团队的覆盖度检查含义不同:
+
+| 团队 | 覆盖度定义 | 示例 |
+|------|-----------|------|
+| Team A | spec.md 模块数 / charter.md 总模块数;use-cases.md 功能点 / charter.md 总功能点 | 模块数: 3/3 |
+| Team B | api-definition.md 接口数 / spec.md 功能点数;DDL 表数 / 需求实体数 | 接口数: 8/8 |
+| Team C | 实现接口数 / api-definition.md 接口数;编译自检通过的模块数 | 接口实现: 8/8 |
+| Team D | 测试用例数 / use-cases.md 用例数;核心接口测试 / 领导指定核心接口 | 用例覆盖: 20/20 |
+
+> **为什么不用行数?** 行数不反映质量。500 行可能是模板填充或注释堆砌,50 行可能是高度精炼。"覆盖度检查"让审查者一眼看出交付物是否完整覆盖了上游定义的预期范围,且覆盖度描述本身迫使团队核算交付完整性。
+
+### 业务领导查验流程
+
+```
+1. 团队提交 merge request
+2. 业务领导读取 DELIVERY-MANIFEST.md
+3. 按清单逐项查验:
+   a. 用 Glob 工具确认文件存在
+   b. 检查清单中的"覆盖度检查"和"核心内容摘要"是否合理
+   c. 用 Read 工具抽查 1 个文件,核对内容与清单描述是否一致
+   d. 检查"给下游团队的关键信息"是否完整
+   e. 检查"对上团队的问题"字段 —— 如有问题,优先处理:
+      - 可立即澄清的:业务领导直接回复
+      - 需上游修改的:触发跨阶段回溯流程(见第九章回溯部分)
+4. M3 阶段:执行风险导向分层代码抽查(见第八章)
+5. 输出评审文档 docs/reviews/milestone-N-review.md
+6. 做出决策:
+   - Go → merge to main,记录日志
+   - No-Go → 打回,附具体修改意见,记录日志
+```
+
+### Prompt 模板嵌入(强制执行)
+
+为确保子 Agent 严格按模板输出交付清单,在 delegate_task 的 prompt 末尾必须嵌入以下指令:
+
+```
+你必须在交付目录下创建 DELIVERY-MANIFEST.md,严格按以下格式:
+
+# 交付清单 — [团队名称]
+
+## 里程碑信息
+- 阶段: [需求分析 / 架构设计 / 编码实现 / 测试验收]
+- 里程碑编号: milestone-N
+- 提交时间: YYYY-MM-DD HH:MM
+- 负责团队: Team X
+
+## 交付产物
+
+| 序号 | 文件路径 | 说明 | 覆盖度检查 | 核心内容摘要 |
+|------|----------|------|------------|--------------|
+| 1    | ...      | ...  | ...        | ...          |
+
+## 修改文件清单(Team C 必填)
+| 序号 | 文件路径 | 操作类型 | 说明 |
+|------|----------|----------|------|
+| 1    | ...      | 新增/修改/删除 | ... |
+
+## 交付说明
+(核心内容、关键决策)
+
+## 给下游团队的关键信息(必填)
+- 关键决策:(本次交付中最重要的技术/业务决策)
+- 隐含约束:(下游必须遵守的限制)
+- 特别注意:(需要提醒下游的事项)
+
+## 对上团队的问题(可选)
+(列出需要上游团队澄清的问题,包括问题描述、期望、影响范围)
+
+## 待确认事项
+(需要业务领导确认的问题)
+
+⚠️ 不按此格式输出视为交付不完整。
+⚠️ "给下游团队的关键信息"缺失视为交付不完整。
+⚠️ 发现上游交付物有歧义或矛盾时,必须在"对上团队的问题"中记录,不得保持沉默。
+```
+
+---
+
+## 七、项目生命周期日志 (project-log.md)
+
+业务领导维护一份贯穿项目全生命周期的日志文档。
+
+### 日志模板
+
+```markdown
+# 项目生命周期日志
+
+## 项目基本信息
+- 项目名称: XXX
+- 启动时间: YYYY-MM-DD
+- 项目目标: (一句话描述)
+- 当前状态: [进行中 / 已交付 / 已暂停]
+
+---
+
+## 日志记录
+
+### [YYYY-MM-DD HH:MM] 项目启动
+- 动作: 初始化项目仓库,定义项目章程
+- 产出: docs/charter.md, docs/acceptance-criteria.md
+
+### [YYYY-MM-DD HH:MM] Milestone 1 — 需求分析派单
+- 动作: 派单给 Team A
+- 预期交付: 需求规格、用例、约束条件
+
+### [YYYY-MM-DD HH:MM] Milestone 1 — 审查
+- 审查结果: [通过 / 不通过]
+- 意见: (评审意见)
+- 决策: [Go / No-Go]
+- 提取的关键信息: (将传递给 Team B 的内容)
+
+### [YYYY-MM-DD HH:MM] 返工(如有)
+- 原因: (具体问题)
+- 返工次数: 第 X 次
+- 处理: (修改意见)
+
+...(后续里程碑同理)
+
+### [YYYY-MM-DD HH:MM] 项目交付
+- 最终状态: 所有里程碑通过
+- 交付版本: tag v1.0
+- 统计: 返工 X 次,一次通过率 X%,总历时 Xh Xm
+```
+
+### 过程改进数据
+
+> 以下数据由业务领导在项目执行过程中持续更新,用于评估流程效果和指导后续迭代改进。
+
+#### 阶段耗时统计
+
+| 阶段 | 派出时间 | 交付时间 | 总耗时 | 说明 |
+|------|---------|---------|--------|------|
+| M1 需求分析 | YYYY-MM-DD HH:MM | YYYY-MM-DD HH:MM | Xh Xm | - |
+| M2 架构设计 | YYYY-MM-DD HH:MM | YYYY-MM-DD HH:MM | Xh Xm | - |
+| M3 编码实现 | YYYY-MM-DD HH:MM | YYYY-MM-DD HH:MM | Xh Xm | 含返工/回溯 |
+| M4 测试验收 | YYYY-MM-DD HH:MM | YYYY-MM-DD HH:MM | Xh Xm | 含返工/回溯 |
+
+#### 返工统计
+
+| 阶段 | 返工次数 | 团队 | 最常见原因 |
+|------|---------|------|-----------|
+| M1 需求分析 | X | Team A | 需求遗漏 / 约束不完整 / ... |
+| M2 架构设计 | X | Team B | 接口定义不覆盖需求 / 技术选型不合理 / ... |
+| M3 编码实现 | X | Team C | 编译错误 / 与接口定义不一致 / ... |
+| M4 测试验收 | X | Team D | 用例遗漏 / 测试未通过 / ... |
+
+#### 一次通过率
+
+| 阶段 | 一次通过率 |
+|------|-----------|
+| M1 需求分析 | X% |
+| M2 架构设计 | X% |
+| M3 编码实现 | X% |
+| M4 测试验收 | X% |
+| 项目整体 | X% |
+
+#### 失败原因分类(Top N)
+
+| 排名 | 失败原因 | 出现次数 | 涉及阶段 |
+|------|---------|---------|---------|
+| 1 | 接口定义与实际实现不一致 | X | M2→M3 |
+| 2 | 测试用例未覆盖核心接口 | X | M4 |
+| 3 | 数据库 Schema 遗漏字段 | X | M2 |
+| ... | ... | ... | ... |
+
+> 说明:阶段耗时由业务领导在日志中自动计算(派出时间与审查时间的差值)。
+> 返工次数和一次通过率在每次审查/返工时累计。失败原因分类在每次 No-Go 决策时记录。
+> 这些数据用于下一轮迭代的过程改进,不在当前交付中强制要求。
+
+### 日志维护规则
+
+- 每个关键动作(派单、审查、返工、决策、交付)都必须追加一条日志
+- 日志按时间顺序排列,不可删除或修改历史记录
+- 业务领导在每次决策后立即更新日志
+
+---
+
+## 八、里程碑与审批机制
+
+每个里程碑结束时,业务领导执行审批:
+
+```
+1. 读取该阶段团队的 DELIVERY-MANIFEST.md
+2. 按清单逐项查验:
+   a. 用 Glob 工具确认文件存在
+   b. 检查清单中的"覆盖度检查"和"核心内容摘要"是否合理
+   c. 用 Read 工具抽查 1 个文件,核对内容与清单描述是否一致
+   d. 对照 acceptance-criteria.md 中的通过条件
+   e. 检查"对上团队的问题"字段 —— 如有问题,优先处理或触发回溯
+3. 交叉验证:
+   M1 评审 → 对照 charter.md 核对需求覆盖度
+   M2 评审 → 对照 spec.md 核对 API 覆盖度
+   M3 评审 → 对照 api-definition.md 核对实现 + 复核编译自检结果 + 风险导向分层代码抽查
+   M4 评审 → 对照 use-cases.md 核对测试用例覆盖度 + 验证自动化测试通过
+4. 检查"给下游团队的关键信息"是否完整
+5. 输出评审文档 docs/reviews/milestone-N-review.md
+6. 更新 docs/project-log.md
+7. 做出决策:
+   - Go → merge to main
+   - No-Go → 打回,附具体修改意见
+```
+
+### 量化验收指标
+
+| 里程碑 | 量化检查项 |
+|--------|------------|
+| M1 需求 | spec.md 每个功能模块有独立章节;use-cases.md 覆盖 charter.md 中每个功能点;"给下游团队的关键信息"完整 |
+| M2 架构 | api-definition.md 接口数 ≥ spec.md 功能点数;DDL 每张表有字段注释;"给下游团队的关键信息"完整 |
+| M3 编码 | DELIVERY-MANIFEST.md 中注明编译自检结果;业务领导复核 `./gradlew compileJava`(受影响的模块)零错误;每个 Controller 方法对应 api-definition.md 中一个接口;风险导向分层抽查通过 |
+| M4 测试 | 测试用例数 ≥ use-cases.md 用例数;自动化测试 `./gradlew test` 通过(新增测试 + 已有测试);Bug 清单含复现步骤+严重等级;测试覆盖业务领导指定的重点场景;核心接口测试覆盖率 ≥ 80% |
+
+### 风险导向代码分层抽查(M3 阶段)
+
+业务领导在 M3 审查时,按以下分层策略执行抽查:
+
+#### 分层抽样策略
+
+根据变更文件总数决定抽样深度:
+
+| 变更文件数 | 抽样基数 | 抽样策略 |
+|-----------|---------|---------|
+| 1-5 个    | 全量    | 100% 文件抽查 |
+| 6-15 个   | 至少 4 个 | 高风险层 100% + 中风险层抽样 2 个 |
+| 16-30 个  | 至少 6 个 | 高风险层 100% + 中风险层 3 个 + 低风险层 1 个 |
+| 30+ 个    | 至少 8 个 | 高风险层 100% + 中风险层 4 个 + 低风险层 2 个 |
+
+#### 风险分层
+
+**第一层(高风险 — 100% 抽查):**
+- Controller 类(涉及用户输入)
+- MyBatis XML 文件(涉及 SQL,需检查 `${}` 注入)
+- 涉及权限校验的文件
+- 涉及金额计算的业务逻辑
+
+检查项:无硬编码密钥/密码、用户输入有校验(`@Valid`、参数校验注解)、SQL 全部使用 `#{}` 参数化(无 `${}` 字符串替换)、无敏感数据硬编码、文件不超过 500 行
+
+**第二层(中风险 — 按比例抽样):**
+- Service/Application 类(业务逻辑)
+- 公共工具类
+- 切面类(Aspect)
+
+检查项:命名符合项目规范、异常处理合理(有 try-catch 或 throws 声明)、关键路径有日志、文件不超过 500 行
+
+**第三层(低风险 — 抽样 1-2 个):**
+- 常量/枚举类
+- VO/DTO 类
+- 配置类
+
+检查项:命名符合项目规范、无明显的拼写错误或模板残留
+
+#### CRRC 专项补充
+
+当变更文件清单中包含 MyBatis XML 文件时,必须额外执行:
+
+```
+MyBatis XML 专项检查(详见附录 C.4):
+- Grep 搜索 \$\{[^#] 确认无字符串替换
+- 验证 namespace 与 Java 接口匹配
+- 验证 resultType 引用的类存在
+```
+
+#### 抽样记录
+
+业务领导将抽查结果记录在 `docs/reviews/milestone-N-review.md` 中:
+
+```markdown
+## 代码抽样记录
+- 变更文件总数: X 个
+- 抽样基数: Y 个(高风险 Z 个)
+- 抽查文件列表:
+  | 文件 | 风险层 | 检查结果 | 备注 |
+  |------|--------|---------|------|
+  | ...  | 高     | 通过    | -    |
+  | ...  | 中     | 发现问题 | 见下方说明 |
+- 发现的问题: (如有)
+- 结论: [通过 / 需修改后重审]
+```
+
+### Team D 测试重点指定
+
+业务领导派单给 Team D 时,必须在 prompt 中指定测试重点:
+
+```
+## 测试重点(业务领导指定)
+
+### 核心接口(必须测试)
+- /api/login — 用户登录
+- /api/orders — 订单创建和查询
+- /api/users — 用户管理
+
+### 重点场景
+- 用户登录成功/失败
+- 订单创建成功/参数校验失败
+- 并发场景(可选,如时间允许)
+
+### 已知风险
+- 订单模块的并发处理未做压力测试
+- 报表导出功能性能未验证
+
+### 测试范围
+- 功能测试:必须覆盖上述核心接口
+- 边界测试:必须覆盖参数校验场景
+- 性能测试:可选
+- 安全测试:可选
+```
+
+### Team D 自动化测试质量要求
+
+Team D 产出的测试代码需满足以下质量要求:
+
+1. **通过率**:`./gradlew test` 全部通过(不能仅因为新增测试而跳过)
+2. **独立性**:每个测试方法独立运行,不依赖其他测试的执行顺序
+3. **可重复**:同一测试多次运行结果一致
+4. **不修改源代码**:测试代码不得修改 `src/main/java/` 下的任何文件
+5. **无网络依赖**:单元测试不应依赖外部服务(使用 Mock)
+6. **JUnit 4 风格**:使用 `@Test` 注解,非 JUnit 5
+
+> 注意:当前项目测试覆盖极少。Team D 的策略是"核心接口优先"——优先为业务领导指定的核心接口编写测试,再视时间补充其他场景。不必追求 100% 覆盖率。
+
+如果产出的测试代码未通过编译,必须在"对上团队的问题"中反馈,不得跳过。
+
+---
+
+## 九、返工机制
+
+### 设计原则
+
+- 返工由**业务领导主动触发**
+- 返工不是重做,是针对具体问题的定向修补
+- 返工次数上限 2 次,第 3 次触发升级机制
+
+### 返工触发方式
+
+```
+1. 业务领导在评审中发现交付不达标
+2. 基于 main 开 rework/XX-阶段名 分支
+3. 提交 rework-request.md(必须包含具体修改指令)
+4. 更新 project-log.md
+5. 重新 delegate_task 给原团队
+6. 返工完成后重新走 merge → review 流程
+```
+
+### 返工升级路径
+
+```
+返工1次(原团队修改):
+  - 业务领导提出具体修改意见
+  - 原团队修改
+  - 业务领导重新审查
+  - 通过 → 进入下一阶段
+  - 不通过 → 返工2次
+
+返工2次(业务领导介入指导):
+  - 业务领导提供精确到文件、内容的修改指令
+  - 原团队按指令执行
+  - 业务领导重新审查
+  - 通过 → 进入下一阶段
+  - 不通过 → 返工3次(升级)
+
+返工3次(升级处理):
+  - 标记为 BLOCKED
+  - 业务领导按以下决策树判断:
+
+    ┌─ 问题是否因为任务太复杂?
+    │   → 是 → 拆分任务,将大任务拆成多个小任务,分别派单
+    │   → 否 ↓
+    │
+    ├─ 问题是否因为需求不清晰?
+    │   → 是 → 重新定义需求,可能需要 Team A 返工
+    │   → 否 ↓
+    │
+    ├─ 问题是否因为子Agent能力不足?
+    │   → 是 → 业务领导提供更详细的指令(精确到代码级别),重新派单
+    │   → 否 ↓
+    │
+    └─ 该功能是否为核心功能?
+        → 是 → 标记为 BLOCKED,人工介入(如果有开发人员)
+        → 否 → 降级需求,从 charter.md 中移除
+
+  - 无论选择哪种,必须在 project-log.md 中记录决策和原因
+```
+
+### 返工请求模板
+
+```markdown
+# 返工请求 — [阶段名称]
+
+## 基本信息
+- 返工编号: rework-N
+- 触发时间: YYYY-MM-DD HH:MM
+- 目标团队: Team X
+- 返工次数: 第 X 次
+- 原因类型: [质量问题 / 需求变更 / 任务复杂度]
+
+## 问题描述
+(具体描述问题,必须具体到文件、章节、内容)
+
+## 具体修改要求
+1. 修改点1:[文件路径] [具体修改内容]
+2. 修改点2:[文件路径] [具体修改内容]
+
+## 期望完成标准
+(怎样算修改完成)
+```
+
+### 跨阶段回溯返工
+
+#### 触发条件
+
+当 M3/M4 阶段发现的问题根源在上游阶段(M1/M2),且无法通过当前阶段的局部修补解决时,启动回溯返工:
+
+```
+典型场景:
+1. M3 编码时发现 M2 架构设计有缺陷(接口定义不合理、技术选型不支持需求)
+2. M3 编码时发现 M1 需求有歧义或遗漏
+3. M4 测试时发现 M2 架构设计导致功能不可测试
+4. M4 测试时发现 M1 需求定义与用户实际场景不符
+```
+
+#### 回溯流程
+
+```
+[发现者] 在 DELIVERY-MANIFEST.md 的"对上团队的问题"中注明
+     │
+     ▼
+[业务领导] 评估影响范围:
+     │  - 问题是否影响其他并行模块?
+     │  - 修复需要的工时估算(粗略)
+     │  - 是否存在临时绕过方案?
+     │
+     ├── 影响面小 → 业务领导直接在上游文档中打补丁(inline fix)
+     │   ├ 在 docs/reviews/ 中记录补丁说明
+     │   └ 继续当前阶段,不中断主线
+     │
+     └── 影响面大 → 启动回溯返工流程:
+
+         1. 冻结当前阶段的 merge(暂不合并到 main)
+         2. 从 main(而非当前工作分支)开回溯分支:
+            backport/reason-xxx-description
+         3. 业务领导编写 backtrack-request.md:
+            - 问题描述(精确到文件、行号)
+            - 需要修改的上游文件
+            - 修改要求
+            - 预期对其他模块的影响
+         4. 派出原上游团队(Team A 或 Team B)在回溯分支上修改
+         5. 修改完成后,业务领导审查回溯分支
+         6. 审查通过 → 合并回溯分支到 main → 打 tag: backtrack-v<N>
+         7. 当前阶段团队 rebase 到 main(或重新从 main 开分支)
+         8. 继续当前阶段工作
+```
+
+#### 回溯 vs 普通返工的区别
+
+| 维度 | 普通返工 | 回溯返工 |
+|------|---------|---------|
+| 触发者 | 业务领导在审查中发现 | 下游团队在工作中发现 |
+| 修改对象 | 当前阶段的交付物 | 上游阶段(已合并到 main)的交付物 |
+| 分支策略 | 从 main 开 rework/分支 | 从 main 开 backport/分支 |
+| merge 后 | 正常进入下一阶段 | 下游团队需 rebase |
+| 次数上限 | 2 次 | 1 次(仍不通过则进入升级流程) |
+
+#### 回溯请求模板
+
+```markdown
+# 回溯请求 — [阶段名称]
+
+## 基本信息
+- 回溯编号: backport-N
+- 触发时间: YYYY-MM-DD HH:MM
+- 目标团队: Team X(被回溯的上游团队)
+- 发现团队: Team Y(发现问题的下游团队)
+- 触发文件: (下游团队在 DELIVERY-MANIFEST 中记录问题的文件路径)
+
+## 问题描述
+(具体描述问题,引用上游交付物中的具体文件、章节、行号)
+
+## 影响范围
+- 受影响的并行模块列表
+- 预计修复工时
+- 是否存在临时绕过方案
+
+## 修改要求
+1. [目标文件路径] [具体修改内容]
+2. [目标文件路径] [具体修改内容]
+
+## 期望完成标准
+(怎样算修改完成)
+```
+
+---
+
+## 十、业务领导管控点
+
+| 管控点 | 动作 | 产出文件 | 检查方式 |
+|--------|------|----------|----------|
+| 项目启动 | 定义目标 + 验收标准 | charter.md, project-log.md | - |
+| 派单 | 指定团队 + 提炼上下文 + 下发任务 | project-log.md | 每次 No-Go 决策时记录失败原因分类 |
+| Milestone 审批 | 查验交付清单 → Go/No-Go | reviews/milestone-N.md, project-log.md | Glob确认文件存在 + Read抽查1个文件 |
+| 代码抽查(M3) | 风险导向分层抽查 | 记录在 milestone-N-review.md | 按风险分层从修改清单中选择,数量取决于变更总数 |
+| 环境就绪检查 | 启动 + 冒烟测试 | environment-checklist.md | 实际执行 `./gradlew` 命令验证 |
+| 返工决策 | 决定打回 + 具体修改指令 | rework/rework-N.md, project-log.md | - |
+| 回溯返工 | 评估影响 → 开 backport/ 分支 → 派出上游团队 → 审查 → 通知下游 rebase | backtrack-request.md, project-log.md | 检查回溯分支修改是否精准、未引入副作用 |
+| 最终验收 | 全量审查 → 发布/打回 | release tag, project-log.md | - |
+
+---
+
+## 十一、与 Hermes 的执行映射
+
+```
+我 (GLM-5.1)        → 业务领导:拆任务、审批、决策、维护日志、提炼上下文、指定测试重点
+delegate_task       → 派出各职能团队(子 Agent 只负责写文件,不操作 Git)
+  Team A prompt     → "你是需求分析师,基于 docs/ 产出需求规格到 deliveries/team-a-requirement/
+                       你必须创建 spec.md、use-cases.md、constraints.md、DELIVERY-MANIFEST.md
+                       DELIVERY-MANIFEST.md 必须包含'给下游团队的关键信息'字段"
+  Team B prompt     → "你是架构师,基于 main 上的需求文档设计架构到 deliveries/team-b-architecture/
+                       [业务领导嵌入 Team A 的关键信息]
+                       你必须创建 design.md、api-definition.md、tech-stack.md、DELIVERY-MANIFEST.md
+                       DELIVERY-MANIFEST.md 必须包含'给下游团队的关键信息'字段"
+  Team C prompt     → "你是开发者,基于架构文档编码到各模块 src/main/java/
+                       [业务领导嵌入 Team B 的关键信息]
+                       你必须在 DELIVERY-MANIFEST.md 中列出修改文件清单
+                       DELIVERY-MANIFEST.md 必须包含'给下游团队的关键信息'字段
+                       完成编码后,进入每个修改的模块目录执行 ./gradlew compileJava 自检
+                       自检结果写入 DELIVERY-MANIFEST.md 的'交付说明'字段"
+                       (可拆为 C-ModuleA + C-ModuleB 并行,按模块边界划分文件所有权)
+  Team D prompt     → "你是测试工程师,基于代码产出测试:
+                       - 测试文档: deliveries/team-d-testing/test-cases.md, test-report.md, bug-list.md, DELIVERY-MANIFEST.md
+                       - 自动化测试: {affected_module}/src/test/java/ 目录,JUnit 4 + Spring Boot Test 风格
+                       [业务领导嵌入测试重点 + Team C 的关键信息]
+                       自动化测试必须可编译、可通过(./gradlew test)
+                       测试用例必须覆盖业务领导指定的核心接口和重点场景
+                       测试结果写入 test-report.md"
+git add/commit      → 业务领导负责
+git merge --no-ff   → 业务领导在每个里程碑审批通过后执行
+返工                → 重新 delegate_task,附带返工请求中的具体修改指令
+回溯返工            → 业务领导开 backport/ 分支 → delegate_task 给上游团队
+                      → 上游修改后审查 → merge → 通知下游 rebase
+project-log.md      → 每次决策后追加日志
+
+审查流程:
+  1. Glob 确认文件存在
+  2. 检查 DELIVERY-MANIFEST.md 中的"覆盖度检查"和"核心内容摘要"
+  3. Read 抽查 1 个文件,核对内容与清单描述是否一致
+  4. M3 阶段:风险导向**分层**代码抽查(含 MyBatis XML 专项检查)
+  5. 检查"给下游团队的关键信息"是否完整
+  6. 检查"对上团队的问题"字段,如有问题优先处理
+
+⚠️ 关键约束:子 Agent 运行在隔离环境中,无法直接调用 git。
+   所有 git 操作必须由业务领导执行。
+   子 Agent 的职责仅限于:读取文件 → 分析/编码 → 写入文件到指定目录。
+```
+
+---
+
+## 十二、执行保障清单
+
+为确保流程可执行,业务领导在每个关键节点必须完成以下检查:
+
+### 派单前检查
+
+- [ ] 已读取当前阶段的 DELIVERY-MANIFEST.md
+- [ ] 已提取"给下游团队的关键信息"
+- [ ] 已在 prompt 中嵌入关键信息
+- [ ] (Team C)已明确文件所有权划分
+- [ ] (Team D)已指定测试重点
+
+### 审查时检查
+
+- [ ] 已用 Glob 确认所有交付文件存在
+- [ ] 已检查"覆盖度检查"和"核心内容摘要"是否合理
+- [ ] 已用 Read 抽查 1 个文件,内容与清单一致
+- [ ] 已检查"给下游团队的关键信息"是否完整
+- [ ] 已检查"对上团队的问题"字段,如有问题已处理
+- [ ] (M3)Team C 已在 DELIVERY-MANIFEST.md 中注明编译自检结果
+- [ ] (M3)业务领导复核 ./gradlew compileJava 通过(受影响的模块)
+- [ ] (M3)已执行风险导向分层代码抽查(抽样记录已写入 milestone-N-review.md)
+- [ ] (M3,CRRC 项目)如有 MyBatis XML 变更,已完成 XML 专项检查
+- [ ] (M4)Team D 编写的自动化测试 ./gradlew test 通过
+- [ ] (M4)测试代码未修改 src/main/java/ 下的文件
+- [ ] (M4)核心接口测试覆盖了业务领导指定的重点场景
+- [ ] 已输出评审文档
+- [ ] 已更新 project-log.md
+
+### 返工时检查
+
+- [ ] 已明确返工原因(质量问题/需求变更/任务复杂度)
+- [ ] 已提供具体修改指令(精确到文件、内容)
+- [ ] 已更新 project-log.md
+- [ ] 返工次数未超过 2 次(超过则触发升级机制)
+
+### 回溯时检查
+
+- [ ] 已评估影响范围,确认是否有临时绕过方案
+- [ ] 已确认回溯分支从 main(而非当前工作分支)开出
+- [ ] 已提供精确到文件、行号的修改要求
+- [ ] 修改完成后,已通知当前阶段团队 rebase
+- [ ] 已更新 project-log.md 记录回溯原因和处理
+
+---
+
+## 附录C:CRRC 项目适配指南
+
+> 本附录汇总了 CRRC 项目(Java 8 / Spring Boot 1.5.9 / Gradle 多模块)特有的流程适配点。
+> 当流程在 CRRC 项目中执行时,以下约定优先于正文通用描述。
+
+### C.1 多模块 Gradle 构建
+
+CRRC 项目是约 20 个独立 Gradle 模块的集合,每个模块拥有独立的 `build.gradle` 和 `gradlew`:
+- **根目录没有** `settings.gradle`,各模块独立编译
+- 必须**进入具体模块目录**再执行 `./gradlew` 命令
+- `service-common` 是共享库,修改公共 DTO/VO/常量后,先编译该模块,再编译依赖它的业务模块
+
+编译验证命令示例:
+
+```bash
+# 验证 service-bill 模块编译
+cd com.fenzhitech.crrc.service-bill
+./gradlew compileJava
+
+# 依赖链编译(先公共库,后业务模块)
+cd com.fenzhitech.crrc.service-common && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-bill && ./gradlew compileJava
+```
+
+并行开发时,文件所有权按**模块粒度**划分(见 C.3)。
+
+### C.2 测试框架约定
+
+- 测试框架:Spring Boot 1.5.x Starter Test + JUnit 4
+- 测试目录:标准 `src/test/java/`(非 `src/main/test/`)
+- 已有测试样例:`com.fenzhitech.crrc.service-message/src/test/main/ServiceTest.java`
+- Team D 不得在 `src/main/` 下创建测试文件
+- 项目当前测试覆盖极少 —— Team D 的策略是"核心接口优先",优先为业务领导指定的核心接口编写测试
+
+### C.3 多模块文件所有权模型
+
+替代附录A中的"单模块文件所有权",CRRC 模式下 Team C 的并行拆分按**模块边界**划分:
+
+```
+Team C-User 负责:
+  - com.fenzhitech.crrc.service-user/src/main/java/**(全部 Java 代码)
+  - com.fenzhitech.crrc.service-user/src/main/resources/**(配置 + MyBatis XML)
+
+Team C-Bill 负责:
+  - com.fenzhitech.crrc.service-bill/src/main/java/**
+  - com.fenzhitech.crrc.service-bill/src/main/resources/**
+
+Team C-Gateway 负责:
+  - com.fenzhitech.crrc.gateway-*/src/main/java/**
+  - com.fenzhitech.crrc.gateway-*/src/main/resources/**
+
+共享库(任何 Team C 子团队不可擅自修改,需通过返工流程):
+  - com.fenzhitech.crrc.service-common/**
+
+禁止修改的文件:
+  - 各模块 build.gradle(由业务领导统一管理)
+  - .gitignore
+  - 已合并到 main 的其他阶段交付物
+```
+
+### C.4 MyBatis XML 专项检查
+
+CRRC 项目使用 MyBatis XML 动态 SQL。M3 代码抽查中,必须增加对 XML 的专项检查:
+
+**检查项(覆盖所有新增/修改的 XML 文件):**
+
+| 序号 | 检查项 | 说明 |
+|------|--------|------|
+| 1 | 禁止 `${}` 字符串替换 | 参数必须使用 `#{}` 语法,`${}` 可能导致 SQL 注入 |
+| 2 | namespace 一致性 | Mapper namespace 必须与 Java Mapper 接口全限定名一致 |
+| 3 | resultType 有效性 | `resultType` 引用的 VO/Entity 类必须存在(用 Glob 确认) |
+| 4 | 文件路径规范 | 必须位于 `src/main/resources/mapper/{domain}/` |
+| 5 | mybatis.base.package | `application.properties` 中的扫描路径需覆盖新增的 mapper 包 |
+
+**`${}` 排查方法:** 用 Grep 搜索 XML 文件中的 `$` 符号:
+
+```
+Grep pattern: \$\{[^#]
+```
+
+匹配到的行需要逐一审查,确认是否为合法的动态表名/列名使用(极少场景才允许),或应改为 `#{}` 参数化。
+
+**CRRC 项目既有拼写提醒:** 以下拼写是历史遗留,抽查时不要误报:
+- `contanst`(非 `constant`)— 常量/枚举包名
+- `bootstrapt`(非 `bootstrap`)— `service-file` 模块启动包名
+- `annotion`(非 `annotation`)— 框架注解包名
+
+### C.5 目录归属总表
+
+| 目录类型 | 归属团队 | 说明 |
+|----------|---------|------|
+| `com.fenzhitech.crrc.*/src/main/java/` | Team C | 业务代码 |
+| `com.fenzhitech.crrc.*/src/main/resources/` | Team C | 配置 + MyBatis XML |
+| `com.fenzhitech.crrc.*/src/test/java/` | Team D | 自动化测试代码 |
+| `deliveries/team-a-requirement/` | Team A | 需求文档 |
+| `deliveries/team-b-architecture/` | Team B | 架构文档 |
+| `deliveries/team-c-coding/` | Team C | 实现说明 |
+| `deliveries/team-d-testing/` | Team D | 测试文档 |
+| `com.fenzhitech.crrc.service-common/` | ALL(只读) | 共享库,修改需返工流程 |
+| `docs/` | 业务领导 | 项目文档 |
+
+### C.6 CRRC 特有的安全注意
+
+- 仓库中的 `application.properties` 和 Gradle 发布配置可能包含内部 Nexus 凭据或测试环境密钥,不要复制到新文档或提交说明中
+- 多模块之间的 Feign 调用路径和包名需要与 `SERVICE_NAME` / `SERVICE_CONTEXT_PATH` 常量一致
+- 网关层(`gateway-pc`、`gateway-mobile`、`gateway-management`)的免登录、免权限路径配置需在新增公开接口时同步检查
+
+
+---
+
+## 十三、待定事项
+
+- [x] ~~试水项目选择~~ → 已通过「在线笔记系统」完成试水验证
+- [ ] 是否需要增加 Code Review 团队角色
+- [x] ~~返工次数上限~~ → 上限 2 次,第 3 次触发升级机制
+- [x] ~~并行开发支持~~ → 已支持,含合并策略
+- [x] ~~CRRC 多模块适配~~ → v2.2 已新增附录 C,覆盖 Gradle 构建、MyBatis XML 检查、多模块所有权
+- [ ] CI/CD 自动化验证 → 当前设计已覆盖编译自检 + 自动化测试门控,CI/CD 作为可选增强

+ 3 - 0
docs/mysql数据库配置.txt

@@ -0,0 +1,3 @@
+jdbc.url = jdbc:mysql://43.142.172.168:3306/crrc?useUnicode=true&characterEncoding=utf8&useSSL=false&serverTimezone=UTC
+jdbc.user = root
+jdbc.password = 2017526652@Qq

+ 439 - 0
docs/phase-0-tasks.md

@@ -0,0 +1,439 @@
+# 阶段零:环境准备 — 详细任务清单
+
+> 工期:0.5周(2.5天)
+> 目标:开发环境就绪,所有外部依赖到位,项目骨架可运行
+> 本阶段不走 Team A/B/C/D 流程,直接执行
+
+---
+
+## 任务总览
+
+```
+Day 1(并行)                    Day 2(并行)                 Day 3(串行)
+┌─────────────────────┐  ┌─────────────────────┐  ┌─────────────────────┐
+│ T0.1 项目骨架初始化   │  │ T0.4 数据库建表      │  │ T0.7 编译验证+冒烟   │
+│ T0.2 Git仓库初始化   │  │ T0.5 Redis/短信配置  │  │ T0.8 阶段一准备      │
+│ T0.3 本地开发环境     │  │ T0.6 OSS/微信配置    │  │                     │
+└─────────────────────┘  └─────────────────────┘  └─────────────────────┘
+```
+
+---
+
+## T0.1 Spring Boot 项目初始化
+
+| 属性 | 说明 |
+|------|------|
+| 负责 | 后端 |
+| 前置 | 无 |
+| 耗时 | 0.5天 |
+| 并行 | T0.2, T0.3 |
+
+### 具体操作
+
+1. **创建 Gradle 多模块骨架**(CRRC 模式,根目录无 settings.gradle)
+   ```
+   service/
+   ├── com.fenzhitech.crrc.service-common/     # 共享库(DTO/VO/常量)
+   ├── com.fenzhitech.crrc.service-user/       # 用户模块
+   ├── com.fenzhitech.crrc.service-system/     # 系统管理模块(角色/账号/字典/日志)
+   ├── com.fenzhitech.crrc.service-audit/      # 审核模块
+   ├── com.fenzhitech.crrc.service-trade/      # 交易模块(招工/报名/拨号)
+   ├── com.fenzhitech.crrc.service-goods/      # 货源模块(果农货源/客商找货)
+   ├── com.fenzhitech.crrc.service-message/    # 消息模块(短信/通知)
+   ├── com.fenzhitech.crrc.service-file/       # 文件模块(OSS/视频/照片)
+   ├── com.fenzhitech.crrc.gateway-pc/         # PC网关
+   ├── com.fenzhitech.crrc.gateway-mobile/     # 移动端网关(小程序)
+   └── com.fenzhitech.crrc.gateway-management/ # 管理端网关(后台)
+   ```
+
+2. **每个模块的 build.gradle 配置**
+   - Java 8 源码兼容
+   - Spring Boot 1.5.9 依赖
+   - MyBatis starter
+   - MySQL connector
+   - 阿里云 OSS SDK
+   - 阿里云短信 SDK
+   - Redis starter
+   - JWT 库(jjwt)
+   - Apache POI(Excel 处理)
+
+3. **service-common 共享库初始化**
+   - 基础 DTO/VO 框架类
+   - 统一响应体 `ApiResult<T>`
+   - 通用异常类
+   - 分页工具
+
+4. **application.properties 基础配置**
+   - 数据库连接(占位符)
+   - MyBatis 配置
+   - Redis 连接(占位符)
+   - OSS 配置(占位符)
+   - 短信配置(占位符)
+   - JWT 密钥(占位符)
+
+### 验收标准
+- [ ] 每个模块 `./gradlew compileJava` 零错误
+- [ ] service-common 编译通过后,其他模块可引用其类
+- [ ] 各模块目录结构符合 CRRC 规范
+
+---
+
+## T0.2 Git 仓库初始化
+
+| 属性 | 说明 |
+|------|------|
+| 负责 | 全员 |
+| 前置 | 无 |
+| 耗时 | 0.25天 |
+| 并行 | T0.1, T0.3 |
+
+### 具体操作
+
+1. **初始化本地仓库**
+   ```bash
+   cd D:/ai_coding_project
+   git init
+   ```
+
+2. **创建 .gitignore**
+   ```
+   # 编译产物
+   target/
+   build/
+   *.class
+   *.jar
+   *.war
+
+   # IDE
+   .idea/
+   *.iml
+   *.ipr
+   *.iws
+   .vscode/
+   .settings/
+   .project
+   .classpath
+
+   # 系统
+   .DS_Store
+   Thumbs.db
+   *.log
+
+   # 环境配置(含密钥)
+   .env
+   application-local.properties
+   application-prod.properties
+
+   # Node
+   node_modules/
+   dist/
+   ```
+
+3. **创建 deliveries/ 目录结构**
+   ```
+   deliveries/
+   ├── team-a-requirement/
+   ├── team-b-architecture/
+   ├── team-c-coding/
+   └── team-d-testing/
+   ```
+
+4. **创建 docs/ 目录结构**(已有文档保留)
+   ```
+   docs/
+   ├── charter.md                  # 项目章程
+   ├── acceptance-criteria.md      # 里程碑验收标准
+   ├── project-log.md              # 项目生命周期日志
+   ├── environment-checklist.md    # 环境就绪检查
+   └── reviews/                    # 评审记录
+   ```
+
+5. **首次提交到 main 分支**
+   ```bash
+   git add .gitignore docs/ deliveries/
+   git commit -m "[milestone-0] 项目初始化:目录结构+文档"
+   ```
+
+6. **配置远程仓库**(Gogs)
+   ```bash
+   git remote add origin <gogs-url>
+   git push -u origin main
+   ```
+
+### 验收标准
+- [ ] `git log` 可见首次提交
+- [ ] .gitignore 正确排除编译产物和 IDE 文件
+- [ ] deliveries/ 目录结构完整
+- [ ] 远程仓库可 push/pull
+
+---
+
+## T0.3 本地开发环境
+
+| 属性 | 说明 |
+|------|------|
+| 负责 | 全员 |
+| 前置 | 无 |
+| 耗时 | 0.25天 |
+| 并行 | T0.1, T0.2 |
+
+### 具体操作
+
+1. **JDK 8 安装验证**
+   ```bash
+   java -version   # 确认 1.8.x
+   javac -version
+   ```
+
+2. **Gradle 安装验证**(各模块自带 gradlew,无需全局安装)
+   ```bash
+   cd com.fenzhitech.crrc.service-user
+   ./gradlew --version
+   ```
+
+3. **MySQL 客户端安装**(Navicat / DBeaver / MySQL Workbench)
+
+4. **微信开发者工具安装**(用于小程序开发和调试)
+
+5. **Redis 客户端安装**(redis-cli 或 RedisDesktopManager)
+
+### 验收标准
+- [ ] JDK 8 可用
+- [ ] gradlew 可执行
+- [ ] MySQL 客户端可连接数据库
+- [ ] 微信开发者工具已安装
+
+---
+
+## T0.4 数据库初始化
+
+| 属性 | 说明 |
+|------|------|
+| 负责 | 后端 |
+| 前置 | T0.1(项目骨架) |
+| 耗时 | 0.5天 |
+| 并行 | T0.5, T0.6 |
+
+### 具体操作
+
+1. **创建数据库**
+   ```sql
+   CREATE DATABASE crrc DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci;
+   ```
+
+2. **执行全量建表 SQL**(15张表,基于 requirements-specification.md 3.1 节)
+
+   | 序号 | 表名 | 说明 | 阶段一状态 |
+   |------|------|------|-----------|
+   | 1 | sys_user | 用户基础表 | 有数据 |
+   | 2 | user_identity | 身份关联表 | 有数据 |
+   | 3 | grower_profile | 果农档案表 | 有数据 |
+   | 4 | worker_profile | 工人档案表 | 有数据 |
+   | 5 | buyer_profile | 客商档案表 | 有数据 |
+   | 6 | supplier_shop | 农资店铺表 | 有数据 |
+   | 7 | recruit_info | 招工信息表 | 空表 |
+   | 8 | worker_apply | 工人报名表 | 空表 |
+   | 9 | phone_unlock_record | 联系授权记录 | 空表 |
+   | 10 | call_log | 拨号日志表 | 空表 |
+   | 11 | sms_daily_limit | 短信限流表 | 空表 |
+   | 12 | market_price | 今日行情表 | 有数据 |
+   | 13 | audit_log | 审核日志表 | 有数据 |
+   | 14 | operation_log | 操作日志表 | 有数据 |
+   | 15 | complaint | 投诉表 | 空表 |
+
+3. **核心索引创建**
+   - sys_user: phone_hash UNIQUE, openid UNIQUE, status INDEX
+   - user_identity: user_id INDEX, identity_type INDEX
+   - grower_profile: user_identity_id INDEX, (latitude,longitude) 复合索引, audit_status INDEX
+   - worker_profile: user_identity_id INDEX, status INDEX
+   - recruit_info: user_identity_id INDEX, status INDEX, keyword_flag INDEX, (latitude,longitude) 复合索引
+   - buyer_profile: user_identity_id INDEX
+   - phone_unlock_record: buyer_identity_id INDEX, grower_identity_id INDEX, expire_time INDEX
+   - call_log: caller_identity_id INDEX, callee_identity_id INDEX
+   - sms_daily_limit: (worker_identity_id, farmer_identity_id, sms_date) UNIQUE
+   - market_price: variety INDEX, update_date INDEX
+   - audit_log: operator_id INDEX
+   - operation_log: operator_id INDEX
+
+4. **初始数据导入**
+   - 字典数据:苹果品种、工种类型、农资种类、行政区划(洒渔镇下辖村)
+   - 超级管理员账号
+
+### 验收标准
+- [ ] 15张表全部创建成功
+- [ ] 索引创建完整
+- [ ] 初始字典数据已导入
+- [ ] 应用可连接数据库
+
+---
+
+## T0.5 Redis + 短信配置
+
+| 属性 | 说明 |
+|------|------|
+| 负责 | 运维 |
+| 前置 | 无 |
+| 耗时 | 0.25天 |
+| 并行 | T0.4, T0.6 |
+
+### 具体操作
+
+1. **Redis 部署**
+   - 安装 Redis
+   - 配置持久化(RDB/AOF)
+   - 配置密码
+   - 记录连接信息到 docs/mysql数据库配置.txt
+
+2. **阿里云短信申请**
+   - 申请短信签名:"洒渔用工"
+   - 报备短信模板:
+     - 模板1:报名通知 `【洒渔用工】${workerName}(${workType})对您的招工感兴趣,联系电话:${phone}`
+     - 模板2:审核提醒 `【洒渔用工】您提交的${type}信息已${result},请及时查看`
+   - 获取 AccessKey ID 和 Secret
+   - 配置到 application.properties
+
+### 验收标准
+- [ ] Redis 可连接,支持读写
+- [ ] 短信签名已通过审核
+- [ ] 短信模板已报备
+- [ ] 发送测试短信成功
+
+---
+
+## T0.6 OSS + 微信配置
+
+| 属性 | 说明 |
+|------|------|
+| 负责 | 运维 |
+| 前置 | 无 |
+| 耗时 | 0.25天 |
+| 并行 | T0.4, T0.5 |
+
+### 具体操作
+
+1. **阿里云 OSS 配置**
+   - 创建 Bucket(如 sayu-app)
+   - 配置访问策略(私有读写)
+   - 配置 CORS(允许小程序域名)
+   - 获取 AccessKey ID 和 Secret
+   - 记录 Endpoint、Bucket 名称
+
+2. **微信小程序账号**
+   - 申请小程序 AppID
+   - 配置服务器域名(request 合法域名、uploadFile 合法域名)
+   - 获取 AppID 和 AppSecret
+   - 配置到 application.properties
+
+### 验收标准
+- [ ] OSS Bucket 可访问,能上传/下载测试文件
+- [ ] OSS CORS 配置正确
+- [ ] 微信小程序 AppID 就绪
+- [ ] 服务器域名已配置
+
+---
+
+## T0.7 编译验证 + 冒烟
+
+| 属性 | 说明 |
+|------|------|
+| 负责 | 后端 |
+| 前置 | T0.1, T0.4 |
+| 耗时 | 0.25天 |
+| 并行 | 无(串行) |
+
+### 具体操作
+
+1. **依赖链编译验证**
+   ```bash
+   # 先编译共享库
+   cd com.fenzhitech.crrc.service-common && ./gradlew compileJava
+
+   # 再编译各业务模块
+   cd com.fenzhitech.crrc.service-user && ./gradlew compileJava
+   cd com.fenzhitech.crrc.service-system && ./gradlew compileJava
+   cd com.fenzhitech.crrc.service-audit && ./gradlew compileJava
+   cd com.fenzhitech.crrc.service-trade && ./gradlew compileJava
+   cd com.fenzhitech.crrc.service-goods && ./gradlew compileJava
+   cd com.fenzhitech.crrc.service-message && ./gradlew compileJava
+   cd com.fenzhitech.crrc.service-file && ./gradlew compileJava
+   ```
+
+2. **网关编译验证**
+   ```bash
+   cd com.fenzhitech.crrc.gateway-mobile && ./gradlew compileJava
+   cd com.fenzhitech.crrc.gateway-management && ./gradlew compileJava
+   ```
+
+3. **启动冒烟测试**
+   ```bash
+   cd com.fenzhitech.crrc.gateway-management && ./gradlew bootRun
+   # 确认启动无报错,日志无 ERROR
+   ```
+
+4. **CI/CD 脚本验证**
+   - 配置编译验证脚本(遍历所有模块执行 ./gradlew compileJava)
+   - 验证脚本可执行
+
+### 验收标准
+- [ ] 所有模块 `./gradlew compileJava` 零错误
+- [ ] `./gradlew bootRun` 启动无报错
+- [ ] 启动日志无 ERROR
+- [ ] CI/CD 编译脚本可执行
+
+---
+
+## T0.8 阶段一准备
+
+| 属性 | 说明 |
+|------|------|
+| 负责 | 全员 |
+| 前置 | T0.7 |
+| 耗时 | 0.25天 |
+| 并行 | 无 |
+
+### 具体操作
+
+1. **提交阶段零成果到 main**
+   ```bash
+   git add .
+   git commit -m "[milestone-0] 环境准备完成:项目骨架+数据库+外部服务配置"
+   git push origin main
+   ```
+
+2. **创建 docs/charter.md**(项目章程)
+   - 项目目标
+   - 验收标准(引用 requirements-specification.md)
+   - 四阶段里程碑定义
+
+3. **创建 docs/acceptance-criteria.md**(里程碑验收标准)
+   - M1 需求分析验收条件
+   - M2 架构设计验收条件
+   - M3 编码实现验收条件
+   - M4 测试验收验收条件
+
+4. **创建 docs/project-log.md**(项目日志)
+   - 记录阶段零完成
+
+5. **准备阶段一派单**
+   - 提炼阶段零关键信息给 Team A
+
+### 验收标准
+- [ ] main 分支包含完整项目骨架
+- [ ] charter.md 和 acceptance-criteria.md 就绪
+- [ ] project-log.md 已记录
+- [ ] 可以向 Team A 派单
+
+---
+
+## 环境就绪检查清单
+
+| 序号 | 检查项 | 状态 |
+|------|--------|------|
+| 1 | 项目骨架可编译通过(./gradlew compileJava 零错误) | □ |
+| 2 | 数据库连接正常,全量表结构创建完成 | □ |
+| 3 | OSS Bucket 可访问,能上传/下载测试文件 | □ |
+| 4 | 短信 SDK 可调用(发送测试短信成功) | □ |
+| 5 | Redis 连接正常 | □ |
+| 6 | 微信小程序开发者账号就绪 | □ |
+| 7 | Git 仓库可 push/pull | □ |
+| 8 | ./gradlew bootRun 启动无报错 | □ |

+ 370 - 0
docs/phase-1-tasks.md

@@ -0,0 +1,370 @@
+# 阶段一:基础设施与用户体系 — 详细任务清单
+
+> 工期:3-4周(15-20天)
+> 目标:管理员能录入数据,用户能登录并看到有价值的信息
+> 功能点:20个
+> 流程:M1(需求) → M2(架构) → M3(编码) → M4(测试)
+
+---
+
+## 里程碑总览
+
+```
+Week 1-2              Week 2-3              Week 3-4
+┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
+│ M1 需求分析      │  │ M3 编码实现      │  │ M3 编码(续)+自检 │
+│ M2 架构设计      │  │ (核心模块)       │  │ M4 测试验收      │
+│ (可并行)         │  │                 │  │                 │
+└─────────────────┘  └─────────────────┘  └─────────────────┘
+  5-7天                  7-8天                  5-7天
+```
+
+---
+
+## M1 Team A — 需求分析(3-4天)
+
+### 交付产物
+
+| 序号 | 文件路径 | 说明 |
+|------|----------|------|
+| 1 | deliveries/team-a-requirement/spec.md | 阶段一需求规格 |
+| 2 | deliveries/team-a-requirement/use-cases.md | 用例文档 |
+| 3 | deliveries/team-a-requirement/constraints.md | 约束条件 |
+| 4 | deliveries/team-a-requirement/DELIVERY-MANIFEST.md | 交付清单 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M1.1 | 基于 requirements-specification.md 提取阶段一的20个功能点详细需求 | 1天 |
+| M1.2 | 编写用例文档(每个功能点至少1个主用例+异常用例) | 1天 |
+| M1.3 | 编写约束条件(技术约束、安全约束、适老化约束) | 0.5天 |
+| M1.4 | 编写 DELIVERY-MANIFEST.md(含给下游关键信息) | 0.5天 |
+
+### M1 用例覆盖清单
+
+| 功能模块 | 用例数 | 核心用例 |
+|---------|--------|---------|
+| 数据库建表 | 2 | 全量建表成功、索引创建验证 |
+| 角色管理 | 3 | 创建角色、绑定权限、角色列表 |
+| 账号管理 | 4 | 创建账号、分配角色、启用/禁用、列表查询 |
+| 字典管理 | 4 | 品种/工种/农资/行政区划 CRUD |
+| 操作日志 | 2 | 日志记录、日志查询 |
+| Excel 模板下载 | 1 | 下载4类模板 |
+| Excel 上传+预览 | 4 | 上传、预览有效行、预览错误行、预览重复行 |
+| 数据校验+去重 | 3 | 手机号校验、去重检测、跳过/覆盖选择 |
+| 确认入库 | 3 | 同步入库(≤100行)、异步入库(>100行)、完成通知 |
+| 审核框架 | 3 | 审核列表、通过操作、驳回+原因 |
+| 导入数据审核 | 2 | 待审数据展示、审核后生效 |
+| 行情配置 | 3 | 设置价格区间、设置趋势、行情列表 |
+| 微信登录 | 3 | 登录成功、拒绝授权兜底、Token 签发 |
+| 身份路由 | 3 | 0个身份提示、1个直接进入、N个选择页 |
+| 身份选择页 | 2 | 大卡片展示、点击进入 |
+| 今日行情 | 2 | 涨价展示、降价展示 |
+| 金刚区 | 2 | 4入口展示、灰态入口 |
+| 手机号加密 | 2 | 加密存储验证、phone_hash 查询 |
+| 权限框架 | 3 | 小程序拦截器、后台拦截器、越权拦截 |
+| 接口脱敏 | 2 | 手机号脱敏、姓名脱敏 |
+
+### M1 验收标准
+- [ ] spec.md 覆盖20个功能点,每个有独立章节
+- [ ] use-cases.md 用例数 ≥ 45(覆盖所有功能的正常+异常场景)
+- [ ] constraints.md 包含技术约束、安全约束、适老化约束
+- [ ] DELIVERY-MANIFEST.md 的"给下游团队的关键信息"完整
+
+---
+
+## M2 Team B — 架构设计(3-4天)
+
+### 交付产物
+
+| 序号 | 文件路径 | 说明 |
+|------|----------|------|
+| 1 | deliveries/team-b-architecture/design.md | 架构设计文档 |
+| 2 | deliveries/team-b-architecture/api-definition.md | 接口定义 |
+| 3 | deliveries/team-b-architecture/tech-stack.md | 技术选型说明 |
+| 4 | deliveries/team-b-architecture/DELIVERY-MANIFEST.md | 交付清单 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M2.1 | 模块架构设计(分层架构:Controller→Service→Mapper) | 0.5天 |
+| M2.2 | 数据库详细设计(字段类型、索引、注释) | 0.5天 |
+| M2.3 | 接口定义(RESTful API,请求/响应格式) | 1天 |
+| M2.4 | 安全架构设计(加密方案、拦截器链、脱敏策略) | 0.5天 |
+| M2.5 | 技术选型说明 | 0.5天 |
+| M2.6 | DELIVERY-MANIFEST.md | 0.5天 |
+
+### M2 接口清单(阶段一)
+
+#### 认证模块
+| 接口 | 方法 | 模块 | 说明 |
+|------|------|------|------|
+| /api/wx/auth/login | POST | gateway-mobile | 微信登录 |
+| /api/wx/auth/identity-list | GET | gateway-mobile | 获取身份列表 |
+| /api/admin/auth/login | POST | gateway-management | 后台登录 |
+
+#### 系统管理模块
+| 接口 | 方法 | 模块 | 说明 |
+|------|------|------|------|
+| /api/admin/roles | GET/POST | service-system | 角色列表/创建 |
+| /api/admin/roles/{id} | PUT/DELETE | service-system | 角色编辑/删除 |
+| /api/admin/users | GET/POST | service-system | 账号列表/创建 |
+| /api/admin/users/{id} | PUT | service-system | 账号编辑 |
+| /api/admin/dicts | GET/POST | service-system | 字典列表/创建 |
+| /api/admin/dicts/{id} | PUT/DELETE | service-system | 字典编辑/删除 |
+| /api/admin/logs | GET | service-system | 操作日志查询 |
+
+#### 数据导入模块
+| 接口 | 方法 | 模块 | 说明 |
+|------|------|------|------|
+| /api/admin/import/template/{type} | GET | service-system | 下载模板 |
+| /api/admin/import/upload | POST | service-system | 上传 Excel |
+| /api/admin/import/preview | POST | service-system | 预览导入数据 |
+| /api/admin/import/confirm | POST | service-system | 确认入库 |
+
+#### 审核模块
+| 接口 | 方法 | 模块 | 说明 |
+|------|------|------|------|
+| /api/admin/audit/list | GET | service-audit | 审核列表 |
+| /api/admin/audit/{id} | PUT | service-audit | 审核操作(通过/驳回) |
+
+#### 行情模块
+| 接口 | 方法 | 模块 | 说明 |
+|------|------|------|------|
+| /api/admin/market-price | GET/POST | service-trade | 行情列表/配置 |
+| /api/admin/market-price/{id} | PUT/DELETE | service-trade | 行情编辑/删除 |
+| /api/wx/market-price | GET | gateway-mobile | 今日行情(小程序端) |
+
+#### 小程序首页
+| 接口 | 方法 | 模块 | 说明 |
+|------|------|------|------|
+| /api/wx/home/market-price | GET | gateway-mobile | 首页行情数据 |
+| /api/wx/home/entries | GET | gateway-mobile | 金刚区入口配置 |
+
+### M2 验收标准
+- [ ] api-definition.md 接口数 ≥ 20(覆盖所有功能点)
+- [ ] DDL 每张表有字段注释
+- [ ] design.md 包含模块架构图、安全架构图
+- [ ] tech-stack.md 列出所有依赖及版本
+- [ ] DELIVERY-MANIFEST.md 的"给下游团队的关键信息"完整
+
+---
+
+## M3 Team C — 编码实现(10-12天)
+
+### 模块拆分与并行策略
+
+```
+并行组1(基础层,无依赖):
+├── C-Common: service-common 共享库
+├── C-DB: 全量建表 SQL + MyBatis XML
+└── C-Security: 加密/脱敏/拦截器基础框架
+
+并行组2(业务层,依赖并行组1):
+├── C-System: 系统管理(角色/账号/字典/日志)
+├── C-Import: 数据导入(上传/预览/校验/入库)
+└── C-Audit: 审核框架
+
+并行组3(展示层,依赖并行组2):
+├── C-Trade: 行情管理
+├── C-Auth: 微信登录+身份路由
+└── C-Home: 小程序首页
+
+串行(集成层):
+└── C-Gateway: 网关配置+拦截器注册
+```
+
+### 任务详细分解
+
+#### C-Common: service-common 共享库(1天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-Common.1 | ApiResult.java | 统一响应体 |
+| C-Common.2 | PageResult.java | 分页响应体 |
+| C-Common.3 | BaseEntity.java | 基础实体(id, created_at, updated_at) |
+| C-Common.4 | BizException.java | 业务异常类 |
+| C-Common.5 | ErrorCode.java | 错误码枚举 |
+| C-Common.6 | PageUtil.java | 分页工具 |
+| C-Common.7 | AesUtil.java | AES 加密工具 |
+| C-Common.8 | PhoneUtil.java | 手机号脱敏工具 |
+| C-Common.9 | JwtUtil.java | JWT 工具 |
+
+#### C-DB: 数据库(1天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-DB.1 | schema.sql | 全量建表 SQL(15张表+索引) |
+| C-DB.2 | data.sql | 初始数据(字典+管理员) |
+| C-DB.3 | SysUserMapper.xml | 用户表 MyBatis 映射 |
+| C-DB.4 | UserIdentityMapper.xml | 身份表映射 |
+| C-DB.5 | MarketPriceMapper.xml | 行情表映射 |
+| C-DB.6 | AuditLogMapper.xml | 审核日志映射 |
+| C-DB.7 | OperationLogMapper.xml | 操作日志映射 |
+| C-DB.8 | 其他 Mapper.xml | 剩余表的映射(空表预建) |
+
+#### C-Security: 安全基础设施(2天)
+
+| 任务 | 文件 | 模块 | 说明 |
+|------|------|------|------|
+| C-Sec.1 | WxAuthInterceptor.java | gateway-mobile | 微信 JWT 拦截器 |
+| C-Sec.2 | AdminAuthInterceptor.java | gateway-management | 后台 JWT 拦截器 |
+| C-Sec.3 | PermissionInterceptor.java | gateway-* | RBAC 权限拦截器 |
+| C-Sec.4 | DataMaskingInterceptor.java | gateway-* | 数据脱敏拦截器 |
+| C-Sec.5 | WebMvcConfig.java | gateway-* | 拦截器注册配置 |
+| C-Sec.6 | SecurityConfig.java | service-common | 安全配置常量 |
+
+#### C-System: 系统管理(2天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-Sys.1 | SysRoleController.java | 角色管理 API |
+| C-Sys.2 | SysRoleService.java | 角色业务逻辑 |
+| C-Sys.3 | SysUserController.java | 账号管理 API |
+| C-Sys.4 | SysUserService.java | 账号业务逻辑 |
+| C-Sys.5 | DictController.java | 字典管理 API |
+| C-Sys.6 | DictService.java | 字典业务逻辑 |
+| C-Sys.7 | OperationLogService.java | 操作日志记录 |
+| C-Sys.8 | OperationLogAspect.java | 日志切面(AOP) |
+
+#### C-Import: 数据导入(2天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-Imp.1 | ImportController.java | 导入 API(上传/预览/确认) |
+| C-Imp.2 | ExcelParseService.java | Excel 解析(Apache POI) |
+| C-Imp.3 | ImportValidateService.java | 数据校验(手机号/必填项) |
+| C-Imp.4 | ImportDedupService.java | 去重逻辑(手机号+身份) |
+| C-Imp.5 | ImportExecuteService.java | 入库执行(同步/异步) |
+| C-Imp.6 | ImportTemplateService.java | 模板下载 |
+| C-Imp.7 | FieldMappingConfig.java | 字段映射配置(硬编码4种模板) |
+
+#### C-Audit: 审核框架(1天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-Aud.1 | AuditController.java | 审核 API(列表/通过/驳回) |
+| C-Aud.2 | AuditService.java | 审核业务逻辑 |
+| C-Aud.3 | AuditLogService.java | 审核日志记录 |
+| C-Aud.4 | SlaReminderTask.java | SLA 提醒定时任务(24h/48h) |
+
+#### C-Trade: 行情管理(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-Trade.1 | MarketPriceController.java | 行情 CRUD API(后台) |
+| C-Trade.2 | MarketPriceService.java | 行情业务逻辑 |
+| C-Trade.3 | WxMarketPriceController.java | 行情查询 API(小程序端) |
+
+#### C-Auth: 微信登录(1.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-Auth.1 | WxAuthController.java | 登录 API(code→JWT) |
+| C-Auth.2 | WxAuthService.java | 登录业务逻辑 |
+| C-Auth.3 | IdentityService.java | 身份查询+路由逻辑 |
+| C-Auth.4 | WxApiService.java | 微信 API 调用(code2session) |
+
+#### C-Home: 小程序首页(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-Home.1 | HomeController.java | 首页 API(行情+金刚区) |
+| C-Home.2 | HomeService.java | 首页数据聚合 |
+
+#### C-Gateway: 网关配置(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-Gw.1 | GatewayMobileConfig.java | 移动端网关路由配置 |
+| C-Gw.2 | GatewayManagementConfig.java | 管理端网关路由配置 |
+| C-Gw.3 | application.properties | 完整配置(DB/Redis/OSS/短信/JWT) |
+
+### 编译自检(Team C 执行)
+
+```bash
+# 依赖链编译
+cd com.fenzhitech.crrc.service-common && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-system && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-audit && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-trade && ./gradlew compileJava
+cd com.fenzhitech.crrc.gateway-mobile && ./gradlew compileJava
+cd com.fenzhitech.crrc.gateway-management && ./gradlew compileJava
+```
+
+### M3 验收标准
+- [ ] DELIVERY-MANIFEST.md 注明编译自检结果(零错误)
+- [ ] 每个 Controller 方法对应 api-definition.md 中一个接口
+- [ ] MyBatis XML 全部使用 `#{}` 语法(无 `${}`)
+- [ ] 手机号存储为 AES 密文
+- [ ] 接口返回手机号脱敏
+- [ ] 操作日志 AOP 切面正常记录
+
+---
+
+## M4 Team D — 测试验收(5-7天)
+
+### 交付产物
+
+| 序号 | 文件路径 | 说明 |
+|------|----------|------|
+| 1 | deliveries/team-d-testing/test-cases.md | 测试用例 |
+| 2 | deliveries/team-d-testing/test-report.md | 测试报告 |
+| 3 | deliveries/team-d-testing/bug-list.md | Bug 清单 |
+| 4 | deliveries/team-d-testing/DELIVERY-MANIFEST.md | 交付清单 |
+| 5 | {module}/src/test/java/ | 自动化测试代码 |
+
+### 测试重点(业务领导指定)
+
+#### 核心接口(必须测试)
+- /api/admin/auth/login — 后台登录
+- /api/wx/auth/login — 微信登录
+- /api/admin/import/upload — Excel 上传
+- /api/admin/import/preview — 导入预览
+- /api/admin/import/confirm — 确认入库
+- /api/admin/audit/{id} — 审核操作
+- /api/wx/market-price — 今日行情
+
+#### 重点场景
+| 场景 | 说明 |
+|------|------|
+| 登录成功/失败 | 微信登录正常流程、拒绝授权兜底 |
+| 身份路由 | 0/1/N个身份的路由逻辑 |
+| Excel 导入 | 空行/格式错误/重复/超大文件 |
+| 预览准确性 | 有效行/错误行/重复行计数正确 |
+| 审核操作 | 通过/驳回、SLA 提醒触发 |
+| 权限隔离 | 不同角色访问隔离、越权拦截 |
+| 手机号安全 | 加密存储验证、接口脱敏验证 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M4.1 | 编写测试用例(≥45个,覆盖所有用例) | 1.5天 |
+| M4.2 | 编写自动化测试代码(JUnit 4 + Spring Boot Test) | 2天 |
+| M4.3 | 执行手动验证(核心接口冒烟) | 0.5天 |
+| M4.4 | 运行 ./gradlew test 确认全部通过 | 0.5天 |
+| M4.5 | 编写 test-report.md 和 bug-list.md | 0.5天 |
+| M4.6 | Bug 修复(如有) | 1-2天 |
+
+### M4 验收标准
+- [ ] 测试用例数 ≥ 45
+- [ ] 核心接口测试覆盖 ≥ 80%
+- [ ] `./gradlew test` 全部通过
+- [ ] 测试代码未修改 src/main/java/ 下的文件
+- [ ] Bug 清单含复现步骤+严重等级
+- [ ] test-report.md 记录完整测试结果
+
+---
+
+## 阶段一风险与缓解
+
+| 风险 | 影响 | 概率 | 缓解措施 |
+|------|------|------|----------|
+| 20个功能点工期不足 | 延期1-2周 | 高 | 优先完成登录+导入+行情,审核框架可延到阶段2a初 |
+| Excel 导入格式多样性 | 字段映射不全 | 中 | MVP 硬编码覆盖4种标准模板 |
+| 微信手机号授权拒绝 | 用户无法注册 | 中 | 后台手动绑定兜底 |
+| Spring Boot 1.5.9 兼容性 | SDK 版本冲突 | 低 | 阶段零已验证 |
+| 安全框架与业务逻辑耦合 | 代码复杂度高 | 中 | 拦截器独立模块,AOP 切面解耦 |

+ 300 - 0
docs/phase-2a-tasks.md

@@ -0,0 +1,300 @@
+# 阶段2a:果农核心功能 — 详细任务清单
+
+> 工期:3周(15天)
+> 目标:果农能完善名片、发布招工、找到工人和客商
+> 功能点:14个
+> 前置:阶段一完成(用户体系+数据导入+审核框架+行情+登录+首页)
+> 流程:M1(需求) → M2(架构) → M3(编码) → M4(测试)
+
+---
+
+## 里程碑总览
+
+```
+Week 1                Week 2                Week 3
+┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
+│ M1 需求分析      │  │ M3 编码(续)      │  │ M3 编译自检      │
+│ M2 架构设计      │  │ 视频上传+招工    │  │ M4 测试验收      │
+│ M3 编码(名片基础) │  │ 找工人+找客商    │  │                 │
+└─────────────────┘  └─────────────────┘  └─────────────────┘
+  5天                    5天                    5天
+```
+
+---
+
+## M1 Team A — 需求分析(2-3天)
+
+### 交付产物
+
+| 序号 | 文件路径 | 说明 |
+|------|----------|------|
+| 1 | deliveries/team-a-requirement/spec.md | 阶段2a需求规格 |
+| 2 | deliveries/team-a-requirement/use-cases.md | 用例文档 |
+| 3 | deliveries/team-a-requirement/constraints.md | 约束条件(继承阶段一+新增) |
+| 4 | deliveries/team-a-requirement/DELIVERY-MANIFEST.md | 交付清单 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M1.1 | 果农名片需求细化(视频上传5环节、照片上传、审核状态流转) | 1天 |
+| M1.2 | 招工发布+管理需求细化(免审核+关键词标记+下架/编辑) | 0.5天 |
+| M1.3 | 找工人/客商需求细化(距离计算、拨号日志) | 0.5天 |
+| M1.4 | 后台审核需求细化(名片审核+待复核列表+SLA) | 0.5天 |
+| M1.5 | 编写 DELIVERY-MANIFEST.md | 0.5天 |
+
+### M1 关键需求点
+
+**视频上传5环节**:
+1. 前端清除 EXIF → 前端预校验(格式/大小)
+2. 调用后端获取 OSS 上传凭证
+3. 前端直传 OSS
+4. 上传完成回调后端
+5. 后端记录 URL + 异步压缩 720p
+
+**关键词标记机制**:
+- 敏感词库:色情/赌博/政治等明确违规词
+- 发布时自动检测,keyword_flag=1 进入待复核
+- 不阻塞发布,审核员定时处理
+
+**距离计算**:
+- 果园地址 → 地理编码 → 经纬度存储
+- 查询时 Haversine 公式计算距离
+- 按距离排序
+
+### M1 验收标准
+- [ ] spec.md 覆盖14个功能点
+- [ ] use-cases.md 用例数 ≥ 30
+- [ ] 视频上传5环节流程图完整
+- [ ] DELIVERY-MANIFEST.md 关键信息完整
+
+---
+
+## M2 Team B — 架构设计(2-3天)
+
+### 交付产物
+
+| 序号 | 文件路径 | 说明 |
+|------|----------|------|
+| 1 | deliveries/team-b-architecture/design.md | 架构设计 |
+| 2 | deliveries/team-b-architecture/api-definition.md | 接口定义 |
+| 3 | deliveries/team-b-architecture/tech-stack.md | 技术选型(新增OSS相关) |
+| 4 | deliveries/team-b-architecture/DELIVERY-MANIFEST.md | 交付清单 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M2.1 | 果农名片模块架构(信息维护+视频/照片上传+审核状态) | 0.5天 |
+| M2.2 | 视频上传技术方案(OSS凭证→直传→回调→压缩) | 0.5天 |
+| M2.3 | 招工模块架构(发布+管理+关键词检测) | 0.5天 |
+| M2.4 | 找工人/客商模块架构(列表+距离+拨号) | 0.5天 |
+| M2.5 | 接口定义(新增约15个接口) | 0.5天 |
+| M2.6 | DELIVERY-MANIFEST.md | 0.5天 |
+
+### M2 接口清单(阶段2a新增)
+
+#### 果农名片模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/grower/profile | GET | 获取果农档案 |
+| /api/wx/grower/profile | PUT | 更新果农档案 |
+| /api/wx/grower/upload-credential | POST | 申请 OSS 上传凭证 |
+| /api/wx/grower/upload-callback | POST | OSS 上传完成回调 |
+
+#### 招工模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/grower/recruit | POST | 发布招工 |
+| /api/wx/grower/recruit | GET | 我的招工列表 |
+| /api/wx/grower/recruit/{id} | PUT | 编辑招工 |
+| /api/wx/grower/recruit/{id} | DELETE | 下架招工 |
+
+#### 找工人/客商
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/grower/workers | GET | 工人列表(工种筛选+距离排序) |
+| /api/wx/grower/buyers | GET | 客商列表 |
+| /api/wx/call/phone | POST | 拨号接口(记录call_log) |
+
+#### 后台审核
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/admin/audit/grower-profile | GET | 名片审核列表 |
+| /api/admin/audit/grower-profile/{id} | PUT | 名片审核操作 |
+| /api/admin/audit/recruit-review | GET | 待复核招工列表 |
+| /api/admin/audit/recruit-review/{id} | PUT | 待复核操作 |
+
+### M2 验收标准
+- [ ] api-definition.md 新增接口 ≥ 15
+- [ ] 视频上传流程架构图完整
+- [ ] 距离计算方案明确(Haversine)
+- [ ] DELIVERY-MANIFEST.md 关键信息完整
+
+---
+
+## M3 Team C — 编码实现(8-10天)
+
+### 模块拆分与并行策略
+
+```
+并行组1(基础数据层):
+├── C-GrowerProfile: 果农档案 CRUD
+├── C-RecruitInfo: 招工信息 CRUD
+└── C-CallLog: 拨号日志
+
+并行组2(业务逻辑层,依赖并行组1):
+├── C-VideoUpload: 视频上传(OSS凭证/直传/回调/压缩)
+├── C-PhotoUpload: 照片上传
+└── C-KeywordCheck: 敏感词检测
+
+并行组3(展示层):
+├── C-WorkerList: 找工人列表
+├── C-BuyerList: 找客商列表
+└── C-Audit2a: 名片审核+待复核
+
+串行:
+└── C-Integration: 集成测试+编译自检
+```
+
+### 任务详细分解
+
+#### C-GrowerProfile: 果农档案(1天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-GP.1 | GrowerProfileController.java | 果农档案 API |
+| C-GP.2 | GrowerProfileService.java | 档案业务逻辑 |
+| C-GP.3 | GrowerProfileMapper.xml | MyBatis 映射 |
+
+#### C-VideoUpload: 视频上传(3天,复杂度最高)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-VU.1 | OssCredentialController.java | OSS 凭证申请 API |
+| C-VU.2 | OssCredentialService.java | STS Token 生成 |
+| C-VU.3 | UploadCallbackController.java | 上传回调 API |
+| C-VU.4 | VideoCompressService.java | 异步视频压缩(FFmpeg 720p/2Mbps) |
+| C-VU.5 | VideoCompressTask.java | 压缩定时任务+重试机制 |
+| C-VU.6 | FileValidateService.java | 文件校验(格式/大小/EXIF) |
+
+#### C-PhotoUpload: 照片上传(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-PU.1 | PhotoUploadService.java | 照片上传逻辑(≤9张/张≤5MB) |
+
+#### C-RecruitInfo: 招工信息(1.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-RI.1 | RecruitController.java | 招工 CRUD API |
+| C-RI.2 | RecruitService.java | 招工业务逻辑 |
+| C-RI.3 | RecruitMapper.xml | MyBatis 映射 |
+| C-RI.4 | KeywordCheckService.java | 敏感词检测(正则匹配) |
+| C-RI.5 | KeywordDictionary.java | 敏感词库(硬编码初始词库) |
+
+#### C-CallLog: 拨号日志(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-CL.1 | CallLogService.java | 拨号日志记录 |
+| C-CL.2 | CallPhoneController.java | 拨号 API(/api/wx/call/phone) |
+| C-CL.3 | CallLogMapper.xml | MyBatis 映射 |
+
+#### C-WorkerList: 找工人(1天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-WL.1 | WorkerSearchController.java | 工人列表 API |
+| C-WL.2 | WorkerSearchService.java | 工种筛选+距离排序 |
+| C-WL.3 | DistanceUtil.java | Haversine 距离计算工具 |
+| C-WL.4 | WorkerProfileMapper.xml | 工人表映射(含经纬度查询) |
+
+#### C-BuyerList: 找客商(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-BL.1 | BuyerSearchController.java | 客商列表 API |
+| C-BL.2 | BuyerSearchService.java | 客商查询逻辑 |
+
+#### C-Audit2a: 后台审核(1天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-A2.1 | GrowerAuditController.java | 名片审核 API |
+| C-A2.2 | GrowerAuditService.java | 名片审核逻辑 |
+| C-A2.3 | RecruitReviewController.java | 待复核 API |
+| C-A2.4 | RecruitReviewService.java | 待复核逻辑 |
+
+### 编译自检
+
+```bash
+cd com.fenzhitech.crrc.service-common && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-file && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-trade && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-goods && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-audit && ./gradlew compileJava
+cd com.fenzhitech.crrc.gateway-mobile && ./gradlew compileJava
+cd com.fenzhitech.crrc.gateway-management && ./gradlew compileJava
+```
+
+### M3 验收标准
+- [ ] 编译自检零错误
+- [ ] 视频上传5环节端到端可通
+- [ ] 招工发布免审核直接可见
+- [ ] 敏感关键词自动标记
+- [ ] 拨号日志完整记录
+- [ ] MyBatis XML 无 `${}` 注入
+
+---
+
+## M4 Team D — 测试验收(3-4天)
+
+### 测试重点(业务领导指定)
+
+#### 核心接口(必须测试)
+- /api/wx/grower/profile — 果农档案
+- /api/wx/grower/upload-credential — OSS 凭证
+- /api/wx/grower/upload-callback — 上传回调
+- /api/wx/grower/recruit — 招工发布
+- /api/wx/grower/workers — 工人列表
+- /api/wx/call/phone — 拨号接口
+- /api/admin/audit/grower-profile/{id} — 名片审核
+
+#### 重点场景
+| 场景 | 说明 |
+|------|------|
+| 视频上传 | 50MB边界、格式异常、网络中断、EXIF清除验证 |
+| 照片上传 | 9张边界、大小限制、格式校验 |
+| 招工发布 | 敏感词标记、免审核发布、下架/编辑 |
+| 找工人 | 工种筛选、距离排序准确性、拨号日志 |
+| 审核 | 名片通过/驳回、待复核处理、SLA提醒 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M4.1 | 编写测试用例(≥30个) | 1天 |
+| M4.2 | 编写自动化测试代码 | 1.5天 |
+| M4.3 | 手动验证(视频上传专项) | 0.5天 |
+| M4.4 | ./gradlew test 全部通过 | 0.5天 |
+| M4.5 | Bug 修复 | 1天 |
+
+### M4 验收标准
+- [ ] 测试用例数 ≥ 30
+- [ ] 视频上传端到端测试通过
+- [ ] `./gradlew test` 全部通过
+- [ ] Bug 清单记录完整
+
+---
+
+## 阶段2a风险与缓解
+
+| 风险 | 影响 | 概率 | 缓解措施 |
+|------|------|------|----------|
+| 视频上传链路复杂 | 延期3-5天 | 高 | 拆分5步逐步验证;压缩失败有重试机制 |
+| OSS回调不可靠 | 视频URL未记录 | 中 | 后端定时扫描OSS Bucket补录 |
+| EXIF清除不彻底 | 位置信息泄露 | 低 | 前端清除+后端二次检查双保险 |
+| 敏感词库不完善 | 误杀或漏杀 | 中 | 初始词库只含明确违规词;通过待复核列表持续优化 |
+| 距离计算精度 | 排序不准确 | 低 | 使用成熟Haversine公式,经纬度精确到小数点后7位 |

+ 287 - 0
docs/phase-2b-tasks.md

@@ -0,0 +1,287 @@
+# 阶段2b:工人+客商+农资功能 — 详细任务清单
+
+> 工期:2周(10天)
+> 目标:四端核心流程跑通——工人能报名、客商能找货、农资能展示
+> 功能点:13个
+> 前置:阶段2a完成(果农数据已有、招工数据已有、拨号日志已有)
+> 流程:M1(需求) → M2(架构) → M3(编码) → M4(测试)
+
+---
+
+## 里程碑总览
+
+```
+Week 1                    Week 2
+┌─────────────────────┐  ┌─────────────────────┐
+│ M1 需求分析          │  │ M3 编码(续)+自检     │
+│ M2 架构设计          │  │ M4 测试验收          │
+│ M3 编码(核心模块)     │  │                     │
+└─────────────────────┘  └─────────────────────┘
+  5天                        5天
+```
+
+---
+
+## M1 Team A — 需求分析(1.5天)
+
+### 交付产物
+
+| 序号 | 文件路径 | 说明 |
+|------|----------|------|
+| 1 | deliveries/team-a-requirement/spec.md | 阶段2b需求规格 |
+| 2 | deliveries/team-a-requirement/use-cases.md | 用例文档 |
+| 3 | deliveries/team-a-requirement/constraints.md | 约束条件 |
+| 4 | deliveries/team-a-requirement/DELIVERY-MANIFEST.md | 交付清单 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M1.1 | 工人端需求细化(找活推荐、报名、防骚扰、状态、信用) | 0.5天 |
+| M1.2 | 客商端需求细化(货源筛选、详情、联系授权、拨号) | 0.5天 |
+| M1.3 | 农资端+短信配置需求 | 0.25天 |
+| M1.4 | DELIVERY-MANIFEST.md | 0.25天 |
+
+### M1 关键需求点
+
+**报名+短信通知流程**:
+```
+工人点击报名 → INSERT worker_apply → 检查 sms_daily_limit
+→ 无记录/未达限 → 发送短信(阿里云API)→ INSERT/UPDATE sms_daily_limit
+→ 更新 worker_profile.status = 0(忙碌)
+→ 短信内容:【洒渔用工】[工人姓名]([工种])对您的招工感兴趣,联系电话:[电话]
+```
+
+**联系授权流程**:
+```
+客商浏览货源详情 → 勾选具体批次(如"红富士 20000斤")
+→ 后端检查是否已有有效解锁记录
+→ 无记录/已过期 → INSERT phone_unlock_record(expire_time=now+7天)
+→ 返回果农电话
+→ 客商一键拨号 → INSERT call_log
+```
+
+**信用机制**:
+- complaint_count=1 → 警告
+- complaint_count=2 → 限制报名24小时
+- complaint_count=3 → 状态锁定,需管理员解除
+- 定时任务每天凌晨检查,3天无操作自动恢复空闲
+
+### M1 验收标准
+- [ ] spec.md 覆盖13个功能点
+- [ ] use-cases.md 用例数 ≥ 25
+- [ ] 报名+短信流程图完整
+- [ ] 联系授权流程图完整
+- [ ] 信用机制状态机图完整
+
+---
+
+## M2 Team B — 架构设计(1.5天)
+
+### 交付产物
+
+| 序号 | 文件路径 | 说明 |
+|------|----------|------|
+| 1 | deliveries/team-b-architecture/design.md | 架构设计 |
+| 2 | deliveries/team-b-architecture/api-definition.md | 接口定义 |
+| 3 | deliveries/team-b-architecture/DELIVERY-MANIFEST.md | 交付清单 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M2.1 | 工人端架构(推荐算法、报名、状态机、信用) | 0.5天 |
+| M2.2 | 客商端架构(筛选、授权、拨号) | 0.5天 |
+| M2.3 | 接口定义(新增约15个接口) | 0.25天 |
+| M2.4 | DELIVERY-MANIFEST.md | 0.25天 |
+
+### M2 接口清单(阶段2b新增)
+
+#### 工人模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/worker/profile | GET/PUT | 工人档案 |
+| /api/wx/worker/recommend | GET | 推荐招工列表(工种匹配+距离排序) |
+| /api/wx/worker/apply | POST | 报名(触发短信) |
+| /api/wx/worker/status | PUT | 切换状态(空闲/工作中) |
+| /api/wx/worker/applies | GET | 报名历史 |
+
+#### 客商模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/buyer/profile | GET/PUT | 客商档案 |
+| /api/wx/buyer/goods | GET | 货源列表(品种/价格/距离筛选) |
+| /api/wx/buyer/goods/{id} | GET | 货源详情(含视频/照片) |
+| /api/wx/buyer/unlock | POST | 解锁果农电话(7天有效) |
+| /api/wx/buyer/preferences | GET/PUT | 收购偏好 |
+
+#### 农资模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/supplier/shop | GET/PUT | 店铺信息 |
+
+#### 后台模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/admin/sms/config | GET/PUT | 短信配置(签名+模板) |
+
+### M2 验收标准
+- [ ] api-definition.md 新增接口 ≥ 15
+- [ ] 报名+短信时序图完整
+- [ ] 联系授权时序图完整
+- [ ] 信用机制状态机图完整
+
+---
+
+## M3 Team C — 编码实现(5-6天)
+
+### 模块拆分与并行策略
+
+```
+并行组1(数据层):
+├── C-WorkerApply: 报名表 CRUD
+├── C-PhoneUnlock: 联系授权记录
+└── C-SmsDailyLimit: 短信限流
+
+并行组2(业务层,并行组1完成后):
+├── C-WorkerRecommend: 工人找活推荐
+├── C-WorkerApplyBiz: 报名+短信通知
+├── C-WorkerStatus: 状态管理+信用机制
+└── C-BuyerGoods: 客商找货+联系授权
+
+并行组3(简单模块,可与其他组并行):
+├── C-SupplierShop: 农资店铺
+└── C-SmsConfig: 短信配置
+
+串行:
+└── C-Integration: 集成+自检
+```
+
+### 任务详细分解
+
+#### C-WorkerRecommend: 工人找活(1天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-WR.1 | WorkerRecommendController.java | 推荐招工列表 API |
+| C-WR.2 | WorkerRecommendService.java | 工种匹配+距离排序 |
+| C-WR.3 | RecruitInfoMapper.xml | 招工查询(工种+经纬度) |
+
+#### C-WorkerApplyBiz: 报名+短信(1.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-WA.1 | WorkerApplyController.java | 报名 API |
+| C-WA.2 | WorkerApplyService.java | 报名业务逻辑 |
+| C-WA.3 | SmsService.java | 短信发送(阿里云API) |
+| C-WA.4 | SmsDailyLimitService.java | 短信限流逻辑 |
+| C-WA.5 | WorkerApplyMapper.xml | 报名表映射 |
+| C-WA.6 | SmsDailyLimitMapper.xml | 限流表映射 |
+
+#### C-WorkerStatus: 状态+信用(1天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-WS.1 | WorkerStatusController.java | 状态切换 API |
+| C-WS.2 | WorkerStatusService.java | 状态业务逻辑 |
+| C-WS.3 | CreditService.java | 信用机制(投诉计数+处罚) |
+| C-WS.4 | AutoRecoverTask.java | 3天自动恢复定时任务 |
+| C-WS.5 | WorkerProfileMapper.xml | 工人表映射更新 |
+
+#### C-BuyerGoods: 客商找货+授权(1.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-BG.1 | BuyerGoodsController.java | 货源列表+详情 API |
+| C-BG.2 | BuyerGoodsService.java | 货源筛选逻辑(品种/价格/距离) |
+| C-BG.3 | PhoneUnlockController.java | 解锁电话 API |
+| C-BG.4 | PhoneUnlockService.java | 授权逻辑(7天有效期) |
+| C-BG.5 | PhoneUnlockMapper.xml | 授权记录映射 |
+| C-BG.6 | GrowerProfileMapper.xml | 果农查询(含视频/照片) |
+
+#### C-SupplierShop: 农资店铺(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-SS.1 | SupplierShopController.java | 店铺信息 API |
+| C-SS.2 | SupplierShopService.java | 店铺 CRUD |
+| C-SS.3 | SupplierShopMapper.xml | 店铺表映射 |
+
+#### C-SmsConfig: 短信配置(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-SC.1 | SmsConfigController.java | 短信配置 API |
+| C-SC.2 | SmsConfigService.java | 签名+模板管理 |
+
+### 编译自检
+
+```bash
+cd com.fenzhitech.crrc.service-common && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-trade && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-goods && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-message && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-user && ./gradlew compileJava
+cd com.fenzhitech.crrc.gateway-mobile && ./gradlew compileJava
+cd com.fenzhitech.crrc.gateway-management && ./gradlew compileJava
+```
+
+### M3 验收标准
+- [ ] 编译自检零错误
+- [ ] 报名→短信通知端到端可通
+- [ ] 联系授权→拨号端到端可通
+- [ ] 状态切换+自动恢复可通
+- [ ] 短信限流逻辑正确
+- [ ] MyBatis XML 无 `${}` 注入
+
+---
+
+## M4 Team D — 测试验收(2-3天)
+
+### 测试重点(业务领导指定)
+
+#### 核心接口(必须测试)
+- /api/wx/worker/recommend — 推荐招工
+- /api/wx/worker/apply — 报名
+- /api/wx/worker/status — 状态切换
+- /api/wx/buyer/goods — 货源列表
+- /api/wx/buyer/unlock — 解锁电话
+- /api/wx/call/phone — 拨号
+- /api/wx/supplier/shop — 店铺信息
+
+#### 重点场景
+| 场景 | 说明 |
+|------|------|
+| 报名 | 短信发送成功、防骚扰限流、跨天重置 |
+| 状态 | 手动切换、3天自动恢复、报名联动忙碌 |
+| 信用 | 投诉1/2/3次递进处罚、管理员解除 |
+| 联系授权 | 解锁成功、7天过期、重新勾选 |
+| 边界 | 多身份用户数据隔离、并发报名 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M4.1 | 编写测试用例(≥25个) | 0.5天 |
+| M4.2 | 编写自动化测试代码 | 1天 |
+| M4.3 | 手动验证(四端流程联调) | 0.5天 |
+| M4.4 | ./gradlew test 全部通过 | 0.5天 |
+| M4.5 | Bug 修复 | 0.5天 |
+
+### M4 验收标准
+- [ ] 测试用例数 ≥ 25
+- [ ] 四端核心流程测试通过
+- [ ] `./gradlew test` 全部通过
+- [ ] 短信限流测试正确(跨天重置)
+
+---
+
+## 阶段2b风险与缓解
+
+| 风险 | 影响 | 概率 | 缓解措施 |
+|------|------|------|----------|
+| 短信发送延迟/失败 | 果农收不到通知 | 中 | 异步发送,失败重试3次;记录发送状态 |
+| 短信成本超预算 | 运营成本增加 | 低 | sms_daily_limit限流;月度500元告警 |
+| 3天自动恢复误判 | 工人状态不准确 | 低 | 定时任务每天凌晨执行,日志记录恢复操作 |
+| 联系授权并发问题 | 重复解锁记录 | 低 | 数据库唯一索引(buyer+grower+batch) |
+| 四端联调复杂 | 集成问题多 | 中 | 预留充足联调时间,逐步集成 |

+ 313 - 0
docs/phase-3-tasks.md

@@ -0,0 +1,313 @@
+# 阶段三:运营功能与统计 — 详细任务清单
+
+> 工期:2周(10天)
+> 目标:政府管理部门能监控运营、统计数据、管理平台
+> 功能点:14个
+> 前置:阶段2b完成(四端核心流程跑通,数据已积累)
+> 流程:M1(需求) → M2(架构) → M3(编码) → M4(测试)
+
+---
+
+## 里程碑总览
+
+```
+Week 1                    Week 2
+┌─────────────────────┐  ┌─────────────────────┐
+│ M1 需求分析          │  │ M3 编码(续)+自检     │
+│ M2 架构设计          │  │ M4 测试验收          │
+│ M3 编码(大屏+报表)   │  │                     │
+└─────────────────────┘  └─────────────────────┘
+  5天                        5天
+```
+
+---
+
+## M1 Team A — 需求分析(1.5天)
+
+### 交付产物
+
+| 序号 | 文件路径 | 说明 |
+|------|----------|------|
+| 1 | deliveries/team-a-requirement/spec.md | 阶段三需求规格 |
+| 2 | deliveries/team-a-requirement/use-cases.md | 用例文档 |
+| 3 | deliveries/team-a-requirement/constraints.md | 约束条件 |
+| 4 | deliveries/team-a-requirement/DELIVERY-MANIFEST.md | 交付清单 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M1.1 | 数据大屏需求细化(核心指标+扩展指标+刷新机制) | 0.5天 |
+| M1.2 | 报表导出需求细化(3类报表+脱敏+二次确认) | 0.5天 |
+| M1.3 | 后台管理+小程序P1功能需求 | 0.25天 |
+| M1.4 | DELIVERY-MANIFEST.md | 0.25天 |
+
+### M1 关键需求点
+
+**数据大屏指标**:
+| 指标 | 数据来源 | 优先级 | 刷新频率 |
+|------|---------|--------|---------|
+| 注册用户总数 | sys_user | P0 | 5分钟 |
+| 今日活跃 | sys_user.last_active_time | P0 | 5分钟 |
+| 供需比 | recruit_info / worker_profile | P0 | 5分钟 |
+| 电话拨打次数 | call_log | P0 | 5分钟 |
+| 短信发送条数 | sms_daily_limit | P0 | 5分钟 |
+| 有效撮合率 | worker_apply | P0 | 5分钟 |
+| PV/UV | 新增统计表 | P1 | 5分钟 |
+| 名片浏览量 | 新增统计表 | P1 | 5分钟 |
+| 果农分布热力图 | grower_profile | P1 | 每日 |
+| 客商来源TOP10 | buyer_profile | P1 | 每日 |
+
+**报表导出**:
+- 用户列表导出(手机号脱敏)
+- 撮合记录导出(拨号/短信/报名)
+- 操作日志导出
+- >1000行异步导出+邮件通知
+- 导出需二次确认+操作日志记录
+
+### M1 验收标准
+- [ ] spec.md 覆盖14个功能点
+- [ ] use-cases.md 用例数 ≥ 20
+- [ ] 数据大屏指标定义完整
+- [ ] 报表导出流程图完整
+
+---
+
+## M2 Team B — 架构设计(1.5天)
+
+### 交付产物
+
+| 序号 | 文件路径 | 说明 |
+|------|----------|------|
+| 1 | deliveries/team-b-architecture/design.md | 架构设计 |
+| 2 | deliveries/team-b-architecture/api-definition.md | 接口定义 |
+| 3 | deliveries/team-b-architecture/DELIVERY-MANIFEST.md | 交付清单 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M2.1 | 数据大屏架构(定时任务→Redis缓存→前端展示) | 0.5天 |
+| M2.2 | 报表导出架构(查询→脱敏→Excel生成→下载) | 0.5天 |
+| M2.3 | 接口定义(新增约15个接口) | 0.25天 |
+| M2.4 | DELIVERY-MANIFEST.md | 0.25天 |
+
+### M2 接口清单(阶段三新增)
+
+#### 数据大屏
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/admin/dashboard/overview | GET | 宏观概览(用户总数/活跃/供需比) |
+| /api/admin/dashboard/match | GET | 撮合指标(拨号/短信/撮合率) |
+| /api/admin/dashboard/traffic | GET | 流量指标(PV/UV/名片浏览) |
+| /api/admin/dashboard/map | GET | 产业地图(果农分布/客商来源) |
+
+#### 报表导出
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/admin/export/users | POST | 导出用户列表 |
+| /api/admin/export/match-records | POST | 导出撮合记录 |
+| /api/admin/export/operation-logs | POST | 导出操作日志 |
+| /api/admin/export/status/{taskId} | GET | 查询导出状态(异步) |
+| /api/admin/export/download/{taskId} | GET | 下载导出文件 |
+
+#### 后台管理
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/admin/recruit/patrol | GET | 招工巡查列表 |
+| /api/admin/recruit/{id}/force-down | PUT | 强制下架 |
+| /api/admin/users/{id} | PUT | 用户信息修正 |
+| /api/admin/complaint/list | GET | 举报列表 |
+| /api/admin/complaint/{id} | PUT | 处理举报 |
+
+#### 小程序P1
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/supplier/categories | GET | 农资分类列表 |
+| /api/wx/supplier/shops | GET | 店铺列表(分类筛选) |
+| /api/wx/worker/applies | GET | 报名历史 |
+| /api/wx/buyer/preferences | GET/PUT | 收购偏好 |
+
+### M2 验收标准
+- [ ] api-definition.md 新增接口 ≥ 15
+- [ ] 数据大屏技术方案(定时任务+Redis)明确
+- [ ] 报表导出方案(异步+脱敏)明确
+
+---
+
+## M3 Team C — 编码实现(5-6天)
+
+### 模块拆分与并行策略
+
+```
+并行组1(统计层):
+├── C-Dashboard: 数据大屏统计
+└── C-Export: 报表导出
+
+并行组2(管理层,可与组1并行):
+├── C-RecruitPatrol: 招工巡查
+├── C-UserFix: 用户信息修正
+└── C-Complaint: 举报处理
+
+并行组3(小程序P1,可与其他组并行):
+├── C-SupplierBrowse: 买农资浏览
+├── C-WorkerHistory: 工作记录
+└── C-BuyerPreference: 收购偏好
+
+串行:
+└── C-Integration: 集成+自检
+```
+
+### 任务详细分解
+
+#### C-Dashboard: 数据大屏(2天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-DB.1 | DashboardController.java | 大屏数据 API |
+| C-DB.2 | DashboardService.java | 统计业务逻辑 |
+| C-DB.3 | DashboardRefreshTask.java | 定时任务(每5分钟刷新→Redis) |
+| C-DB.4 | DashboardCacheService.java | Redis 缓存读写 |
+| C-DB.5 | TrafficStatsService.java | PV/UV 统计(需新增统计表) |
+| C-DB.6 | MapStatsService.java | 产业地图统计 |
+
+**新增表**(如需):
+- page_view_log(PV日志):page, user_id, view_time
+- profile_view_log(名片浏览):profile_id, viewer_id, view_time
+
+#### C-Export: 报表导出(1.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-EX.1 | ExportController.java | 导出 API |
+| C-EX.2 | ExportService.java | 导出业务逻辑 |
+| C-EX.3 | ExcelGenerateService.java | Excel 生成(Apache POI) |
+| C-EX.4 | ExportTaskService.java | 异步导出(>1000行) |
+| C-EX.5 | DataMaskingService.java | 导出数据脱敏 |
+
+#### C-RecruitPatrol: 招工巡查(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-RP.1 | RecruitPatrolController.java | 巡查列表+强制下架 API |
+| C-RP.2 | RecruitPatrolService.java | 巡查业务逻辑 |
+
+#### C-UserFix: 用户信息修正(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-UF.1 | UserFixController.java | 用户信息修正 API |
+| C-UF.2 | UserFixService.java | 修正逻辑(含操作日志) |
+
+#### C-Complaint: 举报处理(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-CM.1 | ComplaintController.java | 举报列表+处理 API |
+| C-CM.2 | ComplaintService.java | 举报处理逻辑 |
+| C-CM.3 | ComplaintMapper.xml | 投诉表映射 |
+
+#### C-SupplierBrowse: 买农资(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-SB.1 | SupplierBrowseController.java | 分类筛选+店铺列表 API |
+| C-SB.2 | SupplierBrowseService.java | 浏览逻辑 |
+
+#### C-WorkerHistory: 工作记录(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-WH.1 | WorkerHistoryController.java | 报名历史 API |
+| C-WH.2 | WorkerHistoryService.java | 历史查询逻辑 |
+
+#### C-BuyerPreference: 收购偏好(0.5天)
+
+| 任务 | 文件 | 说明 |
+|------|------|------|
+| C-BP.1 | BuyerPreferenceController.java | 收购偏好 API |
+| C-BP.2 | BuyerPreferenceService.java | 偏好 CRUD |
+
+### 编译自检
+
+```bash
+cd com.fenzhitech.crrc.service-common && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-system && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-trade && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-goods && ./gradlew compileJava
+cd com.fenzhitech.crrc.service-user && ./gradlew compileJava
+cd com.fenzhitech.crrc.gateway-mobile && ./gradlew compileJava
+cd com.fenzhitech.crrc.gateway-management && ./gradlew compileJava
+```
+
+### M3 验收标准
+- [ ] 编译自检零错误
+- [ ] 数据大屏5分钟自动刷新
+- [ ] 报表导出端到端可通
+- [ ] 招工巡查+强制下架可通
+- [ ] MyBatis XML 无 `${}` 注入
+
+---
+
+## M4 Team D — 测试验收(2-3天)
+
+### 测试重点(业务领导指定)
+
+#### 核心接口(必须测试)
+- /api/admin/dashboard/overview — 宏观概览
+- /api/admin/dashboard/match — 撮合指标
+- /api/admin/export/users — 用户导出
+- /api/admin/export/match-records — 撮合记录导出
+- /api/admin/recruit/patrol — 招工巡查
+- /api/admin/recruit/{id}/force-down — 强制下架
+- /api/wx/supplier/shops — 店铺列表
+- /api/wx/worker/applies — 报名历史
+
+#### 重点场景
+| 场景 | 说明 |
+|------|------|
+| 大屏 | 统计数据准确性、定时刷新、Redis缓存一致性 |
+| 报表 | 导出数据完整性、脱敏正确性、大文件导出 |
+| 巡查 | 强制下架生效、列表筛选 |
+| P1功能 | 买农资筛选、工作记录、收购偏好 |
+| 回归 | 阶段一登录+权限+导入功能不受影响 |
+
+### 任务分解
+
+| 任务 | 内容 | 耗时 |
+|------|------|------|
+| M4.1 | 编写测试用例(≥20个) | 0.5天 |
+| M4.2 | 编写自动化测试代码 | 1天 |
+| M4.3 | 手动验证(大屏+报表) | 0.5天 |
+| M4.4 | ./gradlew test 全部通过 + 回归测试 | 0.5天 |
+| M4.5 | Bug 修复 | 0.5天 |
+
+### M4 验收标准
+- [ ] 测试用例数 ≥ 20
+- [ ] 数据大屏统计准确
+- [ ] 报表导出脱敏正确
+- [ ] `./gradlew test` 全部通过
+- [ ] 回归测试通过(阶段一二功能不受影响)
+
+---
+
+## 阶段三风险与缓解
+
+| 风险 | 影响 | 概率 | 缓解措施 |
+|------|------|------|----------|
+| 统计数据不准确 | 大屏可信度低 | 中 | 统计SQL与业务SQL对齐;提供数据核对入口 |
+| 大文件导出超时 | 报表导出失败 | 中 | >1000行异步导出+邮件通知下载 |
+| Redis缓存不一致 | 大屏数据延迟 | 低 | 5分钟刷新可接受;提供手动刷新按钮 |
+| 回归测试遗漏 | 已有功能被破坏 | 中 | 阶段一二的核心接口全部回归 |
+
+---
+
+## 跨阶段验收总览
+
+| 阶段 | 验收节点 | 核心验收项 |
+|------|---------|-----------|
+| 阶段零 | 环境就绪 | 编译通过+数据库连接+外部服务配置 |
+| 阶段一 | 能登录+看行情 | 管理员导入数据、用户微信登录、首页行情 |
+| 阶段2a | 能发招工+找工人 | 果农名片+招工发布+找工人/客商+拨号 |
+| 阶段2b | 四端流程跑通 | 工人报名+客商找货+联系授权+农资展示 |
+| 阶段三 | 大屏+报表可用 | 数据大屏+报表导出+招工巡查+P1功能 |

+ 524 - 0
docs/phase-planning-discussion.md

@@ -0,0 +1,524 @@
+# 阶段划分研讨会议记录
+
+## 项目:洒渔镇苹果产业供需对接平台
+## 主题:需求阶段划分与各阶段详细设计
+
+## 参与角色(6人,每人1票)
+
+| 角色 | 代号 | 核心关注 |
+|------|------|---------|
+| 产品经理 | PM | 业务价值、用户可用性、交付节奏 |
+| 架构师 | ARCH | 技术依赖、基础设施、可扩展性 |
+| 用户体验师 | UX | 用户旅程完整性、交互连贯性 |
+| 后端开发 | BE | 开发工作量、并行度、技术风险 |
+| 测试工程师 | QA | 可测试性、回归风险、验收标准 |
+| 安全专家 | SEC | 安全基础设施、权限控制时机 |
+
+## 投票规则
+- 每人1票(支持/反对/弃权)
+- **通过门槛:≥5票支持**(>n/2+1=4)
+
+## 需求总览(来自 requirements-specification.md)
+
+**P0功能(MVP核心,28个功能点)**:
+- 公共:微信登录+身份路由+兜底绑定
+- 果农:今日行情、找工人、发布招工(免审核+关键词标记)、找客商、我的名片(视频/照片)
+- 工人:找活推荐、报名通知、状态管理(自动恢复+信用机制)
+- 客商:货源筛选、联系授权(7天有效期)
+- 后台:角色管理、数据导入(硬编码+预览)、名片审核、待复核列表、行情管理、数据大屏
+
+**P1功能(12个功能点)**:
+- 果农:招工记录、买农资
+- 工人:工作记录、我的信息
+- 客商:收购偏好
+- 农资:店铺信息维护
+- 后台:操作日志、短信配置、用户信息修正、招工巡查、流量指标、产业地图、报表导出
+
+**P2功能(3个功能点)**:关于我们、举报处理
+
+**数据表(15张)**:sys_user、user_identity、grower_profile、worker_profile、recruit_info、buyer_profile、phone_unlock_record、call_log、sms_daily_limit、market_price、supplier_shop、audit_log、operation_log、worker_apply、complaint
+
+**接口(约25个)**:/api/wx/* + /api/admin/*
+
+---
+
+## 议题一:阶段数量与划分策略
+
+### 问题
+1. 划分为几个阶段?每个阶段多长?
+2. 划分依据:按功能模块 vs 按技术层次 vs 按用户旅程?
+
+### 第一轮发言
+
+**PM**:建议按用户价值交付节奏划分。用户最关心的是"能不能用起来",而不是"后端架构完不完整"。我建议3个阶段:
+- 阶段一:能登录、能看到数据(基础可用)
+- 阶段二:能发布、能对接(核心交易)
+- 阶段三:能统计、能管理(运营闭环)
+
+**ARCH**:反对按纯功能模块划分,因为有技术依赖。比如:没有用户系统就没有身份路由,没有身份路由就没有果农/工人功能。建议按技术层次+功能模块结合:
+- 阶段一:基础设施+用户体系+后台数据导入(没有用户数据,小程序端无人可用)
+- 阶段二:四端核心功能(果农/工人/客商/农资的基础功能)
+- 阶段三:运营功能+数据大屏+P1功能
+
+**UX**:同意ARCH。从用户旅程角度,用户的第一步是"登录→看到自己的身份→看到有用的信息"。如果阶段一只有登录没有数据,用户登录后看到空页面会流失。所以阶段一必须包含数据导入+今日行情+基础浏览功能。
+
+**BE**:同意ARCH的3阶段划分。补充工作量评估:
+- 阶段一:约40%工作量(基础设施+用户体系+数据导入+行情)
+- 阶段二:约40%工作量(四端核心功能)
+- 阶段三:约20%工作量(运营+统计+P1)
+
+**QA**:同意3阶段。每个阶段都需要有可测试的交付物。阶段一的验收标准:管理员能导入数据、用户能登录并看到身份。阶段二的验收标准:四端核心流程跑通。阶段三的验收标准:数据大屏可用、报表可导出。
+
+**SEC**:同意3阶段。安全基础设施必须在阶段一完成——手机号加密、权限框架、操作日志。不能等到阶段二再补安全,否则代码需要大量重构。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 3阶段按用户价值交付,节奏合理 |
+| ARCH | ✅ 支持 | 技术依赖+功能模块结合划分 |
+| UX | ✅ 支持 | 用户旅程完整,阶段一即可用 |
+| BE | ✅ 支持 | 工作量分布合理(40/40/20) |
+| QA | ✅ 支持 | 每阶段有可测试交付物 |
+| SEC | ✅ 支持 | 安全基础设施前置到阶段一 |
+
+**结果:6/6 ≥ 5,通过 ✅**
+
+### 决议
+- **3个阶段**,按技术层次+功能模块+用户价值结合划分
+- 阶段一:基础设施+用户体系+数据导入+基础浏览(40%工作量)
+- 阶段二:四端核心功能(40%工作量)
+- 阶段三:运营功能+统计+P1补充(20%工作量)
+
+---
+
+## 议题二:阶段一详细设计
+
+### 问题
+阶段一应包含哪些具体功能?依赖关系如何?验收标准?
+
+### 第一轮发言
+
+**PM**:阶段一的目标是"平台可用"——管理员能录入数据,用户能登录并看到有用信息。建议包含:
+1. 微信登录+身份路由
+2. 后台:系统管理(角色/账号/字典)+ 数据导入
+3. 后台:行情管理(配置今日行情)
+4. 小程序:首页展示(今日行情+金刚区框架)
+5. 后台:名片审核(果农视频/照片审核)
+
+**ARCH**:同意PM。补充技术依赖链:
+```
+数据库建表 → 用户体系(sys_user+user_identity) → 微信登录 → 身份路由
+           → 后台管理框架(角色/权限) → 数据导入 → 行情配置
+           → 小程序首页(行情展示)
+```
+阶段一必须完成数据库建表(全部15张表),即使部分表暂时没有数据。
+
+**BE**:全部15张表在阶段一建?会不会过度设计?
+
+**ARCH**:不是过度设计,是避免后续阶段改表结构。表结构在需求规格中已经定义清楚了,一次性建好,后续阶段只做INSERT/UPDATE,不做ALTER TABLE。改表结构的成本远高于提前建表。
+
+**UX**:阶段一的用户体验重点:
+1. 登录流程顺畅(微信一键→身份选择→首页)
+2. 首页信息有价值(今日行情让用户觉得"这个平台有用")
+3. 金刚区展示4个入口,但部分入口可以显示"即将开放"灰态
+
+**QA**:阶段一验收标准:
+1. 管理员能登录后台
+2. 管理员能通过Excel导入果农/工人/客商/农资数据
+3. 管理员能配置今日行情
+4. 用户能微信登录
+5. 用户能选择身份进入对应首页
+6. 首页展示今日行情
+7. 名片审核流程可用
+
+**SEC**:阶段一安全清单:
+1. 手机号AES加密存储+phone_hash索引
+2. 权限框架(RBAC角色+URL拦截)
+3. 操作日志(登录/导入/审核记录)
+4. 接口数据脱敏
+
+### 第二轮交锋
+
+**PM**:名片审核放在阶段一还是阶段二?果农上传视频/照片是阶段二的功能,审核放在阶段一是否太早?
+
+**BE**:建议阶段一只做审核框架(审核列表+通过/驳回操作),不包含视频上传。果农的视频上传功能放在阶段二。阶段一的审核对象可以是Excel导入时的"待审核"数据。
+
+**ARCH**:同意BE。阶段一的审核有两个用途:
+1. Excel导入的数据可能需要审核确认
+2. 为阶段二的名片审核/招工审核预建框架
+
+**QA**:那阶段一的审核对象是什么?
+
+**PM**:建议阶段一审核对象是"导入的用户数据"——录入员导入Excel后,审核员确认数据无误再入库。这样阶段一就有完整的审核流程可测试。
+
+**BE**:这个方案好。导入→预览→审核→入库,流程完整。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 目标明确,用户可用 |
+| ARCH | ✅ 支持 | 技术依赖链清晰,全量建表合理 |
+| UX | ✅ 支持 | 登录+首页体验完整 |
+| BE | ✅ 支持 | 工作量可控,审核框架复用 |
+| QA | ✅ 支持 | 验收标准明确可测 |
+| SEC | ✅ 支持 | 安全基础设施前置 |
+
+**结果:6/6 ≥ 5,通过 ✅**
+
+### 阶段一决议
+
+**阶段名称**:基础设施与用户体系
+**目标**:平台可用——管理员能录入数据,用户能登录并看到有价值的信息
+
+**功能清单**:
+
+| 模块 | 功能 | 优先级 | 说明 |
+|------|------|--------|------|
+| 数据库 | 全量建表(15张) | P0 | 一次性建好,避免后续ALTER |
+| 后台-系统管理 | 角色管理 | P0 | 超级管理员/录入员/审核员/运维 |
+| 后台-系统管理 | 账号管理 | P0 | 管理员CRUD+权限分配 |
+| 后台-系统管理 | 字典管理 | P0 | 品种/工种/农资种类/行政区划 |
+| 后台-系统管理 | 操作日志 | P0 | 登录/导入/审核记录 |
+| 后台-数据导入 | Excel模板下载 | P0 | 4类模板 |
+| 后台-数据导入 | Excel上传+预览 | P0 | 预览(总行数/有效/错误/重复) |
+| 后台-数据导入 | 数据校验+去重 | P0 | 手机号校验、手机号+身份去重 |
+| 后台-数据导入 | 确认入库 | P0 | ≤100行同步,>100行异步 |
+| 后台-审核中心 | 审核框架 | P0 | 审核列表+通过/驳回+SLA提醒 |
+| 后台-审核中心 | 导入数据审核 | P0 | 导入数据需审核确认后生效 |
+| 后台-行情管理 | 行情配置 | P0 | 按品种设置价格区间+趋势 |
+| 小程序-登录 | 微信登录 | P0 | wx.login→JWT |
+| 小程序-登录 | 身份路由 | P0 | 0/1/N个身份路由逻辑 |
+| 小程序-登录 | 身份选择页 | P0 | 大卡片列表(≥120px) |
+| 小程序-首页 | 今日行情 | P0 | 涨价红/降价绿色块+更新时间 |
+| 小程序-首页 | 金刚区 | P0 | 4入口(部分可灰态"即将开放") |
+| 安全 | 手机号加密 | P0 | AES加密+phone_hash索引 |
+| 安全 | 权限框架 | P0 | RBAC+URL拦截器 |
+| 安全 | 接口脱敏 | P0 | 手机号138****1234 |
+
+**技术依赖链**:
+```
+数据库建表 → sys_user+user_identity → 权限框架 → 后台管理API
+                                              → 微信登录+JWT
+          → 全量表结构 → 数据导入(Excel上传/预览/校验/入库)
+                      → 审核框架(审核列表/操作)
+                      → 行情管理(配置)
+                      → 小程序首页(行情展示/金刚区)
+```
+
+**验收标准**:
+- [ ] 管理员能登录后台管理系统
+- [ ] 管理员能通过Excel导入4类用户数据
+- [ ] 导入数据预览正确显示有效/错误/重复行
+- [ ] 导入数据经审核后生效
+- [ ] 管理员能配置今日行情(品种+价格区间+趋势)
+- [ ] 用户能微信登录,0/1/N个身份路由正确
+- [ ] 小程序首页展示今日行情(涨价红/降价绿色块)
+- [ ] 金刚区展示4个入口
+- [ ] 手机号数据库存储为密文
+- [ ] 接口返回手机号脱敏
+- [ ] 操作日志记录登录/导入/审核操作
+
+---
+
+## 议题三:阶段二详细设计
+
+### 问题
+阶段二应包含哪些具体功能?四端功能的开发顺序?依赖关系?
+
+### 第一轮发言
+
+**PM**:阶段二的目标是"供需对接"——四端用户能完成核心交易流程。建议按用户旅程顺序开发:
+1. 果农端(发布方,先有供给才有需求)
+2. 工人端(劳动方,果农招工→工人找活)
+3. 客商端(收购方,果农有货→客商找货)
+4. 农资端(供应方,最简单,最后做)
+
+**ARCH**:同意PM的顺序。技术依赖链:
+```
+果农档案(grower_profile) → 招工发布(recruit_info) → 工人报名(worker_apply) → 短信通知
+果农名片(视频/照片) → OSS上传 → 审核流程
+果农货源 → 客商浏览 → 联系授权(phone_unlock_record) → 拨号(call_log)
+```
+
+**BE**:果农端工作量最大(名片含视频上传、招工发布、找工人、找客商),建议拆为两个子阶段:
+- 2a:果农核心(名片+招工+找工人)
+- 2b:对接功能(工人报名+客商找货+联系授权)
+
+**UX**:同意BE的拆分。用户体验上,果农先完善自己的名片和招工信息,然后工人才能来找活,客商才能来找货。顺序不能反。
+
+**QA**:每个子阶段的验收标准:
+- 2a:果农能上传视频/照片到名片、能发布招工、能找到并拨号联系工人
+- 2b:工人能报名并短信通知果农、客商能筛选货源并解锁电话
+
+**SEC**:阶段二安全重点:
+1. 视频上传安全(EXIF清除、格式校验、大小限制)
+2. 拨号日志记录(call_log表)
+3. 联系授权有效期控制(7天过期)
+4. 短信防骚扰限流(sms_daily_limit表)
+
+### 第二轮交锋
+
+**PM**:BE建议拆为2a和2b,我同意。但2a和2b是串行还是并行?
+
+**ARCH**:建议串行。2a的果农数据是2b的前提——没有果农的招工信息,工人就没东西可报名;没有果农的货源信息,客商就没东西可看。
+
+**BE**:同意串行。但2a和2b内部可以并行——比如2a阶段,果农名片和招工发布可以同时开发,找工人列表也可以同时开发。
+
+**UX**:2a的用户旅程:果农登录→完善名片→发布招工→找工人拨号。2b的用户旅程:工人登录→找活报名→客商登录→找货解锁→拨号。
+
+**QA**:建议2a和2b各有一个独立的验收节点,不要等2b全部做完才验收。2a验收通过后进入2b。
+
+**PM**:同意。那农资端放在哪里?
+
+**ARCH**:农资端功能最简单(店铺信息CRUD),放在2b末尾即可,不需要单独子阶段。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 按用户旅程顺序,逻辑清晰 |
+| ARCH | ✅ 支持 | 技术依赖链明确,串行合理 |
+| UX | ✅ 支持 | 用户旅程完整连贯 |
+| BE | ✅ 支持 | 2a/2b拆分降低单阶段复杂度 |
+| QA | ✅ 支持 | 每个子阶段独立可验收 |
+| SEC | ✅ 支持 | 安全重点明确 |
+
+**结果:6/6 ≥ 5,通过 ✅**
+
+### 阶段二决议
+
+**阶段名称**:四端核心功能(供需对接)
+**目标**:四端用户能完成核心交易流程
+
+#### 阶段2a:果农核心功能
+
+| 模块 | 功能 | 说明 |
+|------|------|------|
+| 小程序-果农 | 我的名片-信息维护 | 品种/产量/价格/地址 |
+| 小程序-果农 | 我的名片-视频上传 | 前端直传OSS,清除EXIF,≤50MB/720p |
+| 小程序-果农 | 我的名片-照片上传 | ≤9张/张≤5MB,清除EXIF |
+| 小程序-果农 | 我的名片-审核状态 | 待审/已通过/被驳回 |
+| 小程序-果农 | 发布招工 | 工种/价格/人数/天数/地点/备注(语音输入) |
+| 小程序-果农 | 招工管理 | 下架/重新编辑/历史记录 |
+| 小程序-果农 | 找工人-列表 | 工种筛选+距离排序 |
+| 小程序-果农 | 找工人-拨号 | 调用拨号接口(记录call_log) |
+| 小程序-果农 | 找客商-列表 | 客商信息展示 |
+| 小程序-果农 | 找客商-拨号 | 调用拨号接口(记录call_log) |
+| 后台-审核 | 名片审核 | 审核果农视频/照片,通过/驳回 |
+| 后台-审核 | 待复核列表 | 敏感关键词标记的招工 |
+| 安全 | 视频安全 | EXIF清除、格式校验、大小限制 |
+| 安全 | 拨号日志 | call_log表记录所有拨号 |
+
+**2a验收标准**:
+- [ ] 果农能编辑名片信息(品种/产量/价格/地址)
+- [ ] 果农能上传视频到OSS,视频压缩至720p
+- [ ] 果农能上传照片(≤9张)
+- [ ] 名片提交后进入待审核状态
+- [ ] 审核员能审核名片(通过/驳回+原因)
+- [ ] 果农能发布招工信息(免审核直接发布)
+- [ ] 敏感关键词自动标记,进入待复核列表
+- [ ] 果农能下架/编辑招工
+- [ ] 果农能按工种筛选工人列表
+- [ ] 果农能一键拨号联系工人(记录call_log)
+- [ ] 果农能查看客商列表并拨号
+
+#### 阶段2b:工人+客商+农资功能
+
+| 模块 | 功能 | 说明 |
+|------|------|------|
+| 小程序-工人 | 找活推荐 | 工种匹配+距离排序 |
+| 小程序-工人 | 报名 | 点击→短信通知果农→自动忙碌 |
+| 小程序-工人 | 防骚扰 | 每天1条限制(sms_daily_limit) |
+| 小程序-工人 | 状态管理 | 手动切换+3天自动恢复 |
+| 小程序-工人 | 信用机制 | 投诉1警告→2限24h→3锁定 |
+| 小程序-客商 | 货源筛选 | 品种/价格/距离 |
+| 小程序-客商 | 货源详情 | 种植面积/规格/视频/照片 |
+| 小程序-客商 | 联系授权 | 勾选批次→解锁电话(7天有效) |
+| 小程序-客商 | 拨号 | 解锁后一键拨号(记录call_log) |
+| 小程序-农资 | 店铺信息 | CRUD+一键拨号 |
+| 后台-短信 | 短信配置 | 签名+模板管理 |
+| 安全 | 联系授权 | phone_unlock_record表+过期控制 |
+| 安全 | 短信限流 | sms_daily_limit表+自然日计 |
+
+**2b验收标准**:
+- [ ] 工人能看到推荐的招工列表(工种匹配+距离排序)
+- [ ] 工人能报名,果农收到短信通知
+- [ ] 同一工人每天对同一果农最多1条短信
+- [ ] 工人能切换状态(空闲/工作中)
+- [ ] 3天无操作自动恢复空闲
+- [ ] 工人被投诉3次后状态锁定
+- [ ] 客商能按品种/价格/距离筛选货源
+- [ ] 客商能查看货源详情(含视频/照片)
+- [ ] 客商勾选批次后解锁果农电话(7天有效)
+- [ ] 客商能一键拨号(记录call_log)
+- [ ] 农资商能维护店铺信息
+- [ ] 解锁记录完整存储
+- [ ] 短信日志全量记录
+
+---
+
+## 议题四:阶段三详细设计
+
+### 问题
+阶段三应包含哪些功能?P1功能的优先级排序?
+
+### 第一轮发言
+
+**PM**:阶段三的目标是"运营闭环"——政府管理部门能监控平台运营、统计数据、导出报表。包含:
+1. 数据大屏(宏观概览+撮合指标)
+2. 流量指标+产业地图
+3. 报表导出
+4. P1功能补充(招工巡查、用户信息修正、短信配置等)
+
+**ARCH**:数据大屏需要统计拨号次数、短信条数、供需比等,数据来源是阶段二产生的call_log、sms_daily_limit、worker_apply等表。所以阶段三依赖阶段二的数据积累。
+
+**BE**:数据大屏的技术方案:定时任务每5分钟刷新→Redis缓存。建议先做核心指标(用户总数/活跃/供需比/拨号次数),再做扩展指标(PV/UV/产业地图)。
+
+**UX**:数据大屏的UI设计要政府领导能看懂——大字大图、关键指标醒目、支持按时间筛选。产业地图用热力图展示果农分布。
+
+**QA**:阶段三验收标准:
+1. 数据大屏展示核心指标
+2. 报表能导出为Excel
+3. P1功能全部可用
+
+**SEC**:报表导出是敏感操作,需要二次确认+操作日志。导出的数据必须脱敏。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 运营闭环,政府可用 |
+| ARCH | ✅ 支持 | 数据依赖链明确 |
+| UX | ✅ 支持 | 大屏UI方向清晰 |
+| BE | ✅ 支持 | 技术方案简单可靠 |
+| QA | ✅ 支持 | 验收标准明确 |
+| SEC | ✅ 支持 | 导出安全已确认 |
+
+**结果:6/6 ≥ 5,通过 ✅**
+
+### 阶段三决议
+
+**阶段名称**:运营功能与数据统计
+**目标**:政府管理部门能监控运营、统计数据、管理平台
+
+| 模块 | 功能 | 优先级 | 说明 |
+|------|------|--------|------|
+| 后台-大屏 | 宏观概览 | P0 | 注册用户总数、今日活跃、供需比 |
+| 后台-大屏 | 撮合指标 | P0 | 电话拨打次数、短信条数、有效撮合率 |
+| 后台-大屏 | 流量指标 | P1 | PV/UV、名片浏览量 |
+| 后台-大屏 | 产业地图 | P1 | 果农分布热力图、客商来源TOP10 |
+| 后台-报表 | 数据导出 | P1 | 用户列表/撮合记录/操作日志→Excel |
+| 后台-管理 | 招工巡查 | P1 | 查看所有招工,强制下架 |
+| 后台-管理 | 用户信息修正 | P1 | 管理员修改用户基础信息 |
+| 后台-管理 | 短信配置 | P1 | 签名+模板管理 |
+| 后台-管理 | 举报处理 | P2 | 处理用户投诉 |
+| 小程序-公共 | 关于我们 | P2 | 平台介绍、联系方式、免责声明 |
+| 小程序-果农 | 买农资 | P1 | 分类筛选+店铺列表+一键拨号 |
+| 小程序-工人 | 工作记录 | P1 | 报名历史+联系果农 |
+| 小程序-工人 | 我的信息 | P1 | 展示姓名/技能/电话 |
+| 小程序-客商 | 我的需求 | P1 | 收购偏好维护 |
+
+**验收标准**:
+- [ ] 数据大屏展示注册用户总数、今日活跃、供需比
+- [ ] 数据大屏展示电话拨打次数、短信发送条数
+- [ ] 数据大屏每5分钟自动刷新
+- [ ] 管理员能导出用户列表/撮合记录为Excel(脱敏)
+- [ ] 管理员能查看所有招工并强制下架
+- [ ] 管理员能修改用户基础信息
+- [ ] 短信签名和模板可配置
+- [ ] 举报处理流程可用
+- [ ] 果农能按分类筛选农资店铺
+- [ ] 工人能查看报名历史
+- [ ] 客商能维护收购偏好
+
+---
+
+## 议题五:各阶段工期估算
+
+### 问题
+每个阶段的预估工期?关键路径?
+
+### 第一轮发言
+
+**BE**:基于CRRC项目的开发经验,估算如下:
+- 阶段一:约2-3周(数据库+用户体系+后台框架+数据导入+行情+小程序首页)
+- 阶段2a:约2-3周(果农名片+视频上传+招工+找工人+找客商+审核)
+- 阶段2b:约2周(工人报名+客商找货+联系授权+农资店铺)
+- 阶段三:约1-2周(数据大屏+报表+P1功能)
+
+**ARCH**:阶段一是关键路径——所有后续阶段都依赖阶段一的基础设施。建议阶段一投入最多资源,确保质量。
+
+**PM**:总工期约7-10周。建议每个阶段结束时有一个验收节点,业务领导确认后再进入下一阶段。
+
+**QA**:每个阶段的测试时间需要预留——建议每个阶段最后2-3天用于测试和修复。
+
+**UX**:阶段一和阶段二a的UI设计需要提前启动,不能等后端做完再设计。
+
+**SEC**:阶段一的安全review必须在进入阶段二前完成。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 工期合理,验收节点明确 |
+| ARCH | ✅ 支持 | 关键路径识别正确 |
+| UX | ✅ 支持 | UI设计前置建议合理 |
+| BE | ✅ 支持 | 工作量估算可接受 |
+| QA | ✅ 支持 | 测试时间已预留 |
+| SEC | ✅ 支持 | 安全review节点明确 |
+
+**结果:6/6 ≥ 5,通过 ✅**
+
+### 工期决议
+
+| 阶段 | 工期 | 关键里程碑 | 验收节点 |
+|------|------|-----------|----------|
+| 阶段一 | 2-3周 | 数据库+用户体系+后台+首页 | 管理员能导入数据,用户能登录看行情 |
+| 阶段2a | 2-3周 | 果农核心功能 | 果农能发招工、上传名片、找工人 |
+| 阶段2b | 2周 | 工人+客商+农资 | 四端核心流程跑通 |
+| 阶段三 | 1-2周 | 运营+统计+P1 | 数据大屏可用,报表可导出 |
+| **总计** | **7-10周** | | |
+
+**关键路径**:阶段一 → 阶段2a → 阶段2b → 阶段三(串行依赖)
+
+**并行策略**:
+- 阶段一:UI设计与后端开发并行
+- 阶段2a:果农名片UI与招工发布后端并行
+- 阶段2b:工人端与客商端可并行开发(无强依赖)
+
+---
+
+## 讨论总结
+
+### 阶段划分总览
+
+```
+阶段一(2-3周)          阶段2a(2-3周)         阶段2b(2周)          阶段三(1-2周)
+┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
+│ 基础设施         │  │ 果农核心         │  │ 工人+客商+农资   │  │ 运营+统计        │
+│                 │  │                 │  │                 │  │                 │
+│ • 数据库建表     │  │ • 果农名片       │  │ • 工人找活报名   │  │ • 数据大屏       │
+│ • 用户体系       │  │ • 视频/照片上传  │  │ • 状态+信用     │  │ • 报表导出       │
+│ • 后台管理框架   │  │ • 招工发布       │  │ • 客商找货       │  │ • 招工巡查       │
+│ • 数据导入       │  │ • 找工人/客商    │  │ • 联系授权       │  │ • P1功能补充     │
+│ • 审核框架       │  │ • 名片审核       │  │ • 农资店铺       │  │ • 举报处理       │
+│ • 行情管理       │  │ • 待复核列表     │  │ • 短信配置       │  │                 │
+│ • 微信登录       │  │                 │  │                 │  │                 │
+│ • 小程序首页     │  │                 │  │                 │  │                 │
+│ • 安全基础设施   │  │                 │  │                 │  │                 │
+└─────────────────┘  └─────────────────┘  └─────────────────┘  └─────────────────┘
+     验收:                验收:                验收:                验收:
+     能登录+看行情         能发招工+找工人       四端流程跑通          大屏+报表可用
+```
+
+### 投票汇总
+
+| 议题 | 结果 | 票数 |
+|------|------|------|
+| 阶段数量与划分策略 | ✅ 通过 | 6/6 |
+| 阶段一详细设计 | ✅ 通过 | 6/6 |
+| 阶段二详细设计 | ✅ 通过 | 6/6 |
+| 阶段三详细设计 | ✅ 通过 | 6/6 |
+| 工期估算 | ✅ 通过 | 6/6 |

+ 670 - 0
docs/phase-planning.md

@@ -0,0 +1,670 @@
+# 洒渔镇苹果产业供需对接平台 — 阶段规划说明书
+
+> 版本:V1.1
+> 编制日期:2026-05-30
+> 基于:requirements-specification.md + 阶段划分研讨(6角色投票≥5/6通过)
+> V1.1变更:增加环境准备阶段、调整工期(基于工作量复核)、增加风险与缓解措施
+
+---
+
+## 阶段总览
+
+```
+阶段0(0.5周)     阶段一(3-4周)          阶段2a(3周)           阶段2b(2周)          阶段三(2周)
+┌──────────┐  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐  ┌─────────────────┐
+│ 环境准备  │  │ 基础设施与用户体系│  │ 果农核心功能     │  │ 工人+客商+农资   │  │ 运营功能与统计   │
+│          │  │                 │  │                 │  │                 │  │                 │
+│ • 项目骨架│  │ • 数据库建表     │  │ • 果农名片       │  │ • 工人找活报名   │  │ • 数据大屏       │
+│ • OSS申请 │  │ • 用户体系       │  │ • 视频/照片上传  │  │ • 状态+信用     │  │ • 报表导出       │
+│ • 短信申请│  │ • 后台管理框架   │  │ • 招工发布       │  │ • 客商找货       │  │ • 招工巡查       │
+│ • Redis  │  │ • 数据导入       │  │ • 找工人/客商    │  │ • 联系授权       │  │ • P1功能补充     │
+│ • 微信账号│  │ • 审核框架       │  │ • 名片审核       │  │ • 农资店铺       │  │ • 举报处理       │
+│ • Git仓库│  │ • 行情管理       │  │ • 待复核列表     │  │ • 短信配置       │  │                 │
+│          │  │ • 微信登录       │  │                 │  │                 │  │                 │
+│          │  │ • 小程序首页     │  │                 │  │                 │  │                 │
+│          │  │ • 安全基础设施   │  │                 │  │                 │  │                 │
+└──────────┘  └─────────────────┘  └─────────────────┘  └─────────────────┘  └─────────────────┘
+   验收:          验收:                验收:                验收:                验收:
+   环境就绪        能登录+看行情         能发招工+找工人       四端流程跑通          大屏+报表可用
+```
+
+| 阶段 | 名称 | 工期 | 目标 | 功能点数 |
+|------|------|------|------|---------|
+| 0 | 环境准备 | 0.5周 | 开发环境就绪 | - |
+| 一 | 基础设施与用户体系 | 3-4周 | 平台可用 | 20 |
+| 2a | 果农核心功能 | 3周 | 供给上线 | 14 |
+| 2b | 工人+客商+农资 | 2周 | 供需对接 | 13 |
+| 三 | 运营功能与统计 | 2周 | 运营闭环 | 14 |
+| **总计** | | **10.5-11.5周** | | **61** |
+
+### 工期调整说明(V1.1)
+
+| 阶段 | V1.0工期 | V1.1工期 | 调整原因 |
+|------|---------|---------|---------|
+| 阶段0 | 无 | 0.5周 | 新增:环境搭建不可省略 |
+| 阶段一 | 2-3周 | 3-4周 | 20个功能点后端需15-19人天,含环境搭建 |
+| 阶段2a | 2-3周 | 3周 | 视频上传5环节(OSS凭证/直传/回调/压缩/重试)复杂度高 |
+| 阶段2b | 2周 | 2周 | 可行,无需调整 |
+| 阶段三 | 1-2周 | 2周 | 数据大屏+报表导出+P1功能补充 |
+
+---
+
+## 阶段零:环境准备(0.5周)
+
+### 目标
+开发环境就绪,所有外部依赖到位,项目骨架可运行。
+
+### 任务清单
+
+| 序号 | 任务 | 负责 | 说明 |
+|------|------|------|------|
+| 1 | Spring Boot项目初始化 | 后端 | 基于CRRC多模块模式创建项目骨架,配置Gradle |
+| 2 | 数据库初始化 | 后端 | MySQL建库(crrc),执行全量建表SQL |
+| 3 | 阿里云OSS申请 | 运维 | 创建Bucket,配置访问策略,获取AccessKey |
+| 4 | 阿里云短信申请 | 运维 | 申请短信签名"洒渔用工",报备短信模板 |
+| 5 | Redis部署 | 运维 | 安装Redis,配置持久化 |
+| 6 | 微信小程序账号 | 产品 | 申请小程序AppID,配置服务器域名 |
+| 7 | Git仓库初始化 | 全员 | 创建远程仓库,初始化main分支,配置.gitignore |
+| 8 | 本地开发环境 | 全员 | JDK 8、Gradle、微信开发者工具、数据库客户端 |
+| 9 | CI/CD基础 | 运维 | 配置编译验证脚本(./gradlew compileJava) |
+
+### 验收标准
+- [ ] 项目骨架可编译通过(./gradlew compileJava零错误)
+- [ ] 数据库连接正常,全量表结构创建完成
+- [ ] OSS Bucket可访问,能上传/下载测试文件
+- [ ] 短信SDK可调用(发送测试短信成功)
+- [ ] Redis连接正常
+- [ ] 微信小程序开发者账号就绪
+- [ ] Git仓库可push/pull
+
+---
+
+## 阶段一:基础设施与用户体系
+
+### 目标
+管理员能录入数据,用户能登录并看到有价值的信息。
+
+### 功能清单
+
+#### 1.1 数据库(全量建表)
+
+一次性建好全部15张表,避免后续ALTER TABLE:
+
+| 序号 | 表名 | 说明 | 阶段一状态 |
+|------|------|------|-----------|
+| 1 | sys_user | 用户基础表 | 有数据(导入+登录) |
+| 2 | user_identity | 身份关联表 | 有数据(导入) |
+| 3 | grower_profile | 果农档案表 | 有数据(导入) |
+| 4 | worker_profile | 工人档案表 | 有数据(导入) |
+| 5 | buyer_profile | 客商档案表 | 有数据(导入) |
+| 6 | supplier_shop | 农资店铺表 | 有数据(导入) |
+| 7 | recruit_info | 招工信息表 | 空表(阶段2a使用) |
+| 8 | worker_apply | 工人报名表 | 空表(阶段2b使用) |
+| 9 | phone_unlock_record | 联系授权记录 | 空表(阶段2b使用) |
+| 10 | call_log | 拨号日志表 | 空表(阶段2a使用) |
+| 11 | sms_daily_limit | 短信限流表 | 空表(阶段2b使用) |
+| 12 | market_price | 今日行情表 | 有数据(行情配置) |
+| 13 | audit_log | 审核日志表 | 有数据(审核操作) |
+| 14 | operation_log | 操作日志表 | 有数据(登录/导入) |
+| 15 | complaint | 投诉表 | 空表(阶段2b使用) |
+
+#### 1.2 后台-系统管理
+
+| 功能 | 说明 |
+|------|------|
+| 角色管理 | 定义4种角色:超级管理员/录入员/审核员/运维,角色-权限绑定 |
+| 账号管理 | 管理员CRUD,分配角色,账号启用/禁用 |
+| 字典管理 | 苹果品种、工种类型、农资种类、行政区划(洒渔镇下辖村)的增删改查 |
+| 操作日志 | 记录登录/导入/审核等关键操作,只追加不修改 |
+
+#### 1.3 后台-数据导入
+
+| 功能 | 说明 |
+|------|------|
+| 模板下载 | 4类Excel模板:果农/工人/客商/农资 |
+| Excel上传 | 拖拽上传,前端预校验格式(.xlsx)和大小(≤10MB) |
+| 预览 | 展示总行数、有效行数、错误行数、重复行数;错误行红色高亮 |
+| 数据校验 | 手机号正则(1开头11位)、字段长度、必填项 |
+| 去重 | 手机号+身份类型唯一,重复标记,用户可选跳过/覆盖 |
+| 确认入库 | ≤100行同步,>100行异步+完成通知 |
+
+**字段映射(硬编码)**:
+```
+果农模板:姓名→name, 手机号/电话→phone, 品种→varieties, 产量→yield_amount, 地址→address
+工人模板:姓名→name, 手机号/电话→phone, 工种→skills, 报价→price
+客商模板:姓名/公司名→name, 手机号/电话→phone, 品种→varieties, 地址→address
+农资模板:店铺名→shop_name, 店主→owner_name, 种类→categories, 地址→address, 电话→phone
+```
+
+#### 1.4 后台-审核中心
+
+| 功能 | 说明 |
+|------|------|
+| 审核框架 | 审核列表+通过/驳回操作+驳回原因填写 |
+| 导入数据审核 | 导入的数据需审核确认后生效(状态:待审/通过/驳回) |
+| SLA提醒 | ≤24小时自动提醒审核员,48小时升级给超级管理员 |
+
+#### 1.5 后台-行情管理
+
+| 功能 | 说明 |
+|------|------|
+| 行情配置 | 按品种设置价格区间(最低价/最高价)+趋势(持平/涨价/降价) |
+| 行情列表 | 查看/编辑/删除行情记录 |
+
+#### 1.6 小程序-登录
+
+| 功能 | 说明 |
+|------|------|
+| 微信登录 | wx.login()→后端换openid+手机号→JWT token |
+| 身份路由 | 0个→提示联系村委会;1个→直接进入;N个→选择页 |
+| 身份选择 | 大卡片列表(≥120px高度),每个身份一张卡片 |
+| 兜底绑定 | 拒绝授权→弹窗引导→联系村委会管理员后台绑定 |
+
+#### 1.7 小程序-首页
+
+| 功能 | 说明 |
+|------|------|
+| 今日行情 | 展示品种+价格区间,涨价红/降价绿色块,更新时间 |
+| 金刚区 | 4个入口:找工人/找客商/买农资/发布需求(部分可灰态"即将开放") |
+
+#### 1.8 安全基础设施
+
+| 功能 | 说明 |
+|------|------|
+| 手机号加密 | AES加密存储,phone_hash(SHA256)唯一索引 |
+| 权限框架 | RBAC角色权限,/api/wx/*和/api/admin/*独立拦截器 |
+| 接口脱敏 | 手机号138****1234,姓名张** |
+| 操作日志 | 登录/导入/审核操作全量记录 |
+
+### 技术依赖链
+
+```
+数据库建表(全量15张)
+    │
+    ├── sys_user + user_identity ──→ 权限框架(RBAC+拦截器)
+    │                                │
+    │                                ├── 后台管理API(角色/账号/字典)
+    │                                │
+    │                                └── 微信登录+JWT ──→ 身份路由 ──→ 小程序首页
+    │
+    ├── 全量表结构 ──→ 数据导入(Excel上传/预览/校验/入库)
+    │                │
+    │                └── 审核框架(导入数据审核)
+    │
+    ├── market_price ──→ 行情管理(配置)──→ 小程序首页(行情展示)
+    │
+    └── audit_log + operation_log ──→ 操作日志记录
+```
+
+### 验收标准
+
+- [ ] 管理员能登录后台管理系统
+- [ ] 管理员能通过Excel导入4类用户数据(果农/工人/客商/农资)
+- [ ] 导入数据预览正确显示有效/错误/重复行
+- [ ] 导入数据经审核后生效
+- [ ] 管理员能配置今日行情(品种+价格区间+趋势)
+- [ ] 用户能微信登录,0/1/N个身份路由正确
+- [ ] 小程序首页展示今日行情(涨价红/降价绿色块)
+- [ ] 金刚区展示4个入口
+- [ ] 手机号数据库存储为密文
+- [ ] 接口返回手机号脱敏(138****1234)
+- [ ] 操作日志记录登录/导入/审核操作
+- [ ] 角色权限隔离:录入员不能审核,审核员不能导入
+
+### 测试重点
+
+| 测试类型 | 重点场景 |
+|---------|---------|
+| 登录 | 微信登录→0/1/N身份路由、拒绝授权兜底 |
+| 数据导入 | 空行/格式错误/重复/超大文件、预览准确性 |
+| 审核 | 通过/驳回操作、SLA提醒触发 |
+| 权限 | 不同角色访问隔离、越权访问拦截 |
+| 安全 | 手机号加密存储验证、接口脱敏验证 |
+
+---
+
+## 阶段2a:果农核心功能
+
+### 目标
+果农能完善名片、发布招工、找到工人和客商。
+
+### 功能清单
+
+#### 2a.1 小程序-果农名片
+
+| 功能 | 说明 |
+|------|------|
+| 信息维护 | 苹果品种(多选)、产量(斤)、预期价格(元/斤)、果园地址 |
+| 视频上传 | 前端直传OSS(后端申请凭证),≤50MB/MP4/MOV,前端清除EXIF,后端压缩720p/2Mbps/≤5分钟 |
+| 照片上传 | ≤9张,单张≤5MB,前端清除EXIF |
+| 审核状态 | 展示待审/已通过/被驳回(驳回显示原因) |
+
+**视频上传流程**:
+```
+前端选择视频 → 前端清除EXIF → 前端预校验(格式/大小)
+    → 调用后端获取OSS上传凭证
+    → 前端直传OSS
+    → 上传完成回调后端
+    → 后端记录URL + 异步压缩720p
+    → 更新审核状态为"待审"
+```
+
+#### 2a.2 小程序-招工发布
+
+| 功能 | 说明 |
+|------|------|
+| 发布表单 | 工种(多选)、价格、价格单位(元/天|元/个)、人数、天数、工作地点、备注 |
+| 语音输入 | 备注支持语音转文字 |
+| 发布规则 | 免审核直接发布 |
+| 关键词标记 | 敏感关键词自动标记keyword_flag=1,进入待复核列表 |
+| 招工管理 | 下架(status=0)、重新编辑、查看历史记录 |
+
+**敏感词库**:色情/赌博/政治等明确违规词,不包含业务词汇
+
+#### 2a.3 小程序-找工人
+
+| 功能 | 说明 |
+|------|------|
+| 工人列表 | 按工种筛选,展示姓名/工种标签/报价/距离/状态 |
+| 距离计算 | 果园地址经纬度→Haversine公式 |
+| 一键拨号 | 调用/api/wx/call/phone,记录call_log |
+
+#### 2a.4 小程序-找客商
+
+| 功能 | 说明 |
+|------|------|
+| 客商列表 | 展示姓名/公司名、收购品种、价格、数量、地址 |
+| 一键拨号 | 调用/api/wx/call/phone,记录call_log |
+
+#### 2a.5 后台-审核
+
+| 功能 | 说明 |
+|------|------|
+| 名片审核 | 审核果农视频/照片,通过/驳回+原因 |
+| 待复核列表 | keyword_flag=1的招工信息,人工审核 |
+| SLA提醒 | ≤24h提醒,48h升级 |
+
+#### 2a.6 安全
+
+| 功能 | 说明 |
+|------|------|
+| 视频安全 | EXIF清除、格式校验(MP4/MOV)、大小限制(≤50MB) |
+| 拨号日志 | call_log表记录:拨号方、被拨方、时间 |
+
+### 技术依赖链
+
+```
+阶段一(用户体系+数据导入)
+    │
+    ├── grower_profile(已有导入数据)
+    │   ├── 名片信息维护 → 更新grower_profile
+    │   └── 视频/照片上传 → OSS凭证 → 直传OSS → 回调记录URL → 异步压缩
+    │
+    ├── recruit_info(招工表)
+    │   ├── 招工发布 → INSERT recruit_info(keyword_flag自动检测)
+    │   └── 招工管理 → UPDATE status/编辑
+    │
+    ├── worker_profile(已有导入数据)
+    │   └── 找工人列表 → 查询worker_profile(工种筛选+经纬度排序)
+    │
+    ├── buyer_profile(已有导入数据)
+    │   └── 找客商列表 → 查询buyer_profile
+    │
+    ├── call_log(拨号日志)
+    │   └── 一键拨号 → INSERT call_log → 返回电话号码
+    │
+    └── 审核框架(阶段一已有)
+        ├── 名片审核 → 审核grower_profile.audit_status
+        └── 待复核 → 审核recruit_info.keyword_flag
+```
+
+### 验收标准
+
+- [ ] 果农能编辑名片信息(品种/产量/价格/地址)
+- [ ] 果农能上传视频到OSS,视频压缩至720p
+- [ ] 果农能上传照片(≤9张/张≤5MB)
+- [ ] 名片提交后进入待审核状态
+- [ ] 审核员能审核名片(通过/驳回+原因)
+- [ ] 果农能发布招工信息(免审核直接发布)
+- [ ] 敏感关键词自动标记,进入待复核列表
+- [ ] 果农能下架/编辑招工
+- [ ] 果农能按工种筛选工人列表
+- [ ] 果农能一键拨号联系工人(记录call_log)
+- [ ] 果农能查看客商列表并拨号
+- [ ] 视频上传前EXIF已清除
+- [ ] 拨号日志完整记录
+
+### 测试重点
+
+| 测试类型 | 重点场景 |
+|---------|---------|
+| 视频上传 | 50MB边界、格式异常、网络中断、EXIF清除验证 |
+| 照片上传 | 9张边界、大小限制、格式校验 |
+| 招工发布 | 敏感词标记、免审核发布、下架/编辑 |
+| 找工人 | 工种筛选、距离排序准确性、拨号日志 |
+| 审核 | 名片通过/驳回、待复核处理、SLA提醒 |
+
+---
+
+## 阶段2b:工人+客商+农资功能
+
+### 目标
+四端核心流程跑通——工人能报名、客商能找货、农资能展示。
+
+### 功能清单
+
+#### 2b.1 小程序-工人找活
+
+| 功能 | 说明 |
+|------|------|
+| 推荐列表 | 工种匹配+距离排序,展示工种/价格/天数/人数/果农姓名/距离 |
+| 报名 | 点击→短信通知果农→worker_apply记录→自动变为"忙碌" |
+| 防骚扰 | sms_daily_limit表,同一工人每天对同一果农最多1条(自然日) |
+
+**短信模板**:`【洒渔用工】[工人姓名]([工种])对您的招工感兴趣,联系电话:[电话]`
+
+#### 2b.2 小程序-工人状态
+
+| 功能 | 说明 |
+|------|------|
+| 状态切换 | 空闲/工作中,手动切换 |
+| 自动恢复 | 3天无操作自动恢复"空闲"(last_active_time判断,定时任务每天检查) |
+| 报名联动 | 报名后自动变为"忙碌" |
+| 信用机制 | complaint_count字段:1次警告,2次限制24h,3次锁定需管理员解除 |
+
+#### 2b.3 小程序-客商找货
+
+| 功能 | 说明 |
+|------|------|
+| 货源筛选 | 按品种/价格区间/距离筛选果农货源 |
+| 货源详情 | 种植面积、规格(糖度/果径)、视频/照片 |
+| 联系授权 | 勾选批次→解锁电话→phone_unlock_record(7天有效) |
+| 一键拨号 | 解锁后调用拨号接口(记录call_log) |
+
+**联系授权流程**:
+```
+客商浏览货源详情 → 勾选具体批次(如"红富士 20000斤")
+    → 后端检查是否已有有效解锁记录
+    → 无记录/已过期 → INSERT phone_unlock_record(expire_time=now+7天)
+    → 返回果农电话
+    → 客商一键拨号 → INSERT call_log
+```
+
+#### 2b.4 小程序-农资店铺
+
+| 功能 | 说明 |
+|------|------|
+| 信息维护 | 店铺名称/店主/主营种类/地址/电话 |
+| 保存提交 | 更新supplier_shop表 |
+| 一键拨号 | 展示电话,点击拨号 |
+
+#### 2b.5 后台-短信配置
+
+| 功能 | 说明 |
+|------|------|
+| 签名管理 | 短信签名配置(如"洒渔用工") |
+| 模板管理 | 短信模板配置(报名通知模板等) |
+
+#### 2b.6 安全
+
+| 功能 | 说明 |
+|------|------|
+| 联系授权 | phone_unlock_record表+7天过期控制 |
+| 短信限流 | sms_daily_limit表+自然日计数 |
+| 短信合规 | 签名报备+模板报备+日志全量记录 |
+
+### 技术依赖链
+
+```
+阶段2a(果农数据已有)
+    │
+    ├── recruit_info(已有招工数据)
+    │   └── 工人找活 → 查询recruit_info(工种匹配+距离排序)
+    │
+    ├── worker_apply(报名表)
+    │   ├── 报名 → INSERT worker_apply → 短信通知果农
+    │   └── 防骚扰 → 查询sms_daily_limit
+    │
+    ├── worker_profile(已有工人数据)
+    │   ├── 状态切换 → UPDATE status
+    │   └── 信用机制 → UPDATE complaint_count
+    │
+    ├── grower_profile(已有果农数据)
+    │   └── 客商找货 → 查询grower_profile(品种/价格/距离筛选)
+    │
+    ├── phone_unlock_record(联系授权)
+    │   └── 解锁电话 → INSERT/查询有效期
+    │
+    ├── call_log(拨号日志)
+    │   └── 客商拨号 → INSERT call_log
+    │
+    └── sms_daily_limit(短信限流)
+        └── 报名短信 → INSERT/UPDATE计数
+```
+
+### 验收标准
+
+- [ ] 工人能看到推荐的招工列表(工种匹配+距离排序)
+- [ ] 工人能报名,果农收到短信通知
+- [ ] 同一工人每天对同一果农最多1条短信
+- [ ] 工人能切换状态(空闲/工作中)
+- [ ] 3天无操作自动恢复空闲
+- [ ] 工人被投诉3次后状态锁定
+- [ ] 客商能按品种/价格/距离筛选货源
+- [ ] 客商能查看货源详情(含视频/照片)
+- [ ] 客商勾选批次后解锁果农电话(7天有效)
+- [ ] 客商能一键拨号(记录call_log)
+- [ ] 农资商能维护店铺信息
+- [ ] 解锁记录完整存储
+- [ ] 短信日志全量记录
+- [ ] 短信签名和模板可配置
+
+### 测试重点
+
+| 测试类型 | 重点场景 |
+|---------|---------|
+| 报名 | 短信发送成功、防骚扰限流、跨天重置 |
+| 状态 | 手动切换、3天自动恢复、报名联动忙碌 |
+| 信用 | 投诉1/2/3次递进处罚、管理员解除 |
+| 联系授权 | 解锁成功、7天过期、重新勾选 |
+| 短信 | 签名/模板配置、发送日志、成本统计 |
+| 边界 | 多身份用户数据隔离、并发报名 |
+
+---
+
+## 阶段三:运营功能与统计
+
+### 目标
+政府管理部门能监控运营、统计数据、管理平台。
+
+### 功能清单
+
+#### 3.1 后台-数据大屏
+
+| 功能 | 优先级 | 数据来源 | 说明 |
+|------|--------|---------|------|
+| 宏观概览 | P0 | sys_user | 注册用户总数、今日活跃(last_active_time) |
+| 供需比 | P0 | recruit_info/worker_profile | 招工数/空闲工人数 |
+| 撮合指标 | P0 | call_log/sms_daily_limit | 电话拨打次数、短信发送条数 |
+| 有效撮合率 | P0 | worker_apply | 已联系/总报名 |
+| 流量指标 | P1 | - | PV/UV、名片浏览量(需新增统计表) |
+| 产业地图 | P1 | grower_profile | 果农分布热力图、客商来源TOP10 |
+
+**技术方案**:定时任务每5分钟刷新→Redis缓存
+
+#### 3.2 后台-报表导出
+
+| 功能 | 说明 |
+|------|------|
+| 用户列表导出 | 按条件筛选→导出Excel(手机号脱敏) |
+| 撮合记录导出 | 拨号/短信/报名记录→Excel |
+| 操作日志导出 | 操作日志→Excel |
+| 安全 | 导出需二次确认+操作日志记录 |
+
+#### 3.3 后台-管理功能
+
+| 功能 | 优先级 | 说明 |
+|------|--------|------|
+| 招工巡查 | P1 | 查看所有招工,强制下架违规内容 |
+| 用户信息修正 | P1 | 管理员修改用户基础信息 |
+| 短信配置 | P1 | 签名+模板管理(如未在阶段2b完成) |
+| 举报处理 | P2 | 处理用户投诉(虚假招工/骚扰电话) |
+
+#### 3.4 小程序-P1功能补充
+
+| 功能 | 优先级 | 说明 |
+|------|--------|------|
+| 买农资 | P1 | 分类筛选+店铺列表+一键拨号 |
+| 工作记录 | P1 | 工人报名历史+联系果农 |
+| 我的信息 | P1 | 工人展示姓名/技能/电话 |
+| 我的需求 | P1 | 客商收购偏好维护 |
+| 关于我们 | P2 | 平台介绍、联系方式、免责声明 |
+
+### 验收标准
+
+- [ ] 数据大屏展示注册用户总数、今日活跃、供需比
+- [ ] 数据大屏展示电话拨打次数、短信发送条数
+- [ ] 数据大屏每5分钟自动刷新
+- [ ] 管理员能导出用户列表/撮合记录为Excel(脱敏)
+- [ ] 导出操作有二次确认和日志记录
+- [ ] 管理员能查看所有招工并强制下架
+- [ ] 管理员能修改用户基础信息
+- [ ] 举报处理流程可用
+- [ ] 果农能按分类筛选农资店铺
+- [ ] 工人能查看报名历史
+- [ ] 客商能维护收购偏好
+
+### 测试重点
+
+| 测试类型 | 重点场景 |
+|---------|---------|
+| 大屏 | 统计数据准确性、定时刷新、Redis缓存一致性 |
+| 报表 | 导出数据完整性、脱敏正确性、大文件导出 |
+| 巡查 | 强制下架生效、列表筛选 |
+| P1功能 | 买农资筛选、工作记录、收购偏好 |
+
+---
+
+## 跨阶段注意事项
+
+### 数据兼容性
+- 阶段一全量建表,后续阶段只做INSERT/UPDATE,不做ALTER TABLE
+- 阶段一导入的数据在阶段二/三可直接使用
+- 预留字段(如supplier_shop.has_online_order)后续扩展时不需改表
+
+### 安全基线
+- 阶段一建立的安全基础设施(加密/脱敏/权限/日志)贯穿所有阶段
+- 每个阶段新增的接口必须遵循权限框架
+- 每个阶段新增的敏感操作必须记录日志
+
+### 测试策略
+- 每个阶段结束前预留2-3天用于测试和修复
+- 阶段二/三的测试需回归阶段一的功能(特别是登录和权限)
+- 自动化测试从阶段一开始积累,后续阶段持续补充
+
+### UI/UX设计
+- UI设计需在阶段一启动,与后端开发并行
+- 适老化设计规范(18px/88px按钮/高对比度)贯穿所有页面
+- 阶段一的金刚区灰态入口在阶段二/三逐步开放
+
+---
+
+## 风险与缓解措施
+
+### 阶段一风险
+
+| 风险 | 影响 | 概率 | 缓解措施 |
+|------|------|------|----------|
+| 20个功能点工期不足 | 延期1-2周 | 高 | 已调整为3-4周;优先完成登录+导入+行情,审核框架可延到阶段2a初 |
+| Excel导入格式多样性 | 字段映射不全 | 中 | MVP硬编码覆盖4种标准模板;非标格式人工处理 |
+| 微信手机号授权拒绝 | 用户无法注册 | 中 | 后台手动绑定兜底;阶段一即实现 |
+| Spring Boot 1.5.9兼容性 | 部分SDK版本冲突 | 低 | 阶段零验证所有SDK兼容性 |
+
+### 阶段2a风险
+
+| 风险 | 影响 | 概率 | 缓解措施 |
+|------|------|------|----------|
+| 视频上传链路复杂 | 延期3-5天 | 高 | 拆分5步逐步验证:凭证→直传→回调→压缩→展示;压缩失败有重试机制 |
+| OSS回调不可靠 | 视频URL未记录 | 中 | 后端定时扫描OSS Bucket,补录遗漏的视频记录 |
+| EXIF清除不彻底 | 位置信息泄露 | 低 | 前端清除+后端二次检查双保险 |
+| 敏感词库不完善 | 误杀或漏杀 | 中 | 初始词库只含明确违规词;通过待复核列表持续优化 |
+
+### 阶段2b风险
+
+| 风险 | 影响 | 概率 | 缓解措施 |
+|------|------|------|----------|
+| 短信发送延迟/失败 | 果农收不到通知 | 中 | 短信发送异步化,失败重试3次;记录发送状态 |
+| 短信成本超预算 | 运营成本增加 | 低 | sms_daily_limit限流;月度预算500元告警 |
+| 3天自动恢复误判 | 工人状态不准确 | 低 | 定时任务每天凌晨执行,日志记录恢复操作 |
+| 联系授权并发问题 | 重复解锁记录 | 低 | 数据库唯一索引(buyer_identity_id+grower_identity_id+batch_id) |
+
+### 阶段三风险
+
+| 风险 | 影响 | 概率 | 缓解措施 |
+|------|------|------|----------|
+| 统计数据不准确 | 大屏数据可信度低 | 中 | 统计SQL需与业务SQL对齐;提供数据核对入口 |
+| 大文件导出超时 | 报表导出失败 | 中 | >1000行异步导出+邮件通知下载 |
+| Redis缓存不一致 | 大屏数据延迟 | 低 | 5分钟刷新周期可接受;提供手动刷新按钮 |
+
+---
+
+## 各阶段工作量明细
+
+### 阶段零(0.5周 = 2.5天)
+
+| 任务 | 后端 | 前端 | 运维 |
+|------|------|------|------|
+| 项目骨架 | 1天 | - | - |
+| 数据库建表 | 0.5天 | - | - |
+| OSS/短信/Redis申请 | - | - | 1天 |
+| 微信账号+Git仓库 | - | 0.5天 | 0.5天 |
+| 本地环境+CI/CD | 0.5天 | 0.5天 | 0.5天 |
+
+### 阶段一(3-4周 = 15-20天)
+
+| 任务 | 后端 | 前端 | 说明 |
+|------|------|------|------|
+| 系统管理(角色/账号/字典/日志) | 4天 | 3天 | 后台管理基础 |
+| 数据导入(上传/预览/校验/去重/异步) | 4天 | 3天 | 核心功能,复杂度高 |
+| 审核框架(列表/操作/SLA) | 2天 | 2天 | 可复用框架 |
+| 行情管理 | 1天 | 1天 | 简单CRUD |
+| 微信登录+身份路由 | 3天 | 2天 | 微信API对接 |
+| 小程序首页(行情+金刚区) | 1天 | 2天 | 首页展示 |
+| 安全(加密/脱敏/拦截器) | 3天 | - | 贯穿全阶段 |
+| 联调+测试 | 2天 | 2天 | 预留缓冲 |
+
+### 阶段2a(3周 = 15天)
+
+| 任务 | 后端 | 前端 | 说明 |
+|------|------|------|------|
+| 果农名片(信息维护) | 1天 | 2天 | CRUD |
+| 视频上传(OSS凭证/直传/回调/压缩) | 4天 | 3天 | 复杂度最高 |
+| 照片上传 | 1天 | 1天 | 相对简单 |
+| 招工发布+管理 | 2天 | 2天 | 表单+列表 |
+| 找工人列表 | 1天 | 2天 | 筛选+距离排序 |
+| 找客商列表 | 1天 | 1天 | 简单列表 |
+| 名片审核+待复核 | 1天 | 1天 | 复用审核框架 |
+| 联调+测试 | 2天 | 2天 | 含视频上传专项测试 |
+
+### 阶段2b(2周 = 10天)
+
+| 任务 | 后端 | 前端 | 说明 |
+|------|------|------|------|
+| 工人找活推荐 | 2天 | 2天 | 匹配+排序 |
+| 报名+短信通知 | 2天 | 1天 | 短信API对接 |
+| 状态管理+信用机制 | 2天 | 1天 | 定时任务+状态机 |
+| 客商找货+联系授权 | 2天 | 2天 | 授权逻辑 |
+| 农资店铺 | 0.5天 | 0.5天 | 简单CRUD |
+| 短信配置 | 0.5天 | 0.5天 | 配置管理 |
+| 联调+测试 | 1天 | 1天 | 四端流程联调 |
+
+### 阶段三(2周 = 10天)
+
+| 任务 | 后端 | 前端 | 说明 |
+|------|------|------|------|
+| 数据大屏(核心指标) | 3天 | 3天 | 统计+Redis+UI |
+| 数据大屏(扩展指标) | 1天 | 2天 | 流量+产业地图 |
+| 报表导出 | 2天 | 1天 | Excel生成+脱敏 |
+| 招工巡查+用户修正 | 1天 | 1天 | 复用列表组件 |
+| P1功能补充 | 1天 | 2天 | 买农资/工作记录/收购偏好 |
+| 联调+测试 | 1天 | 1天 | 回归测试 |

+ 475 - 0
docs/requirements-discussion.md

@@ -0,0 +1,475 @@
+# 需求研讨会议记录 V2
+
+## 项目:洒渔镇苹果产业供需对接平台
+
+## 参与角色(6人,每人1票)
+
+| 角色 | 代号 | 核心关注 |
+|------|------|---------|
+| 产品经理 | PM | 需求完整性、业务合理性、用户价值、优先级 |
+| 架构师 | ARCH | 技术可行性、系统架构、可扩展性、技术选型 |
+| 用户体验师 | UX | 适老化、交互流程、用户痛点、操作效率 |
+| 后端开发 | BE | 实现复杂度、性能风险、开发成本、可维护性 |
+| 测试工程师 | QA | 可测试性、边界场景、数据一致性、回归风险 |
+| 安全专家 | SEC | 数据安全、隐私合规、权限控制、攻击面 |
+
+## 投票规则
+- 每人1票(支持/反对/弃权)
+- **通过门槛:≥5票支持**(6人中至少5人同意,>n/2+1=4)
+- 弃权不计入有效票,但弃权者须说明顾虑
+- 未通过的议题需修改方案后重新投票
+
+## 功能清单原文摘要(共45个功能点)
+
+**小程序端**:公共基础(登录/身份路由)、果农端(行情/找工人/招工/找客商/农资/名片)、工人端(找活/报名/状态)、客商端(找货/联系授权)、农资端(店铺)
+**后台管理端**:系统管理、数据导入、审核中心、数据大屏
+**非功能性**:适老化、性能、安全、兼容性
+
+---
+
+## 议题一:用户身份与登录体系
+
+### 问题
+1. 微信登录+手机号唯一标识是否可靠?
+2. 多身份数据模型设计?
+3. 身份路由匹配逻辑?
+
+### 第一轮发言
+
+**PM**:微信登录+手机号是最佳方案。洒渔镇果农多为中老年人,微信是他们唯一会用的APP。手机号作为唯一标识,后台Excel导入也用手机号做主键,保持一致性。支持。
+
+**ARCH**:同意PM。数据模型建议`sys_user`存基础信息(openid/phone/nickname/avatar),`user_identity`存身份关联(user_id/identity_type/status)。关联表比单表多角色字段灵活得多——一人多职在农村很常见,关联表可以无限扩展身份类型。
+
+**UX**:支持。微信一键登录对中老年用户最友好,无需记密码。身份选择页用大卡片+大字体展示,每个身份一张卡片,点击进入对应工作台。建议卡片尺寸≥120px高度,方便手指点击。
+
+**BE**:方案本身没问题,但我有一个必须解决的问题:微信手机号获取需要用户主动授权。如果用户拒绝授权怎么办?需要兜底方案。我建议:拒绝后弹窗提示"需要手机号才能使用",同时提供"联系村委会"入口,管理员后台手动绑定。
+
+**QA**:同意BE的顾虑。补充测试角度:多身份场景下的数据隔离必须验证——果农发布的招工信息,切换到工人身份后不应可见。另外,手机号格式校验需要覆盖:正常号、虚拟号、国际号(虽然概率低)。
+
+**SEC**:支持方案,但有硬性要求:手机号必须AES加密存储,数据库不能存明文。查询时用phone_hash(SHA256)做精确匹配,接口返回时脱敏(138****1234)。这是合规要求,不能妥协。
+
+### 第二轮交锋
+
+**PM**:SEC说的加密存储会影响查询性能吗?
+
+**ARCH**:不会。phone_hash建唯一索引,查询走索引,性能和明文查询一样。加密存储只是增加了一层安全,不影响功能。
+
+**BE**:那我改为支持。但补充一点:手机号变更(换号)场景,管理员后台可修改,不需要用户自助——低频操作,管理员处理即可。
+
+**QA**:数据隔离的问题,ARCH能确认技术方案吗?
+
+**ARCH**:确认。所有业务表都带`user_identity_id`字段,查询时强制加`WHERE user_identity_id = ?`条件,由拦截器统一处理。果农身份查不到工人数据,反之亦然。
+
+**QA**:明确了,改为支持。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 业务合理,降低门槛 |
+| ARCH | ✅ 支持 | 关联表模型可扩展,phone_hash索引性能无损 |
+| UX | ✅ 支持 | 用户体验最优,大卡片交互友好 |
+| BE | ✅ 支持 | 兜底方案(管理员绑定)可接受 |
+| QA | ✅ 支持 | 数据隔离方案明确,边界case可控 |
+| SEC | ✅ 支持 | AES加密+phone_hash查询已确认 |
+
+**结果:6/6 ≥ 5,通过 ✅**
+
+### 决议
+1. 微信登录+手机号唯一标识,拒绝授权时引导联系村委会后台绑定
+2. `sys_user`(基础信息)+ `user_identity`(身份关联),支持一人多职
+3. 手机号AES加密存储,phone_hash(SHA256)建唯一索引用于查询
+4. 身份路由:手机号精确匹配→0个提示联系村委会,1个直接进入,N个展示选择页
+5. 数据隔离:所有业务表带`user_identity_id`,拦截器强制加条件
+
+---
+
+## 议题二:果农端核心功能方案
+
+### 问题
+1. "今日行情"数据来源和更新频率?
+2. "找工人"距离计算方案?
+3. "我的名片"视频上传技术方案?
+4. 招工信息是否需要审核?
+
+### 第一轮发言
+
+**PM**:今日行情由政府后台手动配置,权威可控,每日更新。招工信息建议免审核直接发布——果农发布招工是高频操作,审核会增加等待时间,降低使用意愿。通过举报机制事后管控。
+
+**BE**:反对免审核。完全免审核会导致虚假招工泛滥——发布虚假高薪信息吸引工人电话骚扰,或者发布不当内容。至少做关键词自动过滤,敏感词拦截,非敏感词放行。开发成本不高,一个正则匹配就行。
+
+**PM**:关键词过滤误杀率怎么控制?比如"高价急招"可能被误判为敏感词?
+
+**BE**:敏感词库只包含明确违规词(色情/赌博/政治等),不包含业务词汇。"高价急招"不会被拦截。拦截后不直接拒绝,而是标记为"待复核",人工审核。这样既不误杀,又能拦截明确违规内容。
+
+**UX**:BE的方案比完全免审核更好。果农发布后立即可见(不等待审核),但违规内容会被标记后人工复核。体验上和免审核一样流畅,但安全性更好。支持折中方案。
+
+**ARCH**:距离计算我建议用地址而非GPS。农村地区GPS信号不稳定,果农也不习惯开定位。方案:果农填写果园地址(精确到村),后台首次录入时地理编码获取经纬度存储,查询时用Haversine公式计算距离。简单可靠。
+
+**BE**:同意ARCH。经纬度只需计算一次,存储后查询性能好。GPS方案需要持续获取位置,复杂度高且不稳定。
+
+**SEC**:视频上传有安全风险。建议:后端中转(不直传OSS,便于统一管控),限制≤50MB/MP4/MOV,后端压缩至720p/2Mbps,清除EXIF元数据(防止位置泄露)。照片限制:单次≤9张,单张≤5MB。
+
+**QA**:SEC说的EXIF清除很重要。补充测试边界:超大文件上传(正好50MB/超过50MB)、格式异常(伪装扩展名)、网络中断。建议上传前前端预校验格式和大小。
+
+### 第二轮交锋
+
+**PM**:BE的关键词标记+人工复核方案可以接受。那审核员的工作量怎么控制?
+
+**ARCH**:标记的内容不阻塞发布,审核员每天定时处理待复核列表即可。如果量大可以按优先级排序——包含多个敏感词的优先审核。
+
+**BE**:同意。另外建议招工信息支持下架和重新编辑,果农用工结束后可以关闭招工,避免信息过期。
+
+**PM**:这个功能清单里有(P1),纳入。大家对今日行情的更新频率有异议吗?
+
+**UX**:建议行情页面用醒目色块——红色涨价、绿色降价,中老年用户一看就懂。另外建议展示"更新时间",让用户知道信息的新鲜度。
+
+**PM**:好建议,采纳。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 折中方案平衡效率和安全 |
+| ARCH | ✅ 支持 | 地址+经纬度方案简单可靠 |
+| UX | ✅ 支持 | 用户体验友好,色块标识直观 |
+| BE | ✅ 支持 | 关键词标记方案可接受,开发成本可控 |
+| QA | ✅ 支持 | 边界case明确,EXIF清除已确认 |
+| SEC | ✅ 支持 | 视频安全措施已确认 |
+
+**结果:6/6 ≥ 5,通过 ✅**
+
+### 决议
+1. **今日行情**:政府后台手动配置,按品种设置价格区间,每日更新,涨价红/降价绿色块,展示更新时间
+2. **距离计算**:果园地址→地理编码→经纬度存储→Haversine公式计算
+3. **视频上传**:后端中转,≤50MB/MP4/MOV,压缩720p/2Mbps,清除EXIF;照片≤9张/张≤5MB
+4. **招工发布**:免审核直接发布,敏感关键词自动标记+待复核列表,后台保留强制下架
+5. **招工管理**:支持下架、重新编辑、查看历史记录
+
+---
+
+## 议题三:工人端核心功能方案
+
+### 问题
+1. "智能推荐"算法方案?
+2. 报名通知方案?
+3. 工人状态审核机制?
+4. 防骚扰限制合理性?
+
+### 第一轮发言
+
+**PM**:智能推荐用技能+距离简单匹配,先跑起来再迭代。报名用短信通知,最直接。工人状态需要审核,防止虚假空闲状态。每天1条防骚扰限制合理。
+
+**BE**:反对状态审核。工人状态变更是高频操作(每天上下工),审核会严重增加操作门槛和后台工作量。建议:工人手动切换状态,3天无操作自动恢复"空闲"。报名后自动变为"忙碌"。这样既保证信息时效性,又不需要人工审核。
+
+**PM**:不审核的话,工人故意标"空闲"来获取更多推荐怎么办?
+
+**BE**:这种行为收益很低——工人标空闲但实际忙碌,接到果农电话后无法响应,果农会投诉,多次投诉后工人信用降低,推荐权重下降。不需要审核,用信用机制约束。
+
+**ARCH**:同意BE。信用机制比审核更有效且更简单。建议:工人被投诉3次以上,状态自动变为"忙碌"且不可手动切换,需联系管理员解除。
+
+**QA**:防骚扰限制的计数逻辑需要明确:按自然日(00:00-23:59)还是24小时?跨天怎么算?同一工人多身份(既是工人又是果农)场景?
+
+**PM**:按自然日计,实现简单。多身份场景下,工人身份和果农身份独立计数——工人身份报名时消耗工人身份的配额。
+
+**SEC**:短信内容需要合规。建议模板:"【洒渔用工】[工人姓名]([工种])对您的招工感兴趣,联系电话:[电话]"。电话不能脱敏——果农需要看到工人才能联系,这是核心功能。短信签名需提前报备。
+
+**UX**:关于智能推荐,建议MVP用技能+距离,后续迭代加入"确认率"权重——果农确认用工的工人优先推荐。另外工人首页卡片设计要大字大按钮,工种标签用醒目颜色。
+
+### 第二轮交锋
+
+**PM**:BE的信用机制方案比审核好,我改为支持。但信用机制的细节需要定义。
+
+**ARCH**:建议:被投诉1次→警告,2次→限制报名24小时,3次→状态锁定需管理员解除。投诉由果农发起,审核员判定。
+
+**BE**:同意ARCH。开发成本低——一个`complaint_count`字段+定时任务检查即可。
+
+**QA**:3天自动恢复"空闲"的定义需要明确:是3天没打开小程序,还是3天没切换状态?
+
+**BE**:建议定义为3天没有任何操作(包括打开、报名、切换状态),通过`last_active_time`字段判断。用户每次操作更新该字段,定时任务每天检查一次。
+
+**PM**:方案成熟了,投票。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 信用机制比审核更合理 |
+| ARCH | ✅ 支持 | 技术简单,信用机制可扩展 |
+| UX | ✅ 支持 | 减少操作摩擦,用户体验好 |
+| BE | ✅ 支持 | 自动机制替代审核,开发成本低 |
+| QA | ✅ 支持 | 边界case已明确 |
+| SEC | ✅ 支持 | 短信合规已确认 |
+
+**结果:6/6 ≥ 5,通过 ✅**
+
+### 决议
+1. **智能推荐**:MVP工种匹配+距离排序,后续迭代加入确认率权重
+2. **报名通知**:阿里云短信API,模板"【洒渔用工】[工人姓名]([工种])对您的招工感兴趣,联系电话:[电话]"
+3. **状态管理**:手动切换+3天无操作自动恢复"空闲"(last_active_time判断),报名后自动"忙碌"
+4. **信用机制**:投诉1次警告,2次限制24小时,3次锁定需管理员解除
+5. **防骚扰**:同一工人每天对同一果农最多1条短信,自然日计,短信日志全量记录
+6. **短信预算**:月均500元/约12500条
+
+---
+
+## 议题四:客商端与农资端方案
+
+### 问题
+1. "联系授权"(勾选批次才解锁电话)是否合理?
+2. 客商和果农信息匹配方向?
+3. 农资端是否需要在线下单?
+
+### 第一轮发言
+
+**PM**:联系授权是核心差异化功能。客商必须勾选具体苹果批次才能看到果农电话,保护果农隐私,同时记录客商偏好。信息匹配单向(客商找果农),农资端暂不做在线下单,MVP先跑通信息展示。
+
+**SEC**:强烈支持联系授权。但解锁状态必须设有效期——建议7天。永久解锁会导致信息泄露后长期有效,果农无法控制自己的联系方式被谁长期持有。7天后需重新勾选,也给果农"被关注"的感觉。
+
+**BE**:同意SEC。解锁记录需要存储:客商ID、果农ID、批次ID、解锁时间、过期时间。查询时判断是否在有效期内。另外建议:同一客商对同一果农的解锁次数需要记录,防止反复骚扰。
+
+**UX**:农资端功能确实太简单。但同意PM,MVP先做信息展示。不过建议预留商品数据模型,后续扩展在线下单时不用重构数据库。
+
+**ARCH**:同意UX。`supplier_shop`表预留`goods`相关字段,如`has_online_order`标记位。数据模型兼容性比功能扩展更重要。
+
+**QA**:联系授权的测试重点:勾选后解锁状态是否持久、过期后是否自动锁定、同一客商多次勾选同一果农是否重复计数、解锁记录的查询准确性。
+
+### 第二轮交锋
+
+**PM**:大家对单向匹配有异议吗?是否需要双向(果农也能找客商)?
+
+**ARCH**:单向匹配实现简单,双向增加复杂度且需求不明确。果农端已经有"找客商"入口,展示客商列表即可,不需要算法匹配。MVP单向,后续根据用户反馈决定。
+
+**UX**:同意单向。果农"找客商"是浏览客商列表,客商"找货"是筛选果农货源,两者交互模式不同,不需要统一匹配算法。
+
+**BE**:农资端不做下单,但建议店铺信息支持"一键拨号"——农资商的核心诉求是被联系,电话是最直接的方式。
+
+**PM**:功能清单里已有联系电话展示,一键拨号是小程序标准能力,纳入。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 业务合理,保护隐私 |
+| ARCH | ✅ 支持 | 技术简单,数据模型预留扩展 |
+| UX | ✅ 支持 | 流程清晰,一键拨号已纳入 |
+| BE | ✅ 支持 | 解锁记录存储方案明确 |
+| QA | ✅ 支持 | 测试重点已明确 |
+| SEC | ✅ 支持 | 7天有效期方案已确认 |
+
+**结果:6/6 ≥ 5,通过 ✅**
+
+### 决议
+1. **联系授权**:客商勾选苹果批次→解锁果农电话,有效期7天,过期需重新勾选
+2. **解锁记录**:客商ID、果农ID、批次ID、解锁时间、过期时间,全量存储
+3. **信息匹配**:单向(客商→果农),MVP不做双向
+4. **农资端**:MVP仅做店铺信息展示+一键拨号,`supplier_shop`表预留`goods`字段
+5. **客商偏好**:支持维护收购品种/价格区间/总量/标准
+
+---
+
+## 议题五:后台管理与数据导入方案
+
+### 问题
+1. Excel字段映射方案?
+2. 大批量导入处理方式?
+3. 审核流程设计?
+4. 数据大屏技术方案?
+
+### 第一轮发言
+
+**PM**:字段映射建议可配置方案,不同村委提供的Excel格式可能不同。审核单级即可。数据大屏定时刷新。
+
+**BE**:反对MVP做可配置映射。开发成本高,且当前需求明确——就4种模板(果农/工人/客商/农资),字段固定。建议MVP硬编码映射(手机号/电话→phone,姓名→name等),后续迭代为可配置。硬编码半天就能做完,可配置至少需要3天。
+
+**PM**:BE说得有道理。4种模板的字段是固定的,硬编码够用。改为支持硬编码。
+
+**ARCH**:大批量导入(>1000行)需要异步处理,否则前端会超时。建议:≤100行同步导入,>100行异步队列处理,完成后通知。异步用Spring的`@Async`或简单线程池即可,不需要引入MQ。
+
+**QA**:导入的边界case必须覆盖:空行跳过、手机号格式校验、重复数据去重(按手机号+身份类型)、错误行高亮提示。建议导入前先预览,展示:总行数、有效行数、错误行数、重复行数,用户确认后再入库。
+
+**UX**:同意QA的预览方案。预览页面用表格展示,错误行红色高亮,鼠标悬停显示错误原因。用户一目了然。
+
+**SEC**:审核操作必须记录日志——谁审核、审核什么、什么时间、通过/驳回。日志不可篡改(只追加不修改)。另外建议审核SLA≤24小时,超时自动提醒审核员。
+
+**ARCH**:数据大屏用定时任务每5分钟刷新,统计数据缓存到Redis。不需要实时计算,5分钟延迟对政府管理场景完全可接受。核心指标:注册用户总数、今日活跃、供需比、电话拨打次数、短信条数、有效撮合率。
+
+### 第二轮交锋
+
+**BE**:导入的去重逻辑需要明确——"重复"的定义是什么?
+
+**QA**:建议:同一手机号+同一身份类型=重复。同一手机号不同身份不算重复(一人多职)。重复数据预览时标记为"重复",用户可选择跳过或覆盖。
+
+**PM**:同意QA的定义。另外,审核时效24小时对政府场景合理吗?
+
+**SEC**:政府工作人员可能不在电脑前,24小时SLA是合理的。超过24小时自动发送提醒通知(站内消息或短信)。超过48小时升级提醒给超级管理员。
+
+**PM**:好,采纳。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 硬编码+预览方案实用 |
+| ARCH | ✅ 支持 | 异步+定时刷新技术可行 |
+| UX | ✅ 支持 | 预览体验好,错误高亮直观 |
+| BE | ✅ 支持 | 硬编码开发成本低 |
+| QA | ✅ 支持 | 边界case和去重规则已明确 |
+| SEC | ✅ 支持 | 日志和SLA已确认 |
+
+**结果:6/6 ≥ 5,通过 ✅**
+
+### 决议
+1. **字段映射**:MVP硬编码(4种模板),后续迭代可配置
+2. **导入流程**:上传→预览(总行数/有效/错误/重复,错误行红色高亮)→确认入库
+3. **批量处理**:≤100行同步,>100行异步+完成通知
+4. **去重规则**:手机号+身份类型唯一,重复数据标记,用户可选跳过或覆盖
+5. **审核流程**:单级审核,SLA≤24小时(超时提醒),48小时升级给超级管理员
+6. **数据大屏**:定时任务每5分钟刷新,Redis缓存,核心指标:用户总数/活跃/供需比/撮合指标
+
+---
+
+## 议题六:非功能性需求确认
+
+### 问题
+1. 适老化设计标准?
+2. 性能基准?
+3. 视频压缩标准?
+4. 手机号脱敏规则?
+
+### 第一轮发言
+
+**UX**:适老化是本项目的核心竞争力。建议:正文≥18px(rem)、标题≥24px,媒体查询覆盖320-428px宽度,关键按钮≥88×88px,高对比度配色(白底黑字,关键按钮用大色块),输入处放置麦克风图标支持语音输入,去除复杂动画。
+
+**BE**:18px在小屏机型(如iPhone SE)上可能溢出布局。建议用rem+媒体查询做响应式,而不是固定px。另外10万级数据查询必须建索引——手机号唯一索引、身份类型索引、经纬度复合索引。分页20条/页。
+
+**QA**:适老化测试需覆盖:最小字号在不同机型的显示、大按钮的点击区域、高对比度在强光下的可读性、语音输入的识别率。视频压缩边界:超长视频、低质量源视频、格式异常。
+
+**SEC**:手机号脱敏规则统一为中间4位(138****1234),姓名保留姓氏(张**)。敏感操作(数据导出、批量删除)需管理员二次确认+操作日志。接口返回数据中,小程序端只能看到脱敏数据,后台管理员可看完整数据(需权限)。
+
+**ARCH**:10万级数据MySQL单表可支撑,但需要合理建索引。建议核心索引:手机号唯一索引、身份类型索引、经纬度复合索引(用于距离查询)。分页查询每页20条,支持按创建时间倒序。
+
+**PM**:视频压缩标准:720p、码率2Mbps、时长≤5分钟。超长视频前端截断提示"请压缩至5分钟以内"。
+
+### 第二轮交锋
+
+**BE**:720p压缩后大约多大?
+
+**ARCH**:720p/2Mbps,5分钟视频约75MB压缩后约15-20MB。存储成本可控。建议视频存储在对象存储(如阿里云OSS),数据库只存URL。
+
+**BE**:OSS方案好,减轻服务器压力。但上传流程需要调整——先向后端申请上传凭证,前端直传OSS,上传完成后回调后端记录URL。这样后端不中转视频流,带宽压力为零。
+
+**ARCH**:同意BE的直传OSS方案。比后端中转更优。但EXIF清除需要在前端完成(上传前),或者后端下载OSS文件清除后重新上传。
+
+**SEC**:建议前端清除EXIF——上传前用JS库清除,减少后端处理。后端作为兜底,下载后检查并清除。
+
+**UX**:前端清除EXIF对用户透明,不影响体验。同意。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 标准合理 |
+| ARCH | ✅ 支持 | 直传OSS+索引方案可行 |
+| UX | ✅ 支持 | 适老化设计全面 |
+| BE | ✅ 支持 | 直传OSS减轻服务器压力 |
+| QA | ✅ 支持 | 测试场景明确 |
+| SEC | ✅ 支持 | 脱敏和二次确认已确认 |
+
+**结果:6/6 ≥ 5,通过 ✅**
+
+### 决议
+1. **适老化**:正文≥18px(rem)、标题≥24px、媒体查询320-428px、按钮≥88×88px、高对比度、语音输入、去动画
+2. **性能**:首屏<3秒、分页20条/页、手机号唯一索引+身份类型索引+经纬度复合索引
+3. **视频**:前端直传OSS(后端申请凭证),≤50MB、720p/2Mbps、≤5分钟,前端清除EXIF
+4. **脱敏**:手机号138****1234,姓名张**,小程序端脱敏,后台管理员可看完整数据(需权限)
+5. **安全**:敏感操作(导出/批量删除)二次确认+操作日志
+
+---
+
+## 议题七:数据模型与接口边界
+
+### 问题
+1. 核心数据表设计?
+2. 小程序端和后台是否共用API?
+3. 短信服务方案?
+
+### 第一轮发言
+
+**ARCH**:建议小程序和后台共用RESTful API,通过RBAC权限控制访问范围。小程序端用微信token认证,后台用JWT。这样减少代码重复,便于维护。
+
+**BE**:同意共用API。但需要严格区分中间件——小程序请求走微信鉴权拦截器,后台请求走JWT拦截器。两个拦截器不能混淆。建议用不同的URL前缀区分:`/api/wx/*`给小程序,`/api/admin/*`给后台。
+
+**QA**:同意,但需要测试验证:小程序token不能访问`/api/admin/*`,后台JWT不能访问`/api/wx/*`。权限隔离是测试重点。
+
+**SEC**:共用API的安全风险在于权限泄露。建议:所有接口默认拒绝,显式授权。管理员接口加IP白名单限制(可选)。短信API密钥存储在环境变量,不能硬编码。
+
+**PM**:短信用阿里云短信API,成本低、稳定性好。短信签名"洒渔用工"需要提前报备。
+
+**ARCH**:短信API密钥存储在环境变量或配置中心。建议所有敏感配置统一管理:数据库密码、OSS密钥、短信密钥等。
+
+### 第二轮交锋
+
+**BE**:URL前缀区分`/api/wx/*`和`/api/admin/*`是否足够?还是需要更细粒度的权限控制?
+
+**ARCH**:建议角色-权限表配置。角色:果农/工人/客商/农资商/管理员(超级/录入/审核/运维)。每个角色绑定一组权限,权限控制到接口级别。但MVP阶段可以先用角色+URL前缀做粗粒度控制,后续迭代为细粒度。
+
+**SEC**:同意ARCH。MVP粗粒度够用。但有一个硬性要求:接口返回数据必须过滤敏感字段。比如小程序端查询工人列表,返回姓名+工种+报价,不返回手机号(需要拨号时单独申请)。
+
+**PM**:这个设计好——工人手机号不在列表中展示,点击"拨号"时才通过单独接口获取,获取时记录拨号日志。同样适用于客商找果农场景。
+
+**ARCH**:同意。拨号接口记录:谁拨了谁、什么时间。用于数据大屏的"电话拨打次数"统计。
+
+### 投票
+
+| 角色 | 投票 | 理由 |
+|------|------|------|
+| PM | ✅ 支持 | 效率最高,拨号日志支撑数据统计 |
+| ARCH | ✅ 支持 | 架构合理,粗粒度权限MVP够用 |
+| UX | ⚪ 弃权 | 无直接关联,但认可列表不展示手机号的设计 |
+| BE | ✅ 支持 | URL前缀区分开发成本低 |
+| QA | ✅ 支持 | 权限隔离已明确,测试重点清晰 |
+| SEC | ✅ 支持 | 敏感字段过滤已确认 |
+
+**结果:5/6支持(UX弃权)≥ 5,通过 ✅**
+
+### 决议
+1. **API架构**:共用RESTful API,`/api/wx/*`小程序端、`/api/admin/*`后台管理端
+2. **认证机制**:小程序微信code→JWT token,后台账号密码→JWT token,独立拦截器
+3. **权限模型**:RBAC,角色分为果农/工人/客商/农资商/管理员(超级/录入/审核/运维),MVP粗粒度控制
+4. **数据过滤**:接口返回过滤敏感字段,手机号通过单独拨号接口获取,记录拨号日志
+5. **短信服务**:阿里云短信API,签名"洒渔用工",密钥环境变量存储
+6. **配置管理**:敏感配置(DB/OSS/短信)统一环境变量或配置中心管理
+
+---
+
+## 讨论总结
+
+### 投票汇总
+
+| 议题 | 结果 | 支持/总 | 关键争议 |
+|------|------|---------|----------|
+| 一:用户身份与登录 | ✅ 通过 | 6/6 | 无争议 |
+| 二:果农端功能方案 | ✅ 通过 | 6/6 | 招工审核:免审核 vs 审核→折中:标记+复核 |
+| 三:工人端功能方案 | ✅ 通过 | 6/6 | 状态审核:人工审核 vs 自动→折中:信用机制 |
+| 四:客商端与农资端 | ✅ 通过 | 6/6 | 联系授权有效期:永久 vs 7天→7天 |
+| 五:后台管理与导入 | ✅ 通过 | 6/6 | 字段映射:可配置 vs 硬编码→MVP硬编码 |
+| 六:非功能性需求 | ✅ 通过 | 6/6 | 视频上传:后端中转 vs 直传OSS→直传OSS |
+| 七:数据模型与接口 | ✅ 通过 | 5/6 | UX弃权(无直接关联) |
+
+### 关键争议与最终折中
+
+| 争议点 | 正方 | 反方 | 最终方案 |
+|--------|------|------|----------|
+| 招工审核 | PM:免审核 | BE:关键词过滤 | 免审核+敏感词标记+人工复核 |
+| 状态审核 | PM:人工审核 | BE:自动机制 | 手动切换+3天自动恢复+信用机制 |
+| 字段映射 | PM:可配置 | BE:硬编码 | MVP硬编码+后续可配置 |
+| 视频上传 | SEC:后端中转 | BE:直传OSS | 前端直传OSS+后端申请凭证 |
+| 距离计算 | PM:地址 | - | 地址→经纬度→Haversine |
+| 解锁有效期 | SEC:7天 | PM:永久 | 7天有效期 |
+
+### 方案特点
+- **简单实用**:所有方案优先选择实现成本低、可靠性高的方案
+- **MVP优先**:复杂功能(可配置映射、在线下单、双向匹配)延后迭代
+- **安全合规**:手机号加密存储、脱敏显示、EXIF清除、操作日志
+- **适老化**:大字体、大按钮、高对比度、语音输入

+ 545 - 0
docs/requirements-specification.md

@@ -0,0 +1,545 @@
+# 洒渔镇苹果产业供需对接平台 — 需求规格说明书 V2
+
+> 版本:V2.0
+> 编制日期:2026-05-30
+> 基于:功能清单V1.0 + 6角色需求研讨V2(投票≥5/6通过)
+> 变更:视频上传改为直传OSS、新增信用机制、拨号日志、审核SLA升级、API前缀分离
+
+---
+
+## 一、项目概述
+
+### 1.1 项目背景
+洒渔镇是云南昭通苹果主产区,产业链涉及果农、采摘工人、收购客商、农资供应商四类主体。当前供需信息主要靠熟人介绍和集市口口相传,效率低、信息不对称。本平台通过微信小程序+后台管理系统,实现苹果产业供需信息的线上化对接。
+
+### 1.2 项目目标
+- 为果农提供招工、找客商、买农资的一站式服务
+- 为工人提供就近找活、技能展示的信息渠道
+- 为客商提供货源筛选、精准对接的信息平台
+- 为政府管理部门提供产业数据统计和决策支持
+
+### 1.3 用户角色
+
+| 角色 | 代号 | 说明 |
+|------|------|------|
+| 果农 | GROWER | 苹果种植户,发布招工、展示货源 |
+| 工人 | WORKER | 采摘/套袋/搬运等农业工人 |
+| 客商 | BUYER | 苹果收购商/公司 |
+| 农资商 | SUPPLIER | 化肥/果袋/农药等农资店铺 |
+| 超级管理员 | ADMIN | 系统最高权限 |
+| 数据录入员 | DATA_ENTRY | Excel导入、用户管理 |
+| 审核员 | AUDITOR | 内容审核、投诉处理 |
+| 运维人员 | OPERATOR | 数据大屏、报表导出 |
+
+---
+
+## 二、功能需求
+
+### 2.1 公共基础模块
+
+#### 2.1.1 微信登录(P0)
+- **流程**:微信`wx.login()`→后端换openid+手机号→JWT token
+- **身份路由**:
+  - 0个身份 → 提示"未找到信息,请联系村委会"
+  - 1个身份 → 直接进入对应首页
+  - N个身份 → 身份选择页(大卡片列表,≥120px高度)
+- **兜底**:拒绝授权→弹窗引导→联系村委会管理员后台绑定
+- **验收**:
+  - [ ] 新用户首次登录提示联系村委会
+  - [ ] 单身份用户直接进入对应首页
+  - [ ] 多身份用户展示身份选择页
+  - [ ] 拒绝授权后可联系管理员绑定
+
+#### 2.1.2 个人中心(P1)
+- 退出登录(清除Token)
+- 关于我们(平台介绍、联系方式、免责声明)
+
+---
+
+### 2.2 果农端 (GROWER)
+
+#### 2.2.1 首页
+| 功能 | 优先级 | 描述 |
+|------|--------|------|
+| 问候语 | P1 | "早安,[姓名]!" + 当地实时天气 |
+| 今日行情 | P0 | 苹果品种收购价格区间,涨价红/降价绿色块,展示更新时间 |
+| 金刚区 | P0 | 4个核心入口:找工人、找客商、买农资、发布需求 |
+
+#### 2.2.2 找工人(P0)
+- **筛选**:工种(采摘/套袋/搬运/装卸)
+- **列表**:工人姓名、工种标签、报价(元/天或元/个)、距离、状态(空闲/忙碌)
+- **拨号**:点击调用单独拨号接口(记录日志),唤起系统拨号
+- **距离**:果园地址→经纬度→Haversine公式
+
+#### 2.2.3 发布招工(P0)
+- **表单**:工种(多选)、价格、价格单位(元/天|元/个)、人数、天数、工作地点、备注(支持语音输入)
+- **发布规则**:免审核直接发布
+- **内容管控**:敏感关键词自动标记→待复核列表→人工审核→后台强制下架
+- **管理**:下架、重新编辑、查看历史记录(P1)
+
+#### 2.2.4 找客商(P0)
+- **列表**:客商姓名/公司名、收购品种、收购价格、收购数量、收购点地址
+- **拨号**:点击调用拨号接口(记录日志)
+
+#### 2.2.5 买农资(P1)
+- **分类**:化肥、果袋、反光膜、选果机、农药
+- **列表**:店铺名称、主营产品、距离、联系电话(一键拨号)
+
+#### 2.2.6 我的名片(P0)
+- **信息**:苹果品种(多选)、产量(斤)、预期价格(元/斤)、果园地址
+- **视频**:前端直传OSS(后端申请凭证),≤50MB/MP4/MOV,前端清除EXIF,后端压缩720p/2Mbps/≤5分钟
+- **照片**:≤9张,单张≤5MB,前端清除EXIF
+- **审核状态**:待审/已通过/被驳回(驳回显示原因)
+
+---
+
+### 2.3 工人端 (WORKER)
+
+#### 2.3.1 首页·找活(P0)
+- **推荐**:工种匹配+距离排序,展示附近招工需求
+- **卡片**:工种、价格、天数、人数、果农姓名、距离
+- **报名**:点击→短信通知果农→自动变为"忙碌"
+- **防骚扰**:同一工人每天对同一果农最多1条短信(自然日)
+
+#### 2.3.2 工作记录(P1)
+- **报名列表**:果农姓名、工种、报名时间、状态(已报名/已联系)
+- **联系果农**:详情中一键拨号(记录日志)
+
+#### 2.3.3 我的状态(P0)
+- **切换**:空闲/工作中,手动切换
+- **自动恢复**:3天无操作自动恢复"空闲"(`last_active_time`判断)
+- **报名联动**:报名后自动"忙碌"
+
+#### 2.3.4 信用机制
+- 被投诉1次 → 警告
+- 被投诉2次 → 限制报名24小时
+- 被投诉3次 → 状态锁定,需管理员解除
+
+#### 2.3.5 我的信息(P1)
+- 展示姓名、技能、电话
+- 技能不可自行修改,需联系管理员
+
+---
+
+### 2.4 客商端 (BUYER)
+
+#### 2.4.1 首页·找货(P0)
+- **筛选**:苹果品种、价格区间、距离
+- **列表**:果农姓名、品种、存量、下树时间、地址
+
+#### 2.4.2 货源详情(P0)
+- **信息**:种植面积、苹果规格(糖度/果径)、果园视频/照片
+- **联系授权**:
+  1. 勾选具体苹果批次(如"红富士 20000斤")
+  2. 解锁该果农电话,有效期7天
+  3. 过期需重新勾选
+  4. 存储解锁记录:客商ID、果农ID、批次ID、解锁时间、过期时间
+- **拨号**:解锁后一键拨号(记录日志)
+
+#### 2.4.3 我的需求(P1)
+- 收购偏好:品种(多选)、价格区间、收购总量、收购标准
+
+---
+
+### 2.5 农资端 (SUPPLIER)
+
+#### 2.5.1 我的店铺(P1)
+- **信息**:店铺名称、店主姓名、主营种类(多选)、详细地址、联系电话
+- **保存**:提交后更新搜索库
+- **扩展**:`supplier_shop`表预留`goods`字段,兼容后续在线下单
+
+---
+
+### 2.6 后台管理端
+
+#### 2.6.1 系统管理
+
+| 功能 | 优先级 | 描述 |
+|------|--------|------|
+| 角色管理 | P0 | 超级管理员、数据录入员、审核员、运维人员 |
+| 账号管理 | P0 | 管理员账号增删改查+权限分配 |
+| 字典管理 | P0 | 苹果品种、工种、农资种类、行政区划(洒渔镇下辖村) |
+| 操作日志 | P1 | 登录/导入/审核/删除等关键操作记录,只追加不修改 |
+| 短信配置 | P1 | 短信签名、通知模板配置 |
+
+#### 2.6.2 数据导入与用户管理(核心)
+
+**Excel模板**(P0):果农/工人/客商/农资四类
+
+**导入流程**(P0):
+1. 下载模板→填写→上传
+2. 预览:总行数、有效行数、错误行数、重复行数
+3. 错误行红色高亮,鼠标悬停显示原因
+4. 确认入库
+5. ≤100行同步,>100行异步+完成通知
+
+**字段映射**(P0):MVP硬编码(手机号/电话→phone,姓名→name等)
+
+**去重规则**:手机号+身份类型唯一,重复数据标记,用户可选跳过或覆盖
+
+**用户池**(P0):列表搜索、身份绑定/解绑、信息修正(P1)
+
+#### 2.6.3 业务审核中心
+
+| 功能 | 优先级 | 描述 |
+|------|--------|------|
+| 名片审核 | P0 | 审核果农视频/照片,通过/驳回(需填原因) |
+| 待复核列表 | P0 | 敏感关键词标记的招工信息,人工审核 |
+| 招工巡查 | P1 | 查看所有招工,强制下架违规内容 |
+| 举报处理 | P2 | 处理用户投诉(虚假招工、骚扰电话) |
+
+**审核规则**:
+- 单级审核,审核员直接操作
+- SLA≤24小时,超时自动提醒审核员
+- 超过48小时升级提醒超级管理员
+- 操作日志不可篡改
+
+#### 2.6.4 数据统计与决策大屏
+
+| 功能 | 优先级 | 描述 |
+|------|--------|------|
+| 行情管理 | P0 | 配置首页"今日行情"价格区间 |
+| 宏观概览 | P0 | 注册用户总数、今日活跃、供需比 |
+| 撮合指标 | P0 | 电话拨打次数、短信发送条数、有效撮合率 |
+| 流量指标 | P1 | PV/UV、名片浏览量 |
+| 产业地图 | P1 | 果农分布热力图、客商来源TOP10、劳动力分布图 |
+| 报表导出 | P1 | 用户列表、撮合记录、操作日志导出Excel |
+
+**技术方案**:定时任务每5分钟刷新,Redis缓存
+
+---
+
+## 三、数据模型设计
+
+### 3.1 核心数据表
+
+#### sys_user(用户基础表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| openid | VARCHAR(64) | UNIQUE | 微信openid |
+| phone | VARCHAR(255) | - | 手机号(AES加密存储) |
+| phone_hash | VARCHAR(64) | UNIQUE | 手机号SHA256哈希(查询用) |
+| nickname | VARCHAR(50) | - | 微信昵称 |
+| avatar | VARCHAR(255) | - | 微信头像URL |
+| status | TINYINT | INDEX | 状态:0禁用 1正常 |
+| last_active_time | DATETIME | - | 最后活跃时间 |
+| created_at | DATETIME | - | 创建时间 |
+| updated_at | DATETIME | - | 更新时间 |
+
+#### user_identity(身份关联表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| user_id | BIGINT | INDEX | 关联sys_user.id |
+| identity_type | VARCHAR(20) | INDEX | GROWER/WORKER/BUYER/SUPPLIER |
+| status | TINYINT | - | 0禁用 1正常 |
+| created_at | DATETIME | - | 创建时间 |
+
+#### grower_profile(果农档案表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| user_identity_id | BIGINT | INDEX | 关联user_identity.id |
+| name | VARCHAR(50) | - | 姓名 |
+| varieties | VARCHAR(200) | - | 苹果品种(JSON数组) |
+| yield_amount | DECIMAL(10,2) | - | 产量(斤) |
+| expected_price | DECIMAL(8,2) | - | 预期价格(元/斤) |
+| address | VARCHAR(200) | - | 果园地址 |
+| latitude | DECIMAL(10,7) | INDEX | 纬度(经纬度复合索引) |
+| longitude | DECIMAL(10,7) | INDEX | 经度(经纬度复合索引) |
+| video_url | VARCHAR(255) | - | 果园视频OSS URL |
+| photos | TEXT | - | 照片URL(JSON数组) |
+| audit_status | TINYINT | INDEX | 0待审 1通过 2驳回 |
+| audit_remark | VARCHAR(200) | - | 驳回原因 |
+
+#### recruit_info(招工信息表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| user_identity_id | BIGINT | INDEX | 发布者身份ID |
+| work_types | VARCHAR(100) | - | 工种(JSON数组) |
+| price | DECIMAL(8,2) | - | 价格 |
+| price_unit | VARCHAR(10) | - | DAY/PIECE |
+| worker_count | INT | - | 需要人数 |
+| days | INT | - | 天数 |
+| location | VARCHAR(200) | - | 工作地点 |
+| latitude | DECIMAL(10,7) | INDEX | 纬度 |
+| longitude | DECIMAL(10,7) | INDEX | 经度 |
+| remark | VARCHAR(500) | - | 备注 |
+| status | TINYINT | INDEX | 0下架 1发布中 |
+| keyword_flag | TINYINT | INDEX | 0正常 1待复核 |
+| created_at | DATETIME | - | 发布时间 |
+
+#### worker_profile(工人档案表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| user_identity_id | BIGINT | INDEX | 关联user_identity.id |
+| name | VARCHAR(50) | - | 姓名 |
+| skills | VARCHAR(100) | - | 技能(JSON数组) |
+| price | DECIMAL(8,2) | - | 报价 |
+| price_unit | VARCHAR(10) | - | DAY/PIECE |
+| status | TINYINT | INDEX | 0忙碌 1空闲 |
+| status_updated_at | DATETIME | - | 状态更新时间 |
+| complaint_count | INT | - | 投诉次数 |
+
+#### worker_apply(工人报名表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| worker_identity_id | BIGINT | INDEX | 工人身份ID |
+| recruit_id | BIGINT | INDEX | 招工信息ID |
+| farmer_identity_id | BIGINT | INDEX | 果农身份ID |
+| sms_sent | TINYINT | - | 短信是否已发送 |
+| apply_time | DATETIME | - | 报名时间 |
+
+#### sms_daily_limit(短信限流表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| worker_identity_id | BIGINT | INDEX | 工人身份ID |
+| farmer_identity_id | BIGINT | INDEX | 果农身份ID |
+| sms_date | DATE | INDEX | 发送日期(自然日) |
+| sms_count | INT | - | 当日发送次数 |
+
+#### buyer_profile(客商档案表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| user_identity_id | BIGINT | INDEX | 关联user_identity.id |
+| name | VARCHAR(50) | - | 姓名/公司名 |
+| varieties | VARCHAR(200) | - | 收购品种(JSON数组) |
+| price_range | VARCHAR(50) | - | 价格区间 |
+| total_amount | DECIMAL(10,2) | - | 收购总量(斤) |
+| standards | VARCHAR(200) | - | 收购标准 |
+| address | VARCHAR(200) | - | 收购点地址 |
+
+#### phone_unlock_record(联系授权记录表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| buyer_identity_id | BIGINT | INDEX | 客商身份ID |
+| grower_identity_id | BIGINT | INDEX | 果农身份ID |
+| batch_id | BIGINT | - | 苹果批次ID |
+| unlock_time | DATETIME | - | 解锁时间 |
+| expire_time | DATETIME | INDEX | 过期时间(+7天) |
+
+#### supplier_shop(农资店铺表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| user_identity_id | BIGINT | INDEX | 关联user_identity.id |
+| shop_name | VARCHAR(50) | - | 店铺名称 |
+| owner_name | VARCHAR(50) | - | 店主姓名 |
+| categories | VARCHAR(200) | - | 主营种类(JSON数组) |
+| address | VARCHAR(200) | - | 详细地址 |
+| phone | VARCHAR(20) | - | 联系电话 |
+| has_online_order | TINYINT | - | 预留:是否支持在线下单 |
+
+#### market_price(今日行情表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| variety | VARCHAR(50) | INDEX | 苹果品种 |
+| price_min | DECIMAL(8,2) | - | 最低价(元/斤) |
+| price_max | DECIMAL(8,2) | - | 最高价(元/斤) |
+| trend | TINYINT | - | 0持平 1涨价 2降价 |
+| update_date | DATE | INDEX | 更新日期 |
+
+#### call_log(拨号日志表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| caller_identity_id | BIGINT | INDEX | 拨号方身份ID |
+| callee_identity_id | BIGINT | INDEX | 被拨方身份ID |
+| call_time | DATETIME | - | 拨号时间 |
+
+#### audit_log(审核日志表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| operator_id | BIGINT | INDEX | 操作员ID |
+| target_type | VARCHAR(50) | - | 审核对象类型 |
+| target_id | BIGINT | - | 审核对象ID |
+| action | VARCHAR(20) | - | APPROVE/REJECT |
+| remark | VARCHAR(200) | - | 备注/驳回原因 |
+| created_at | DATETIME | - | 操作时间 |
+
+#### operation_log(操作日志表)
+| 字段 | 类型 | 索引 | 说明 |
+|------|------|------|------|
+| id | BIGINT | PK | 主键 |
+| operator_id | BIGINT | INDEX | 操作员ID |
+| action | VARCHAR(50) | - | 操作类型 |
+| target | VARCHAR(100) | - | 操作对象 |
+| detail | TEXT | - | 操作详情 |
+| ip | VARCHAR(50) | - | 操作IP |
+| created_at | DATETIME | - | 操作时间 |
+
+---
+
+## 四、接口设计概要
+
+### 4.1 认证与权限
+
+**认证机制**:
+- 小程序端:微信code→后端换JWT token
+- 后台管理端:账号密码→JWT token
+- 独立拦截器,互不混淆
+
+**URL前缀**:
+- `/api/wx/*` — 小程序端接口
+- `/api/admin/*` — 后台管理端接口
+
+**权限模型**:RBAC,所有接口默认拒绝,显式授权
+
+**数据过滤**:接口返回过滤敏感字段,手机号通过单独拨号接口获取
+
+### 4.2 核心接口清单
+
+#### 认证模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/auth/login | POST | 微信登录 |
+| /api/wx/auth/identity-list | GET | 获取身份列表 |
+| /api/admin/auth/login | POST | 后台登录 |
+
+#### 果农模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/grower/profile | GET/PUT | 果农档案 |
+| /api/wx/grower/recruit | POST/GET | 发布/查询招工 |
+| /api/wx/grower/recruit/{id} | PUT/DELETE | 编辑/下架招工 |
+| /api/wx/grower/upload-credential | POST | 申请OSS上传凭证 |
+| /api/wx/grower/upload-callback | POST | OSS上传完成回调 |
+
+#### 工人模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/worker/profile | GET/PUT | 工人档案 |
+| /api/wx/worker/recommend | GET | 推荐招工列表 |
+| /api/wx/worker/apply | POST | 报名 |
+| /api/wx/worker/status | PUT | 切换状态 |
+
+#### 客商模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/buyer/profile | GET/PUT | 客商档案 |
+| /api/wx/buyer/goods | GET | 货源列表 |
+| /api/wx/buyer/goods/{id} | GET | 货源详情 |
+| /api/wx/buyer/unlock | POST | 解锁果农电话 |
+
+#### 通用模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/wx/call/phone | POST | 获取电话号码(记录拨号日志) |
+| /api/wx/market-price | GET | 今日行情 |
+
+#### 后台管理模块
+| 接口 | 方法 | 说明 |
+|------|------|------|
+| /api/admin/import/upload | POST | 上传Excel |
+| /api/admin/import/preview | POST | 预览导入数据 |
+| /api/admin/import/confirm | POST | 确认入库 |
+| /api/admin/users | GET | 用户列表 |
+| /api/admin/users/{id} | GET/PUT | 用户详情/修改 |
+| /api/admin/audit/list | GET | 审核列表 |
+| /api/admin/audit/{id} | PUT | 审核操作 |
+| /api/admin/market-price | GET/PUT | 行情配置 |
+| /api/admin/dashboard | GET | 大屏数据 |
+| /api/admin/complaint/list | GET | 投诉列表 |
+| /api/admin/complaint/{id} | PUT | 处理投诉 |
+
+---
+
+## 五、非功能性需求
+
+### 5.1 适老化设计
+- 正文≥18px(rem),标题≥24px
+- 媒体查询覆盖320-428px宽度
+- 关键按钮≥88×88px,高对比度配色
+- 输入处放置麦克风图标,支持语音输入
+- 去除复杂动画,简化操作流程
+
+### 5.2 性能要求
+- 首屏加载<3秒
+- 分页查询20条/页
+- 核心索引:手机号唯一索引、身份类型索引、经纬度复合索引
+- 支持10万级用户数据
+
+### 5.3 视频处理
+- 前端直传OSS(后端申请上传凭证)
+- 限制:≤50MB,MP4/MOV格式
+- 前端清除EXIF元数据
+- 后端压缩:720p,码率2Mbps,时长≤5分钟
+- 视频存储OSS,数据库存URL
+
+### 5.4 安全要求
+- 手机号AES加密存储,phone_hash(SHA256)索引查询
+- 接口返回脱敏:手机号138****1234,姓名张**
+- 小程序端脱敏,后台管理员可看完整数据(需权限)
+- 敏感操作(导出/批量删除)二次确认+操作日志
+- 管理员接口可选IP白名单
+- 所有API默认拒绝,显式授权
+
+### 5.5 兼容性
+- 兼容主流微信版本
+- 兼容iOS和Android系统
+
+---
+
+## 六、约束与假设
+
+### 6.1 约束
+- 后端:Java 8 / Spring Boot 1.5.9 / MyBatis
+- 数据库:MySQL
+- 小程序:微信原生开发
+- 短信:阿里云短信API
+- 视频存储:阿里云OSS
+
+### 6.2 假设
+- 初期用户规模:1000-5000,峰值10万
+- 日均招工发布:50-200条
+- 日均报名短信:100-500条
+- 政府管理员:5-10人
+
+---
+
+## 七、风险清单
+
+| 风险 | 影响 | 概率 | 缓解措施 |
+|------|------|------|----------|
+| 微信手机号授权拒绝率高 | 用户无法注册 | 中 | 后台手动绑定兜底 |
+| 农村网络不稳定 | 视频上传失败 | 高 | 断点续传+压缩 |
+| 虚假招工信息 | 平台信誉受损 | 中 | 关键词标记+人工复核+举报+强制下架 |
+| 短信成本超预算 | 运营成本增加 | 低 | 月均500元预算控制 |
+| 中老年用户不会操作 | 用户流失 | 中 | 适老化设计+语音输入 |
+| 数据导入格式不统一 | 导入失败 | 中 | 模板下载+预览校验 |
+| 手机号泄露 | 隐私风险 | 低 | AES加密+脱敏+授权机制+EXIF清除 |
+| OSS费用超预期 | 成本增加 | 低 | 视频≤50MB/5分钟限制 |
+
+---
+
+## 八、优先级总览
+
+### P0(MVP核心,必须实现)
+- 微信登录+身份路由+兜底绑定
+- 果农:今日行情、找工人、发布招工(免审核+关键词标记)、找客商、我的名片(含视频/照片)
+- 工人:找活推荐、报名通知、状态管理(自动恢复+信用机制)
+- 客商:货源筛选、联系授权(7天有效期)
+- 后台:角色管理、数据导入(硬编码映射+预览)、名片审核、待复核列表、行情管理、数据大屏(宏观概览+撮合指标)
+
+### P1(应该实现)
+- 果农:招工记录、买农资
+- 工人:工作记录、我的信息
+- 客商:收购偏好
+- 农资:店铺信息维护
+- 后台:操作日志、短信配置、用户信息修正、招工巡查、流量指标、产业地图、报表导出
+
+### P2(可以延后)
+- 关于我们
+- 举报处理
+- 可配置字段映射
+- 在线下单
+- 双向匹配

+ 0 - 0
docs/reviews/.gitkeep


binární
docs/洒渔镇苹果产业供需对接平台功能清单-V1.0.docx


+ 125 - 0
service/pom.xml

@@ -0,0 +1,125 @@
+<?xml version="1.0" encoding="UTF-8"?>
+<project xmlns="http://maven.apache.org/POM/4.0.0"
+         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
+         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
+    <modelVersion>4.0.0</modelVersion>
+
+    <groupId>com.fenzhitech</groupId>
+    <artifactId>sayu-service</artifactId>
+    <version>1.0.0-SNAPSHOT</version>
+    <packaging>jar</packaging>
+
+    <name>洒渔镇苹果产业供需对接平台 - 后端服务</name>
+
+    <parent>
+        <groupId>org.springframework.boot</groupId>
+        <artifactId>spring-boot-starter-parent</artifactId>
+        <version>1.5.9.RELEASE</version>
+        <relativePath/>
+    </parent>
+
+    <properties>
+        <java.version>1.8</java.version>
+        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
+    </properties>
+
+    <dependencies>
+        <!-- Spring Boot Web -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-web</artifactId>
+        </dependency>
+
+        <!-- Spring Boot AOP -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-aop</artifactId>
+        </dependency>
+
+        <!-- Spring Boot Redis -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-data-redis</artifactId>
+        </dependency>
+
+        <!-- MyBatis -->
+        <dependency>
+            <groupId>org.mybatis.spring.boot</groupId>
+            <artifactId>mybatis-spring-boot-starter</artifactId>
+            <version>1.3.2</version>
+        </dependency>
+
+        <!-- MySQL -->
+        <dependency>
+            <groupId>mysql</groupId>
+            <artifactId>mysql-connector-java</artifactId>
+            <version>5.1.47</version>
+        </dependency>
+
+        <!-- JWT -->
+        <dependency>
+            <groupId>io.jsonwebtoken</groupId>
+            <artifactId>jjwt</artifactId>
+            <version>0.9.1</version>
+        </dependency>
+
+        <!-- Apache POI (Excel) -->
+        <dependency>
+            <groupId>org.apache.poi</groupId>
+            <artifactId>poi-ooxml</artifactId>
+            <version>3.17</version>
+        </dependency>
+
+        <!-- 阿里云 OSS -->
+        <dependency>
+            <groupId>com.aliyun.oss</groupId>
+            <artifactId>aliyun-sdk-oss</artifactId>
+            <version>3.15.1</version>
+        </dependency>
+
+        <!-- 阿里云核心 SDK -->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-core</artifactId>
+            <version>4.5.3</version>
+        </dependency>
+
+        <!-- 阿里云短信 -->
+        <dependency>
+            <groupId>com.aliyun</groupId>
+            <artifactId>aliyun-java-sdk-dysmsapi</artifactId>
+            <version>2.1.0</version>
+        </dependency>
+
+        <!-- Jackson (JSON) -->
+        <dependency>
+            <groupId>com.fasterxml.jackson.core</groupId>
+            <artifactId>jackson-databind</artifactId>
+        </dependency>
+
+        <!-- 测试 -->
+        <dependency>
+            <groupId>org.springframework.boot</groupId>
+            <artifactId>spring-boot-starter-test</artifactId>
+            <scope>test</scope>
+        </dependency>
+    </dependencies>
+
+    <build>
+        <plugins>
+            <plugin>
+                <groupId>org.springframework.boot</groupId>
+                <artifactId>spring-boot-maven-plugin</artifactId>
+            </plugin>
+            <plugin>
+                <groupId>org.apache.maven.plugins</groupId>
+                <artifactId>maven-compiler-plugin</artifactId>
+                <configuration>
+                    <source>${java.version}</source>
+                    <target>${java.version}</target>
+                    <encoding>UTF-8</encoding>
+                </configuration>
+            </plugin>
+        </plugins>
+    </build>
+</project>

+ 40 - 0
service/src/main/resources/application.properties

@@ -0,0 +1,40 @@
+# ===== 服务配置 =====
+server.port=8080
+server.context-path=/
+
+# ===== 数据库配置 =====
+spring.datasource.url=jdbc:mysql://localhost:3306/crrc?useUnicode=true&characterEncoding=utf8&useSSL=false
+spring.datasource.username=root
+spring.datasource.password=
+spring.datasource.driver-class-name=com.mysql.jdbc.Driver
+
+# ===== MyBatis 配置 =====
+mybatis.mapper-locations=classpath:mapper/**/*.xml
+mybatis.configuration.map-underscore-to-camel-case=true
+mybatis.type-aliases-package=com.fenzhitech.crrc.entity
+
+# ===== Redis 配置 =====
+spring.redis.host=localhost
+spring.redis.port=6379
+spring.redis.password=
+
+# ===== JWT 配置 =====
+jwt.secret=
+jwt.expiration=86400000
+
+# ===== 阿里云 OSS 配置 =====
+oss.endpoint=
+oss.access-key-id=
+oss.access-key-secret=
+oss.bucket-name=
+
+# ===== 阿里云短信配置 =====
+sms.access-key-id=
+sms.access-key-secret=
+sms.sign-name=洒渔用工
+sms.template-code.apply=
+sms.template-code.audit=
+
+# ===== 微信小程序配置 =====
+wx.appid=
+wx.secret=

+ 18 - 0
wxapp/app.json

@@ -0,0 +1,18 @@
+{
+  "pages": [
+    "pages/index/index",
+    "pages/login/login",
+    "pages/grower/index",
+    "pages/worker/index",
+    "pages/buyer/index",
+    "pages/supplier/index",
+    "pages/mine/index"
+  ],
+  "window": {
+    "backgroundTextStyle": "light",
+    "navigationBarBackgroundColor": "#ffffff",
+    "navigationBarTitleText": "洒渔用工",
+    "navigationBarTextStyle": "black"
+  },
+  "sitemapLocation": "sitemap.json"
+}

+ 20 - 0
wxapp/project.config.json

@@ -0,0 +1,20 @@
+{
+  "description": "洒渔镇苹果产业供需对接平台 - 微信小程序",
+  "packOptions": {
+    "ignore": []
+  },
+  "setting": {
+    "urlCheck": true,
+    "es6": true,
+    "enhance": true,
+    "postcss": true,
+    "preloadBackgroundData": false,
+    "minified": true,
+    "newFeature": true,
+    "autoAudits": false
+  },
+  "compileType": "miniprogram",
+  "appid": "",
+  "projectname": "sayu-app",
+  "condition": {}
+}

+ 23 - 0
wxbackstage/package.json

@@ -0,0 +1,23 @@
+{
+  "name": "sayu-admin",
+  "version": "1.0.0",
+  "description": "洒渔镇苹果产业供需对接平台 - 后台管理系统",
+  "private": true,
+  "scripts": {
+    "dev": "vue-cli-service serve",
+    "build": "vue-cli-service build",
+    "lint": "vue-cli-service lint"
+  },
+  "dependencies": {
+    "vue": "^2.6.14",
+    "vue-router": "^3.5.4",
+    "vuex": "^3.6.2",
+    "element-ui": "^2.15.9",
+    "axios": "^0.27.2",
+    "echarts": "^5.4.3"
+  },
+  "devDependencies": {
+    "@vue/cli-service": "~4.5.19",
+    "vue-template-compiler": "^2.6.14"
+  }
+}