工单模块核心是状态机驱动的生命周期管理,含待提交、已提交、已受理等7个枚举状态,变更须经统一入口并校验;主表ticket_info联合comment、attachment表支撑业务;权限按角色隔离,分配支持自动轮询与手动转派;通过事件机制和缓存预留SLA、IM集成等扩展能力。

Java项目中开发反馈工单模块,核心在于理清业务流程、划分角色权限、设计可扩展的数据模型,并通过状态机驱动工单生命周期。不追求大而全,重在清晰、可控、易维护。
工单核心状态与流转逻辑
工单不是静态记录,而是有明确生命周期的状态对象。典型状态包括:待提交 → 已提交 → 已受理 → 处理中 → 待验证 → 已关闭 → 已驳回。每个状态变更需触发对应动作(如发通知、校验权限、记录操作日志)。
- 用枚举定义状态,避免字符串硬编码;例如 OrderStatus.SUBMITTED、OrderStatus.PROCESSING
- 状态变更必须走统一入口(如 ticketService.transition(ticketId, targetStatus)),禁止直接更新数据库字段
- 关键状态跳转加业务校验:比如“已关闭”不可退回“处理中”,“待验证”前必须是“处理中”
数据模型设计要点
一张主表 + 若干关联表即可支撑大多数场景,避免过度分表或嵌套。
- ticket_info:存基础字段(id、title、content、status、creator_id、assignee_id、category、priority、create_time、update_time)
- ticket_comment:支持多轮沟通,含 is_internal(是否仅内部可见)、operator_id
- ticket_attachment:存文件元信息(original_name、storage_path、file_size),实际文件走对象存储
- 分类(category)和优先级(priority)建议用字典表管理,方便后台配置,不写死代码
权限与分配机制
谁能看到、谁能操作、谁来处理——这是工单模块安全与效率的关键。
立即学习“Java免费学习笔记(深入)”;
- 普通用户只能查看自己提交的工单;客服/技术支持角色可查本组全部;管理员全局可见
- 自动分配可用简单策略:按部门轮询、按当前负载(查在线坐席数)、按技能标签匹配(如“支付问题”→ 分配给支付组)
- 支持手动转派 + 转派理由必填,所有分配动作记入操作日志表(operator_id、before_assignee、after_assignee、reason)
轻量但实用的扩展能力
初期不必做工作流引擎,但要预留钩子,便于后续接入审批、SLA、集成IM等。
- 每个状态变更后触发事件(如 OrderStatusChangedEvent),用 Spring Event 或自定义发布器解耦
- SLA倒计时可存在缓存(Redis)中,状态变更为“已受理”时启动,超时则自动升为“紧急”并推送告警
- 对外提供标准 REST 接口(如 POST /api/tickets/{id}/comment),供企业微信、钉钉机器人调用,实现消息互通
基本上就这些。工单模块不复杂,但容易忽略状态一致性、权限边界和操作可追溯性。从最小闭环做起(提交→受理→回复→关闭),再逐步叠加通知、统计、集成能力,比一上来堆功能更稳妥。










