# 用户审核不通过原因

## 背景

平台目前只支持“待审核”和“审核通过”两种用户审核状态，管理员无法明确记录商家或骑手资料审核不通过的原因。后续用户端需要根据审核结果提示用户补充资料，但本次不修改 App 前端。

## 目标

- 用户审核状态增加“审核不通过”。
- 管理员审核商家或骑手资料不通过时，必须输入具体原因。
- 原因随用户信息返回，供后续 App 展示和资料补充流程使用。

## 数据模型

- `info_user.audit_status` 状态语义：
  - `0`：待审核。
  - `1`：审核通过。
  - `2`：审核不通过。
- `info_user` 新增 `audit_reject_reason TEXT NULL`，Java 属性名为 `auditRejectReason`。
- 不对审核不通过原因设置应用层字符数限制。
- 当审核状态不是 `2` 时，保存操作必须将 `audit_reject_reason` 清空，避免旧原因与当前状态不一致。

## 平台管理端

- 修改商家审核页 `sjuser.vue` 和骑手审核页 `peisus.vue`。
- 审核状态选项增加“审核不通过”。
- 选择“审核不通过”时显示多行文本输入框，由管理员按实际情况自由填写。
- 原因去除首尾空白后为空时禁止提交，并显示国际化错误提示。
- 选择“待审核”或“审核通过”时隐藏原因输入框，提交前清空旧原因。
- 新增用户可见文本必须补齐简体中文、繁体中文、英文和越南语。

## 后端行为

- 平台新增和修改用户接口继续使用 `POST /infouser/user`、`PUT /infouser/user`，两者执行同一审核原因校验。
- 当 `auditStatus = "2"` 时，`auditRejectReason` 去除首尾空白后必须非空；否则返回国际化业务错误，不更新用户。
- 当 `auditStatus` 不等于 `"2"` 时，后端主动将 `auditRejectReason` 设为 `null`，不能只依赖前端清理。
- 用户列表、平台用户详情和 App 用户信息接口沿用现有 `InfoUser` 返回结构，新增返回 `auditRejectReason`。
- App 资料更新接口 `/infouser/user/setuser` 不接受客户端提交的审核状态，防止用户自行改变审核结果。
- `/infouser/user/setuser` 接收非持久化标记 `updateUserInfo`；仅当资料保存成功、该标记为 `true` 且数据库当前审核状态为 `2` 时，将审核状态原子更新为 `0` 并清空 `auditRejectReason`。
- `updateUserInfo` 为 `false`、`null`，或用户当前并非审核不通过时，不改变审核状态。
- Entity、MyBatis `resultMap`、查询、插入和更新映射全部补齐该字段。

## 数据库变更

- 只将迁移 SQL 写入 `updatesql/sql.md`，不直接执行数据库变更。
- SQL 为 `info_user` 新增 `audit_reject_reason TEXT NULL`。
- 为 `sys_user_audit` 字典新增值 `2`，标签为“审核不通过”，供平台审核状态选项使用。

## 验收标准

1. 商家和骑手审核页均能选择“审核不通过”。
2. 选择“审核不通过”但未填写有效原因时，前端和后端都拒绝保存。
3. 填写原因后可以保存，重新打开用户资料时能正确回显。
4. 将状态改为“待审核”或“审核通过”后，数据库中的旧原因被清空。
5. `getuserinfo` 等返回用户信息的现有接口包含 `auditRejectReason`。
6. 本次不修改商家或骑手 App 前端。
7. 审核不通过的用户携带 `updateUserInfo=true` 成功补充资料后恢复为待审核并清空旧驳回原因；普通资料更新不改变审核状态。

## 非目标

- 不提供固定原因或预设原因选项。
- 不建立审核历史记录表。
- 不记录每次审核的管理员、时间或历史原因。
- 不实现 App 端红色提示、资料高亮或字段只读控制。
