# 2026-07-26 ## 修复 `pages/order/delivery.vue` 身份证上传失败 Bug **用户报告**:页面提交时弹"请上传身份证正面照片.FAILUREFP03333"。 **根因分析**: - 错误码 `FAILUREFP03333` 和提示文本"请上传身份证正面照片"都是后端 `POST /open/equipment/receipt` 返回的,前端代码无此内容。 - `orderSourceData` 数组下标与图片含义是固定绑定:0=身份证正面、1=身份证反面、2=人车合照、3=车子照片、4=安装照片。 - 截图里只看到"其他"模块 3 张图,未见"身份证信息"模块——用户大概率跳过了身份证正反面上传就点了提交。 **修复内容**(`pages/order/delivery.vue`): 1. 在 `handleSubmit` 提交前增加客户端必传校验:5 个图片槽位任一为空就拦截,并按"身份证正面 > 身份证反面 > 其他"优先级提示用户补图。 2. 过滤后端返回的错误码尾巴(如 `.FAILUREFP03333`),新增 `formatErrorMsg()` 工具函数。 3. 优化占位图:未上传时显示"+ 点击上传身份证正面(人像面)"等说明,替代原来的灰色 `not-dealer.png` 占位。 4. `chooseImage` 加 `uni.showLoading` 上传中提示,成功/失败分别 toast 明确文案。 5. 字段标签明确化:"正面/反面"→"身份证正面(人像面)/身份证反面(国徽面)"。 **关于 `FAILUREFP03333` 的判断**: - 非前端错误码(前端 grep 无任何匹配)。 - 推测是后端在调用阿里云内容安全 / 第三方 OCR(Face++、百度、腾讯云天御等)做身份证内容审核时返回的状态码。 - 真正根因在后端,前端只能加校验和友好提示,无法根本解决"图片本身被识别为非身份证"的场景。 - 建议后端同事确认 `/open/equipment/receipt` 接口的身份证正反面校验逻辑,以及是否依赖第三方图片识别服务。 ## 后端 `yunxinwei-api` 同步修复(FAILUREFP03333 根因) **项目路径**:`/Users/gxwebsoft/JAVA/yunxinwei-api` **文件**:`src/main/java/com/gxwebsoft/open/controller/OpenEquipmentController.java` **根因确认**: - `receipt()` 接口(原 402-461 行)调用 `idcardService.verify(front, back)` 做阿里云市场 OCR(`miitangs14.market.alicloudapi.com/v1/tools/ocr/idCard`),非 `FP00000` 时把 `verify.getMessage() + verify.getCode()` 直接拼进用户提示 → 用户看到"请上传身份证正面照片.FAILUREFP03333"。 - `idcardService.verify` 在 OCR 接口异常时返回 `null`,原代码紧接着 `verify.getCode()` 会 NPE → 500。 - `images.get(0/1)` 在图片不足 2 张时会 `IndexOutOfBounds`;用户跳过身份证上传只传 3 张其他图时,`images[0]` 被当成身份证人像面去 OCR → 失败但提示语仍是"请上传身份证正面照片"。 **修复内容**: 1. 抽出私有方法 `verifyIdCard(orderSourceData, order)`,把身份证识别与实名回填逻辑内聚。 2. JSON 解析加 try-catch,失败返回"身份证图片数据格式有误"。 3. 校验 `images` 至少 2 张且 `images[0]`/`images[1]` 非空,否则返回"请上传身份证正面和反面照片"(不再越界)。 4. `verify` 调用加 try-catch + `null` 判断,避免 NPE;OCR 异常返回友好提示。 5. **内部错误码 `FAILUREFP03333` 不再回吐给用户**,仅 `log.warn` 记录;用户提示改为"身份证正面照片识别失败,请重新上传清晰的身份证人像面照片" / "身份证反面照片识别失败,请重新上传清晰的身份证国徽面照片"。 6. `userService.getById(...)` 补 `null` 防护,避免回填空指针。 **验证**:`./mvnw -o -q compile` 离线编译通过(EXIT=0,依赖已本地缓存)。 **前后端配合结论**:前端(delivery.vue)做提交前必传校验 + 友好占位,后端(OpenEquipmentController)做空安全 + 内部码隔离 + 分正反面提示,两端共同消除该 Bug。