# 宠小它 — P0 研发落地清单 > 用途:发给研发拆任务与验收;**仅含 P0**(本期质量与主线闭环必需,不含 P1/P2 增强)。 > 依据:《产品全方位优化说明 v1》《本期主线》《宠主端预约体验优化》《产品设计文档》及当前仓库实现粗对齐。 > 更新:2026-04-19 **关联**: [产品全方位优化说明-v1](./产品全方位优化说明-v1.md) · [本期主线-下一步产品优化点](./本期主线-下一步产品优化点.md) · [宠主端预约体验优化-产品说明](./宠主端预约体验优化-产品说明.md) --- ## 优先级说明 - **P0**:本迭代必须交付;阻塞对外口碑、数据脏读、合规提示缺失、或主线(传播/成片/留资)不可用。 - 已部分实现的项:**仍保留**,以下方「验收标准」为准做 gap 关闭。 --- ## A. 后端(Spring Boot) | ID | 需求 | 验收标准 | 备注 | |----|------|----------|------| | **A1** | **预约状态机校验**:`PUT /appointment/status`(及任意改状态入口)禁止非法迁移 | 仅允许:`new→doing`、`new→cancel`、`doing→done`(若报告提交会改 done 则接口侧与之一致)、`doing→cancel`(若产品允许,需与前端一致;**若产品规定仅 new 可取消**则 `doing→cancel` 返回 `CANCEL_NOT_ALLOWED`) | 当前 `AppointmentService.updateStatus` / `startService` 偏「直接赋值」,需按《产品设计文档》矩阵校验;非法迁移返回 **4xx + 明确业务码**(如 `INVALID_STATUS`) | | **A2** | **开始服务**仅当 `status=new` | `startService` 非 `new` 时拒绝,勿静默改库 | 与「谁点谁服务」一致 | | **A3** | **取消预约**(若独立接口)校验:仅允许目标状态为 `cancel` 且前置状态符合产品规则 | 与 A1 同一套状态机;前端取消按钮仅 `new` 时展示则后端仍要防篡改 | 防恶意请求 | | **A4** | (可选 P0,若本期上留资)**留资去重**:同一 `report_token` + 同一手机号 | 二次提交返回成功态或「已提交」语义,不重复插库 | 口径见《本期主线》C | --- ## B. 小程序 — 门店端(老板/员工) | ID | 需求 | 验收标准 | 备注 | |----|------|----------|------| | **B1** | **「已完成」Tab 列表默认不含已取消** | Tab「已完成」下默认仅展示 `status===done`;`cancel` 通过 **次级筛选**(如「包含已取消」开关)或 **单独子 Tab「已取消」** 二选一实现 | 当前 `Home.vue` 约 `currentStatus==='done'` 时含 `cancel`,需改 | | **B2** | **发送报告成功页**:同屏 **报告链接 + 二维码 + 两条可复制话术** | 话术支持变量:`{宠物名}{服务类型}{门店名}{链接}`;一键复制单条话术;二维码与链接不拆多页 | 对齐《本期主线》A「员工动作成本」 | | **B3** | **报告提交锁死提示** | 填写报告页底部或提交前弹窗固定文案:**「提交后不可修改,请确认照片与备注无误」**(与产品 v1 锁死策略一致) | 若已有则核对文案 | | **B4** | **「我的」老板端分组标题** | 至少两组:`店铺与经营` / `团队与账号`(或等价命名),高频在上;使用现有 `.module-title` | 降低入口迷失,见《产品全方位优化说明》§2.2 | --- ## C. 小程序 — 宠主端(customer) | ID | 需求 | 验收标准 | 备注 | |----|------|----------|------| | **C1** | **单一主预约路径** | 首屏仅保留 **一个**主级「预约服务」入口;**不再同屏强并存**「大按钮 + 空态大按钮 + FAB +」等效重复(保留 FAB 则须显著弱于主按钮或仅老用户) | 见《宠主端预约体验优化》§9;需对照当前 `Home.vue` 是否仍重复 | | **C2** | **扫码 / 分享落地 `storeId`** | `CustAppointmentCreate` 支持 `onLoad` 读 `storeId`(已有则做 **全入口** 回归:普通二维码、小程序码 scene、分享 path/query) | 预填门店且可「更换门店」 | | **C3** | **登录时机与草稿** | 业务规则二选一落地并写 README:**(1)** 未登录可填单,提交时再登录,返回后 **草稿恢复**;**(2)** 进入预约页即要求登录。推荐 (1) | `uni.storage` 或状态恢复;避免白填 | | **C4** | **异常可理解** | 无可用时段、网络失败、未登录:均有 **toast / 空态 / 重试**,禁止静默失败 | 专文 §7 | --- ## D. H5 报告页(`report-view` / 独立 H5) | ID | 需求 | 验收标准 | 备注 | |----|------|----------|------| | **D1** | **隐私提示(短期策略)** | 首屏或固定条:**「本页含宠物服务影像,请勿公开转发或发群」**(文案可微调,须合规友好) | 对齐《本期主线》A token 风险 | | **D2** | **短片三态与文案对齐小程序** | `processing / failed / success` 与 `ReportHighlightBlock` 一致;失败展示 **归类中文**,不暴露堆栈;成功展示可变时长说明 | H5 与小程序报告页行为一致 | | **D3** | **弱网 / 失败重试** | 报告主接口失败:**按钮「重新加载」**;超时阈值产品建议 **8~10s** 后出失败态 | 与《产品全方位优化说明》§3.3 | --- ## E. 传播与埋点(P0 最小集) | ID | 需求 | 验收标准 | 备注 | |----|------|----------|------| | **E1** | **分享卡片元信息规则** | 小程序 `onShareAppMessage`:标题 **宠物名 + 服务 + 门店**;封面优先级 **成片封面 > 服务后首图 > Logo**(与 `reportShare.js` 逻辑对齐) | 见 `frontend/src/utils/reportShare.js` | | **E2** | **埋点:报告打开** | 至少上报:`report_token` 或匿名 hash、**首次/再次**(可用本地 storage 记首次)、时间戳;落地页 H5 亦要能报(像素/接口二选一,研发定方案) | 不要求看板,要求 **可统计**《本期主线》 | --- ## F. 视觉与规范(工程债) | ID | 需求 | 验收标准 | 备注 | |----|------|----------|------| | **F1** | **禁止业务页硬编码主色** | 主色/品牌浅底统一 `var(--c-brand)`、`var(--c-brand-light)` 等;全局 grep `#16a34a`、`#2db96d`(除 `global.css` / 极少量渐变定义)**业务 vue 内为 0** | 《前端 UI 规范》已对齐 `--c-*` | | **F2** | **空态禁用 emoji 作主视觉**(若违反现有 UI 禁止项) | 宠主空态等用 `AppIcon` 或插图占位,不用 📋 等作为主视觉 | 见 `Home.vue` 空态 slot | --- ## G. 文案与对外承诺(配置级) | ID | 需求 | 验收标准 | 备注 | |----|------|----------|------| | **G1** | **无容量模型不写「排队」** | 全局检索「排队」「不排队」;宠主副标题等改为不承诺排队能力的表述(如「在线选时段」) | 与《产品全方位优化说明》D2 一致 | | **G2** | **对内录单表述(可选)** | 门店端新建预约入口文案是否改为「代客预约」由产品拍板;若改则全局统一 | 降低「预约」歧义 | --- ## 建议排期顺序(供研发参考) 1. **A1~A3**(后端状态机)— 防脏数据,优先合。 2. **B1**(已完成 Tab)— 前端小改、用户感知强。 3. **B2、D1、D2、E1**(传播与报告体验)— 主线门面。 4. **C1~C4**(宠主)— 与登录/路由并行可排。 5. **E2、F1、F2、G1** — 可并行或插空。 --- ## 不在 P0(勿与本清单混排) - 会员卡 / 储值 / 次卡 - 报告 token **作废重发**(中期,见 D3 决策) - 多技师分成、排班深度联动 - 复杂数据看板、漏斗大屏 - 分包优化(可 P1) --- *评审后可将本页 ID 勾进看板;与专文冲突以迭代评审为准。*