阅读文本 / 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