240 lines
15 KiB
Markdown
240 lines
15 KiB
Markdown
# 后端线上联调故障与数据准备清单
|
||
|
||
收件人:后端开发、运维、测试负责人
|
||
|
||
整理日期:2026-09-09
|
||
|
||
前端项目:`jiapuapp`
|
||
|
||
后端源码:`C:\Users\Rain\Desktop\job\Genealogy`
|
||
|
||
参考项目:`C:\Users\Rain\Desktop\job\Jiapu-App`
|
||
|
||
本文只汇总当前仍需要后端、运维或测试环境处理的有效问题。已经由前端完成的问题不再重复要求后端开发,历史文档与本文冲突时以本文为准。
|
||
|
||
## 问题一(P0):线上世系排行接口成功但返回空数组
|
||
|
||
### 2026-09-09 后端更新后复验
|
||
|
||
前端拉取后端最新更新、重新编译并同步到 MuMu 后,该问题仍未解决:
|
||
|
||
- 测试成员:`MANUALCHILD01`;
|
||
- 成员条件:第 2 世、男性(前端请求参数为 `generation=2&sex=0`);
|
||
- 编辑成员页“排行称谓”显示“暂无可选排行”;
|
||
- 返回树状图后,该成员节点仍显示“排行待补”;
|
||
- 同一页面的成员详情、父亲关系等数据均能正常读取,因此不是整个成员详情页或登录会话失效。
|
||
|
||
前端状态逻辑会把接口异常显示为“暂时无法读取”,把成功返回的空列表显示为“暂无可选排行”。本次 MuMu 实际显示的是后者,说明请求流程已经完成,但当前条件没有取得任何可用排行记录。该判断来自页面状态;下方 2026-09-04 的四组 JSON 是此前直接请求接口取得的响应证据。
|
||
|
||
请后端本次不要只确认“接口代码已存在”,需要在**已部署环境、当前租户和当前测试家谱**下实际请求并回传脱敏响应。至少验证:
|
||
|
||
```text
|
||
GET /genealogy/app/genealogies/{genealogyId}/lineage/ranks?generation=1&sex=0
|
||
GET /genealogy/app/genealogies/{genealogyId}/lineage/ranks?generation=2&sex=0
|
||
GET /genealogy/app/genealogies/{genealogyId}/lineage/ranks?generation=2&sex=1
|
||
```
|
||
|
||
其中第二世男性结果必须包含“长子、次子”等,第二世女性结果必须包含“长女、次女”等;只返回 `code=200` 但 `data=[]` 仍视为未解决。
|
||
|
||
### 当前现象
|
||
|
||
前端已接入正式接口:
|
||
|
||
`GET /genealogy/app/genealogies/{genealogyId}/lineage/ranks?generation={generation}&sex={sex}`
|
||
|
||
2026-09-04 使用 MuMu 当前有效登录会话,针对联调家谱 `2086296260134936577`、租户 `000000` 直接请求线上环境。接口没有报错,所有请求均返回业务成功,但 `data` 是空数组:
|
||
|
||
```text
|
||
generation=1&sex=0 -> {"code":200,"msg":"操作成功","data":[]}
|
||
generation=2&sex=0 -> {"code":200,"msg":"操作成功","data":[]}
|
||
generation=2&sex=1 -> {"code":200,"msg":"操作成功","data":[]}
|
||
generation=2&sex=2 -> {"code":200,"msg":"操作成功","data":[]}
|
||
```
|
||
|
||
这不是前端未发请求、鉴权失败或响应解析失败。普通成员因此无法选择“长子、次子、三子”等排行,人物保存后也没有可回显的 `rankId`、`rankName`。世系树只能显示“排行待补”,无法准确显示其与上一辈的排行关系。配偶不使用排行选项,仍由世系树的 `spouses` 结构显示“配偶”。
|
||
|
||
### 已核对的后端逻辑
|
||
|
||
后端接口与查询实现均已存在:
|
||
|
||
- `AppLineagePersonController.rankOptions` 接收 `genealogyId`、`generation`、`sex`;
|
||
- `AppLineagePersonServiceImpl.rankOptions` 完成家谱查看权限校验后查询排行配置;
|
||
- `LineageRankConfigServiceImpl.queryOptions` 只返回 `status=0`、性别适用且排行类型匹配的数据;
|
||
- 第一世查询 `rank_type=ANCESTOR`,其他世代查询 `rank_type=GENERATION`;
|
||
- 查询表为 `gen_lineage_rank_config`。
|
||
|
||
当前代码中的 `genealogyId` 只用于权限校验,实际排行查询没有按家谱 ID 过滤,而是读取当前租户下的公共排行配置。因此本问题优先检查租户 `000000` 的全局排行配置和租户拦截条件,不要只检查联调家谱本身。
|
||
|
||
仓库中的 `script/sql/update/2026-07-29-genealogy-lineage-generation-rank.sql` 已定义 37 条默认数据:1 条“始祖”、18 条男性排行、18 条女性排行。现有 2026-08-03 数据库备份中该表结构存在,但记录区为空。这与线上接口返回空数组一致,需由后端或运维核对线上库,不能由前端硬编码排行数据。
|
||
|
||
### 后端/测试数据处理要求
|
||
|
||
1. 先在**线上实际租户库**执行以下只读检查,确认数据是缺失、停用还是被逻辑删除:
|
||
|
||
```sql
|
||
select rank_id, tenant_id, rank_code, rank_name, rank_type,
|
||
gender_scope, rank_order, sort_order, status, del_flag
|
||
from gen_lineage_rank_config
|
||
where tenant_id = '000000'
|
||
order by rank_type, gender_scope, rank_order;
|
||
```
|
||
|
||
2. 若记录不存在,先备份线上表,再按发布流程执行并核验 `2026-07-29-genealogy-lineage-generation-rank.sql`;不要直接在前端写死“长子、次子”等数据;
|
||
3. 若记录存在,检查 `status='0'`、`del_flag='0'`、`rank_type` 和 `gender_scope` 是否满足查询条件,并检查租户隔离是否错误过滤 `000000` 数据;
|
||
4. 第一世至少返回“始祖”,其他世代按性别返回“长子、次子、长女、次女”等可用选项;
|
||
5. 保存人物 `rankId` 后,人物详情和世系树必须回显一致的 `rankId`、`rankName`;
|
||
6. 已停用、已删除或不适用当前性别的排行不得出现在可选列表中;
|
||
7. 增加线上同结构数据库的集成测试,防止只验证 Mock 数据而没有验证迁移结果。
|
||
|
||
### 验收标准
|
||
|
||
- 第二世男性请求返回至少一个男性排行选项,且包含稳定的 `rankId` 和非空 `rankName`;
|
||
- 第一世请求返回“始祖”,第二世女性请求返回“长女、次女”等女性排行;
|
||
- 前端选择并保存后,重新进入调整排行页面仍选中原值;
|
||
- 返回世系树后节点显示保存的排行名称,不再出现“后代”兜底文案。
|
||
|
||
## 问题二(待部署验收):我的家谱真实创建时间
|
||
|
||
### 当前现象
|
||
|
||
新版家谱首页需要在家谱卡片中展示“创建于”。此前以下两个正式接口只返回当前用户的加入时间 `joinTime`,没有返回家谱创建时间 `createTime`:
|
||
|
||
- `GET /genealogy/app/genealogies/mine`
|
||
- `GET /genealogy/app/genealogies/{genealogyId}`
|
||
|
||
`joinTime` 表示用户加入家谱的时间,不能替代家谱创建时间。
|
||
|
||
2026-09-05 更新:后端提交 `0e8d094` 已增加只读 `createTime`,前端也已完成响应保留和“创建于”展示。当前仅等待后端部署后进行真实接口验收;线上网关现阶段返回 502,尚不能判定线上完成。
|
||
|
||
### 后端处理要求
|
||
|
||
1. 由家谱响应模型统一拥有只读字段 `createTime`,我的家谱列表和家谱详情使用同一字段定义;
|
||
2. 字段取家谱记录的真实创建时间,不取成员关系创建时间或 `joinTime`;
|
||
3. 创建时间由服务端生成,创建后不可被客户端修改;
|
||
4. 已有家谱需要从现有家谱数据的创建时间完整回读,不允许只对新建家谱生效;
|
||
5. 同步更新正式 App OpenAPI、响应示例和接口契约测试。
|
||
|
||
### 验收标准
|
||
|
||
- 两个接口均稳定返回非空 `createTime`;
|
||
- 同一家谱在列表和详情中的 `createTime` 完全一致;
|
||
- 不同时间加入同一家谱的成员读取到相同的 `createTime`,但各自的 `joinTime` 可以不同;
|
||
- 编辑家谱名称、地区或简介后,`createTime` 不发生变化;
|
||
- 前端接入后将卡片文案由“加入于”调整为“创建于”。
|
||
|
||
## 当前待办总览
|
||
|
||
本清单已按后端最新源码重新核对,旧文档中的以下事项已经不再列为后端待办:
|
||
|
||
- `AppGenealogyVo` 已有稳定家谱编号 `genealogyNo`,前端已接入保留;
|
||
- 功德记录已经具备请求字段 `mediaOssIds` 和响应字段 `mediaFiles`;
|
||
- 谱文、成长记录、重要证件已经分别具备内容密码设置、解除、验证和短信找回接口;
|
||
- 前端可以用现有单条删除接口完成批量管理,不要求后端新增批量删除接口;
|
||
- 先前的“我的家谱无法读取”和合规文档接口异常已不再作为本轮待办。
|
||
|
||
当前需要后端、运维或测试环境处理的事项共五类:
|
||
|
||
| 优先级 | 事项 | 责任方 | 是否阻塞对应功能验收 |
|
||
| --- | --- | --- | --- |
|
||
| P0 | 世系排行接口返回空数组 | 后端/运维 | 是 |
|
||
| 待部署 | 家谱真实创建时间 | 后端/运维 | 是 |
|
||
| 待部署 | 谱文正文多图片保存与回显 | 后端/运维 | 是 |
|
||
| P1 | 应用推广 HTTPS 分享地址配置 | 后端/运维 | 是 |
|
||
| P1 | 联调环境缺少可点击业务数据 | 后端/测试/运营 | 是 |
|
||
|
||
## 问题三(待部署验收):谱文正文多图片保存与回显
|
||
|
||
### 1. 参考项目行为
|
||
|
||
参考项目 `pages/index/puwen/add.vue` 的谱文新增和编辑表单使用图片上传组件,维护 `form.imgs` 图片数组;谱文不仅有文字正文,也允许上传、删除和回显多张正文图片。
|
||
|
||
### 2. 最新实现状态
|
||
|
||
2026-09-05 更新:后端提交 `0e8d094` 已增加 `mediaOssIds`、`mediaFiles` 及文件引用和回收站处理;前端已完成正文多图添加、编辑回显、单图移除、顺序提交和详情预览。当前剩余事项是执行后端三段迁移、部署并使用真实 OSS 数据验收。
|
||
|
||
后端其他内容类型已经采用统一媒体契约,可直接沿用该方式。例如 `AppMeritRecordBody.mediaOssIds` 使用英文逗号分隔的正整数 OSS 编号,`AppMeritRecordVo.mediaFiles` 返回授权后的文件访问对象列表。
|
||
|
||
### 3. 后端处理要求
|
||
|
||
1. 数据库为谱文增加正文媒体 OSS 编号字段,名称和类型与现有内容媒体模型保持一致;
|
||
2. `Article`、创建/更新 DTO、查询 VO、Mapper 和 Service 同步增加对应字段;
|
||
3. 请求字段使用 `mediaOssIds`,格式与现有内容接口保持一致:空字符串表示清空,多项为英文逗号分隔的正整数 OSS 编号;
|
||
4. 响应字段使用 `mediaFiles`,类型为 `List<BusinessFileAccessVo>`,不得把数据库中的 OSS 编号直接暴露成可访问地址;
|
||
5. 封面 `coverFile` 与正文图片 `mediaFiles` 分开管理:封面用于列表缩略图,正文图片用于详情展示;
|
||
6. 创建、编辑、移入回收站、恢复和永久删除时,同步维护业务文件引用,避免文件被误删或形成无主引用;
|
||
7. 同步更新正式 App OpenAPI、字段格式校验、HTTP 契约测试和数据库事务测试。
|
||
|
||
涉及接口:
|
||
|
||
- `POST /genealogy/app/genealogies/{genealogyId}/articles`
|
||
- `PUT /genealogy/app/genealogies/{genealogyId}/articles/{articleId}`
|
||
- `GET /genealogy/app/genealogies/{genealogyId}/articles`
|
||
- `GET /genealogy/app/genealogies/{genealogyId}/articles/{articleId}`
|
||
|
||
### 4. 验收标准
|
||
|
||
- 新建谱文上传至少三张正文图片,保存后列表封面正常,详情按提交顺序显示三张正文图片;
|
||
- 编辑时删除一张、保留一张、新增一张,重新读取结果准确且顺序稳定;
|
||
- 提交 `mediaOssIds=""` 后正文图片清空,但 `coverFile` 不受影响;
|
||
- 无文件访问权限时不得返回可用下载地址;
|
||
- 谱文进入回收站和恢复后,正文图片引用保持一致;永久删除后按现有文件生命周期规则清理引用。
|
||
|
||
## 问题四(P1):应用推广缺少可用的 HTTPS 分享地址
|
||
|
||
涉及接口:`GET /genealogy/app/referrals/me`
|
||
|
||
后端 `ReferralService.buildShareUrl` 依赖当前租户启用品牌配置中的 `h5Domain`。请核对联调租户的品牌配置,确保:
|
||
|
||
- `h5Domain` 非空;
|
||
- 使用可公开访问的 HTTPS 地址;
|
||
- 地址指向真实 H5 注册流程;
|
||
- 服务端生成的 `shareUrl` 携带推荐凭据,但不直接暴露内部用户编号。
|
||
|
||
验收标准:接口返回 `code=200`,并包含稳定的 `referralCode`、邀请人数、分享标题、分享文案和 HTTPS `shareUrl`;前端可据此生成二维码、复制链接并进入带推荐关系的注册流程。
|
||
|
||
## 问题五(P1):联调环境缺少完整可点击业务数据
|
||
|
||
以下项目已有前端页面和接口调用,但仅有空数据时无法完成图片预览、视频播放、内容密码、编辑和删除等点击回归。请为同一测试账号、同一家谱准备最小数据:
|
||
|
||
| 数据类型 | 最小验收数据 |
|
||
| --- | --- |
|
||
| 家族动态 | 一条纯文字动态、一条带图片动态 |
|
||
| 谱文 | 一篇带封面和正文多图的普通谱文、一篇已设置内容密码的谱文 |
|
||
| 礼仪活动 | 一条带封面活动,并包含可查看的献礼记录 |
|
||
| 家族视频 | 一条带封面且视频文件可播放的数据 |
|
||
| 平台宣传视频 | `home_featured`、`video_center` 各至少一条带封面且可播放的数据 |
|
||
| 功德记录 | 一条带金额和至少两张图片的数据 |
|
||
| 家族备忘 | `general`、`benefactor` 各至少一条带图片的数据 |
|
||
| 亲友往来 | 一条带图片的记录 |
|
||
| 成长记录 | 一条带图片的普通记录、一条已设置内容密码的记录 |
|
||
| 重要证件 | 一份带图片的普通证件、一份已设置内容密码的证件 |
|
||
| 家族相册 | 一个至少包含两张可预览图片的相册 |
|
||
|
||
所有文件响应必须通过 `BusinessFileAccessVo` 返回当前账号可访问的 HTTPS 地址,不能只返回 OSS 编号。
|
||
|
||
## 前端已经完成,不需要后端重复开发
|
||
|
||
1. 谱文、成长记录、重要证件的新建表单已支持选填 8 至 128 位内容密码;前端先创建内容,再调用现有内容保护接口。第二步失败时会明确提示“内容已创建、当前可能尚未受密码保护”,不会重复创建;
|
||
2. 谱文、家族视频、礼仪、功德记录、亲友往来、家族备忘、成长记录和重要证件列表已补批量管理;只允许选择具有删除权限的内容,逐条调用现有删除接口,失败项保留选择;
|
||
3. 我的家谱响应已保留后端返回的 `genealogyNo`;
|
||
4. 宣传视频无封面时使用可点击占位封面,点击后进入播放器,不再在首页直接铺开播放器;
|
||
5. 首页结构、浅色页面底色、固定双图内容区、底部导航名称和家族内容归位均已在前端完成;
|
||
6. 出生日期选择器已经限制未来年份和未来月份,不需要后端修改日期接口;
|
||
7. 世系树头像框、姓名、排行标签、配偶标签和节点布局已经按参考项目调整;后端只需解决排行选项及 `rankId`、`rankName` 回显;
|
||
8. 前端已通过项目页面、审计回归、导航恢复、参考功能映射和运行时资产检查。
|
||
|
||
## 后端完成后请回传
|
||
|
||
1. 后端提交编号和联调环境部署时间;
|
||
2. `gen_lineage_rank_config` 的线上检查结果、补数或迁移记录,以及四组排行请求的脱敏响应;
|
||
3. 家谱列表和详情接口新增 `createTime` 后的脱敏响应;
|
||
4. 谱文媒体字段的数据库迁移名称及后置检查结果;
|
||
5. 更新后的正式 App OpenAPI;
|
||
6. 谱文多图创建、更新、清空、回收站和恢复的自动化测试结果;
|
||
7. `/referrals/me` 的脱敏响应示例;
|
||
8. 测试数据所属家谱编号、各资源编号和测试账号权限说明。
|
||
|
||
建议后端按“问题一 → 问题二 → 问题三 → 问题四 → 问题五”的顺序处理。问题一是当前世系树排行功能的直接阻塞项,补齐数据后即可由前端在 MuMu 上复验;问题二和问题三涉及正式响应契约,需要同时更新运行时代码、OpenAPI 和测试;问题四、问题五主要是线上配置与联调数据准备。
|
||
|
||
最终以同一部署环境中的实际接口响应和 MuMu 点击回归为准,不能只以“代码已提交”或“自动测试通过”作为联调完成依据。
|