可以,osTicket 原生就支持这么配置,而且不需要改数据库或代码。
官方文档明确说明:Ticket Status 的名称可以任意定义,但底层 State 设置为 Open 或 Closed。配置入口是:
Admin Panel → Manage → Lists → Ticket Statuses。(docs.osticket.com)
具体操作:
-
登录 osTicket 管理后台,切换到 Admin Panel(管理面板)。
-
进入 Manage → Lists。
-
找到系统内置列表 Ticket Statuses(工单状态)。
-
编辑“已解决(Resolved)”:
- 打开该状态;
- 进入 Properties(属性);
- 将 State 设置为 Closed;
- 根据需要配置“用户回复时是否允许重新打开”以及“重新打开后变成哪个 Open 状态”。当 State 选择 Closed 后,这些额外配置项才会出现。(docs.osticket.com)
-
再编辑“已关闭(Closed)”,同样把 State 设置为 Closed。(docs.osticket.com)
最终可以这样设计:
| 显示状态 | State | 建议含义 |
|---|---|---|
| 新建 | Open | 尚未处理 |
| 处理中 | Open | 运维正在处理 |
| 等待用户 | Open | 等待用户反馈 |
| 已解决 | Closed | 技术问题已经解决 |
| 已关闭 | Closed | 工单最终归档关闭 |
也就是:
新建 state = Open ↓ 处理中 state = Open ↓ 已解决 state = Closed ↓ 已关闭 state = Closed
官方文档也明确说明,自定义 Ticket Status 可以叫任何名字,但底层状态就是 Open/Closed;Closed 状态还可以配置用户回复是否重新打开工单。 (docs.osticket.com)
不过这里有一个很重要的业务设计问题:如果你把“已解决”和“已关闭”都设成 Closed,那么从 osTicket 的核心逻辑来看:
已解决 │ ├── 对 osTicket:已经是关闭类工单 │ ▼ 已关闭 │ └── 对 osTicket:还是关闭类工单
因此它们主要是业务状态上的区别,而不是 Open/Closed 生命周期上的区别。这两个状态都会被视为关闭状态,Closed 状态也只有具备“关闭工单”权限的 Agent 才能使用。(docs.osticket.com)
我更推荐你这样配置
如果你的业务流程是:
运维处理完 → 标记已解决 → 用户确认 → 最终关闭
那么建议:
新建 Open 处理中 Open 等待用户 Open 已解决 Closed 已关闭 Closed
其中再做细分:
已解决
State:Closed 允许用户回复重新打开:是 重新打开状态:处理中 / Open
适合这种场景:
运维:问题已经处理好了 ↓ 状态:已解决 用户:还是不行 ↓ 自动重新打开 ↓ 状态:处理中
已关闭
State:Closed 允许用户回复重新打开:否
适合:
问题已解决 ↓ 用户确认 / 超过确认期限 ↓ 已关闭 ↓ 流程彻底结束
这样“已解决”和“已关闭”虽然底层都是 Closed,但业务含义非常清晰。
但如果你准备做“解决时间”统计,要特别注意
你前面问的处理工时恰好会受到这个设计影响。
你真正想要的可能是:
2026-08-15 09:00 创建
↓
2026-08-15 09:10 处理中
↓
2026-08-15 11:00 已解决
↓
2026-08-16 09:00 已关闭
管理报表应该分别得到:
首次响应时间:10 分钟 解决时长: 09:00 → 11:00 = 2 小时 解决后等待确认: 11:00 → 次日09:00 = 22 小时 完整工单生命周期: 09:00 → 次日09:00 = 24 小时
而 osTicket 原生 ost_ticket 并没有同时给你 resolved_time 和 final_closed_time 两个独立字段。
所以如果你下一步准备基于 osTicket 做报表,我建议你的最终状态模型直接设计成:
新建 Open 处理中 Open 待处理 Open 等待用户 Open 已解决 Closed 已关闭 Closed
然后额外记录:
resolved_time closed_time
或者更推荐做一张工单状态变更历史表,这样以后“解决时长、关闭时长、各状态停留时长、人员处理效率、SLA”等统计都会非常好做。这个设计比单独依赖 ost_ticket.closed 更稳。