自动化交付

任务显示完成,为什么下载文件还没准备好

按钮写着“完成”,点下载却返回空文件。通常不是一个文字提示问题,而是后端只记录了算法执行结束,没有记录交付是否完成。把状态拆开,前端才有可能给出真实反馈。

阅读文本 / Reading text
本文使用合成样本演示处理方法。代码已通过隔离环境中的示例检查;这不代表对所有真实文件或产品效果的保证。处理重要文件前,请保留原件,并按文中的边界与验收项复核。 按钮写着“完成”,点下载却返回空文件。通常不是一个文字提示问题,而是后端只记录了算法执行结束,没有记录交付是否完成。把状态拆开,前端才有可能给出真实反馈。 至少区分处理、产物和验收 处理结束表示计算停止;产物就绪表示有可定位文件;验收完成表示文件满足交付协议。三者不一定在同一时刻发生。失败也应该带阶段,不能靠一个永久旋转的图标隐藏。 显式拒绝跳跃式成功 from enum import Enum class State(Enum): PROCESSING = "processing" ARTIFACT_READY = "artifact_ready" VERIFIED = "verified" FAILED = "failed" def transition(state, event): allowed = { (State.PROCESSING, "stored"): State.ARTIFACT_READY, (State.PROCESSING, "error"): State.FAILED, (State.ARTIFACT_READY, "checks_passed"): State.VERIFIED, (State.ARTIFACT_READY, "error"): State.FAILED, } if (state, event) not in allowed: raise ValueError("invalid state transition") return allowed[(state, event)] s = transition(State.PROCESSING, "stored") assert s is State.ARTIFACT_READY assert transition(s, "checks_passed") is State.VERIFIED assert transition(s, "error") is State.FAILED try: transition(State.PROCESSING, "checks_passed") except ValueError: pass else: raise AssertionError("cannot skip artifact readiness") 这个合成状态机不包含队列取消、重新审校和过期删除。生产实现应根据业务扩展,而不是把所有事件塞进“成功/失败”二选一。异步消息还可能重复或乱序,需要版本号、事务和幂等处理配合。 前端提示应与事实对应 状态 用户可以看到 可用动作 processing 正在处理 查看进度或取消 artifact_ready 正在检查结果 不提前承诺可用 verified 文件可下载 下载与查看验收说明 failed 失败阶段与原因 按原因修复或重试 下载成功也不是内容正确 HTTP 200 可能返回登录页、错误 JSON 或空白文档。验收至少应检查类型、大小、解析可用性和预期内容。对于翻译,语言完整性与术语审查是更上层的检查,不应被“文件能打开”替代。 集成翻译能力时保持状态透明 接入 OmniDoc(产品入口) 后,自有产品仍应维护自己的存储与交付状态。把平台任务完成映射为“开始接收结果”,确认文件后再显示成功,会比粗暴透传一个状态更符合用户的实际体验。 参考: Python enum 。 - 1 -
更新于 2026-10-08