# 摊位资质提交与平台审核 **工作分支**:`test-202609v2`,沿用现有分支,不创建新分支。 **创建日期**:2026-10-09 **进度**:已验证(本地定向测试、构建及静态审查;全量回归保留1项既有泰文失败);最新商品图片上传增量尚未提交/推送。此前提交以 Git 记录为准,SQL 未执行,未部署联调。见 `tasks.md` 和 `quickstart.md`。 **输入**:夜市主创建摊位及摊主账号;摊主登录后自行提交认证资料,由平台审核。认证归属摊位,独立于登录账号;使用认证主表和申请记录表。所有摊位使用完全相同的资料项目,不区分个人经营或公司经营。 ## 已确认范围与建议口径 - 已确认:认证归属 `storeId`;一个摊位可由多个账号共同管理,认证资料只有一套。 - 已确认:采用 `stall_qualification` 和 `stall_qualification_application` 两张表,保留审核历史及当前有效版本。 - 已确认:所有摊位使用同一表单、同一必填规则、同一审核流程。不得新增个人/公司经营类型,不得按经营主体类型隐藏字段或改变校验。 - 第一版采用简化的统一表单和人工审核;不收集商业/税籍登记、保险等补充证明,不做自动查证或证照到期提醒。 - 用户未要求修改商家 App;本期页面范围为商家 PC 端和平台管理端。 ## 统一审核资料 | 项目 | 来源/归属 | 建议提交要求 | |---|---|---| | 所属夜市、摊位名称、摊位地址 | 读取 `pos_store`,提交时由服务端固化快照 | 系统关联;摊主不能改写夜市或摊位归属 | | 负责人姓名 `responsibleName` | 申请资料 | 必填 | | 联系手机号 `contactPhone` | 申请资料,与账号登录手机号分别管理 | 必填 | | 身份证/护照号码 `identityNumber` | 申请资料 | 必填 | | 身份证/护照照片 `identityImageUrls` | 商品上传图片路径数组,兼容旧私有引用 | 必填,证件照片应完整清晰 | | 摊位现场照片 `stallImageUrls` | 商品上传图片路径数组,兼容旧私有引用 | 必填 | | 食品业者登录字号 `foodRegistrationNumber` | 申请资料 | 统一作为平台入驻必填项 | | 食品业者登录证明 `foodRegistrationImageUrls` | 商品上传图片路径数组,兼容旧私有引用 | 统一作为平台入驻必填项 | 这份表格只定义平台入驻审核所收集的四组资料:负责人姓名/电话、身份证明、摊位信息/照片、食品业者登录字号/证明。不收集商业/税籍登记、保险等补充证明,不代表免除经营者依法应履行的义务;食品登录必填属于平台准入标准,不宣称台湾所有摊贩依法都必须具备。首期不新增董监事截图、UBO 声明等公司专属项目。银行卡、收款账户及支付凭证继续由现有支付配置维护,不在认证模块重复建立收款配置。 ## 用户场景与验收 ### US1:摊主补充并提交资料(P1) 夜市主创建摊位及关联账号,摊主可登录并填写认证草稿。提交时校验统一必填资料、账号启用状态及摊位归属。提交后的资料成为确定版本,不能被普通资料修改接口覆盖。 验收:缺失必填材料拒绝提交;保存草稿允许不完整;其他摊位账号提交请求必须拒绝;同一摊位多个账号并发保存时不得静默覆盖;重复提交不得产生多条待审核申请。 ### US2:平台审核与驳回重提(P1) 有审核权限的平台管理员查看所属夜市、摊位、申请材料及提交人,执行通过或驳回;驳回原因必填。审核同一版本只允许成功一次。驳回后以新版本重新填写,不修改既有审核记录。 验收:无审核权限拒绝访问申请详情或执行审核;通过后主表指向该申请;驳回后保留材料及原因;重复或并发审核不得产生冲突结果。按用户最新确认,新图片链接本身公开访问,不受审核详情权限保护。 ### US3:查看认证进度与有效资料(P2) 摊主查看自己摊位的草稿、申请状态、驳回原因和历史;夜市主查看旗下摊位认证进度;负责人证件及附件不在公开摊位接口和夜市进度列表中返回。已通过的认证在重新提交期间保持原有效版本,新申请通过才切换。 验收:查看其他摊位申请拒绝;账号停用后无法继续操作;新申请驳回不覆盖此前有效资料;账号更换不删除摊位认证。 ## 功能要求 - FR-001:认证以摊位 ID 唯一关联;账号是提交/操作身份,不是资质归属主体。 - FR-002:所有摊位材料项目和提交校验完全一致,不设置经营主体分类字段或分类分支。 - FR-003:草稿、待审核、通过、驳回必须清晰展示;申请状态不能与当前有效资质混为一谈。 - FR-004:提交后材料不可变;通过、驳回均保存操作人和时间;驳回保存原因。 - FR-005:同一摊位至多一个待审核申请;保存、提交及审核使用版本/条件更新保护。 - FR-006(2026-10-09 最新确认):新材料复用商品 `/utils/Upload`,申请保存 `/profile/upload/...` 图片路径数组,不保存图片二进制。用户明确确认身份证等全部材料知道链接即可直接访问。旧私有引用保留原鉴权读取,不迁移文件或回写历史申请。 - FR-007:后端校验类型 4 账号真实绑定的 `storeId` 和账号/摊位有效状态;平台按权限操作。 - FR-008:旧 `InfoUser.auditStatus` 不能作为摊位资质审核通过的依据,普通商家及骑手原审核功能不受此模块替换。 - FR-009:新摊位和存量摊位统一在材料审核通过后才允许正式营业和承接新订单;已存在订单的履约不能被认证状态变更阻断。 - FR-010:存量摊位必须补齐相同材料并通过审核;不得从旧账号审核状态自动推定通过,不设置自动通过或营业宽限期。 - FR-011:申请姓名、电话、证件号码和材料不写入公共日志;申请详情及审核仍按权限访问,不向公开摊位/夜市进度查询暴露这些字段。新上传图片链接公开访问是用户确认的例外;商家端、平台端新增文本统一提供四语言。 - FR-012:DDL、权限菜单及必要数据处理 SQL 仅登记 `updatesql/sql.md`,不直接执行数据库迁移。 - FR-013(2026-10-09 按用户确认改用通用组件):商家资料页直接使用商品同款 `el-upload`(action 指向 `/utils/Upload`)与 `el-image` 展示,不再维护自建图片组件;平台审核页直接使用共享 `ImagePreview`。保持每类最多 5 张、上传中禁止表单提交、待审核不可编辑;新图片直接按公共路径展示,旧图片仍由页面内 blob 兼容鉴权读取;JPEG/PNG MIME 参数应识别,JSON/HTML 不渲染为图片。 - FR-014:保存/提交只接受系统公共上传目录内实际存在的 JPEG/PNG 图片(不超过 5MB、解码面积不超过 2000 万像素)或本摊位合法旧私有引用。拒绝外部 URL、目录穿越、缺失文件、伪图片和其他格式。通用上传接口调用方式不变,其后端文件名生成处把 `/ \ : * ? " < > | ; # % ,` 与控制字符规范为 `_`(CJK 保留),保证上传产物可直接作为公共路径保存和预览。 ## 存量上线规则(2026-10-09 用户确认) 存量摊位与新摊位一样补材料审核,通过前不得营业或创建新订单。部署必须先执行本模块 DDL,再发布门禁代码;无认证记录也视为未通过,不根据旧账号审核状态自动通过。既有订单的出餐、配送、支付后续处理不受此门禁阻断。 ## 成功标准 - 摊主可完成保存草稿、提交、查看审核结果、驳回重提的闭环。 - 平台可核对每个材料版本及对应审核结果,修改和并发不丢失历史。 - 对其他摊位的材料查询、修改及审核请求均被服务端拒绝。 - 同一摊位增加或停用管理账号不改变已通过资质。