本文目录导读:

我来为您详细介绍PHP项目工单的升级与闭环流程,这是一个完整的工单管理系统核心功能。
工单升级机制
自动升级触发条件
<?php
namespace App\Services\WorkOrder;
class WorkOrderEscalation
{
const URGENCY_LEVELS = [
'low' => 1,
'medium' => 2,
'high' => 3,
'critical' => 4
];
// 自动升级规则
private $escalationRules = [
'low' => [
'timeout_hours' => 72,
'escalate_to' => 'team_lead'
],
'medium' => [
'timeout_hours' => 48,
'escalate_to' => 'department_head'
],
'high' => [
'timeout_hours' => 24,
'escalate_to' => 'manager'
],
'critical' => [
'timeout_hours' => 4,
'escalate_to' => 'director'
]
];
public function checkAutoEscalation($workOrder)
{
$hoursElapsed = $this->calculateElapsedHours($workOrder->created_at);
$urgency = $workOrder->urgency;
if ($hoursElapsed >= $this->escalationRules[$urgency]['timeout_hours']) {
return $this->triggerEscalation($workOrder);
}
return false;
}
}
手动升级处理
<?php
namespace App\Models;
class WorkOrder extends Model
{
public function escalate($reason, $targetLevel)
{
DB::transaction(function() use ($reason, $targetLevel) {
// 记录升级历史
$this->escalationHistories()->create([
'from_level' => $this->priority_level,
'to_level' => $targetLevel,
'reason' => $reason,
'escalated_by' => auth()->id(),
'previous_assignee' => $this->assignee_id
]);
// 更新工单优先级
$this->update([
'priority_level' => $targetLevel,
'escalated_at' => now()
]);
// 重新分配处理人
$this->reassignToHigherLevel();
});
}
}
工单闭环流程
闭环状态机设计
<?php
namespace App\Models\Enums;
class WorkOrderStatus
{
const CREATED = 'created';
const ASSIGNED = 'assigned';
const IN_PROGRESS = 'in_progress';
const PENDING_REVIEW = 'pending_review';
const RESOLVED = 'resolved';
const CLOSED = 'closed';
const REOPENED = 'reopened';
// 状态转换规则
const TRANSITIONS = [
'created' => ['assigned', 'cancelled'],
'assigned' => ['in_progress', 'pending_review', 'cancelled'],
'in_progress' => ['pending_review', 'paused'],
'pending_review' => ['resolved', 'in_progress'],
'resolved' => ['closed', 'reopened'],
'closed' => ['reopened'],
'reopened' => ['assigned', 'in_progress']
];
}
闭环验证接口
<?php
namespace App\Services\WorkOrder;
class ClosureValidator
{
public function validateClosure(WorkOrder $workOrder, ClosureRequest $request)
{
$errors = [];
// 必须填写解决方案
if (empty($request->resolution)) {
$errors[] = '请填写解决方案描述';
}
// 必须确认所有子任务完成
if ($workOrder->subTasks()->where('status', '!=', 'completed')->exists()) {
$errors[] = '存在未完成的子任务';
}
// 检查关联的资源是否已释放
if ($workOrder->resources()->where('is_locked', true)->exists()) {
$errors[] = '关联资源未释放';
}
// 客户确认(如果适用)
if ($workOrder->needs_customer_approval && !$request->customer_confirmed) {
$errors[] = '需要客户确认';
}
if (empty($errors)) {
return ['is_valid' => true];
}
return ['is_valid' => false, 'errors' => $errors];
}
}
闭环执行流程
<?php
namespace App\Http\Controllers\Api;
class WorkOrderController extends Controller
{
public function close(WorkOrder $workOrder, CloseRequest $request)
{
// 1. 验证闭环条件
$validator = app(ClosureValidator::class);
$validation = $validator->validateClosure($workOrder, $request);
if (!$validation['is_valid']) {
return response()->json([
'success' => false,
'message' => '闭环验证失败',
'errors' => $validation['errors']
], 422);
}
// 2. 执行闭环
DB::transaction(function() use ($workOrder, $request) {
// 记录闭环信息
$workOrder->closure()->create([
'resolution' => $request->resolution,
'closure_type' => $request->closure_type,
'closed_by' => auth()->id(),
'closed_at' => now(),
'resolution_time' => $workOrder->created_at->diffInHours(now())
]);
// 更新工单状态
$workOrder->update(['status' => WorkOrderStatus::CLOSED]);
// 发送通知
$this->notifyStakeholders($workOrder);
// 触发后续流程
event(new WorkOrderClosed($workOrder));
});
// 3. 生成闭环报告
$report = $this->generateClosureReport($workOrder);
return response()->json([
'success' => true,
'message' => '工单已成功闭环',
'data' => [
'work_order' => $workOrder->fresh(),
'report' => $report
]
]);
}
private function generateClosureReport($workOrder)
{
return [
'work_order_id' => $workOrder->id,
'title' => $workOrder->title,
'total_duration' => $workOrder->created_at->diffInHours($workOrder->closed_at),
'actual_work_hours' => $workOrder->timeTrackings()->sum('hours'),
'resolution_summary' => $workOrder->closure->resolution,
'satisfaction_score' => $workOrder->feedback?->score,
'cost_analysis' => [
'labor_cost' => $this->calculateLaborCost($workOrder),
'material_cost' => $workOrder->materialCosts()->sum('amount')
]
];
}
}
升级与闭环关联功能
升级后自动闭环监控
<?php
namespace App\Console\Commands;
class MonitorEscalatedWorkOrders extends Command
{
public function handle()
{
// 监控已升级但未闭环的工单
$escalatedOrders = WorkOrder::where('escalated_at', '!=', null)
->where('status', '!=', WorkOrderStatus::CLOSED)
->get();
foreach ($escalatedOrders as $order) {
// 检查是否需要二次升级
if ($this->needsSecondEscalation($order)) {
$order->escalate('自动二次升级', URGENCY_LEVELS['critical']);
}
// 检查是否超时未处理
if ($this->hasExceededDeadline($order)) {
$this->triggerAudit($order);
}
}
}
}
闭环统计与分析
<?php
namespace App\Services\Analytics;
class ClosureAnalytics
{
public function getEscalationClosureReport($startDate, $endDate)
{
return WorkOrder::whereBetween('closed_at', [$startDate, $endDate])
->where('escalated_at', '!=', null)
->select(
DB::raw('COUNT(*) as total_closed'),
DB::raw('AVG(TIMESTAMPDIFF(HOUR, escalated_at, closed_at)) as avg_closure_time'),
DB::raw('COUNT(CASE WHEN closure_type = "success" THEN 1 END) as successful_closures'),
DB::raw('COUNT(CASE WHEN closure_type = "partial" THEN 1 END) as partial_closures')
)
->first();
}
}
前端交互示例
// React组件示例
class WorkOrderClosure extends React.Component {
handleCloseWorkOrder = async () => {
const validationErrors = await this.validateClosure();
if (validationErrors.length > 0) {
this.showErrors(validationErrors);
return;
}
// 显示确认对话框
const confirmed = await this.showConfirmationDialog({
title: '确认闭环',
message: '工单闭环后将无法修改,是否继续?',
confirmText: '确认闭环',
cancelText: '取消'
});
if (confirmed) {
try {
await api.closeWorkOrder(this.props.workOrderId, {
resolution: this.state.resolution,
closure_type: this.state.closureType
});
notification.success('工单已成功闭环');
this.redirectToWorkOrderList();
} catch (error) {
notification.error('闭环失败: ' + error.message);
}
}
}
}
最佳实践建议
- 升级规则配置化:将升级规则存储在数据库或配置文件中,便于动态调整
- 闭环数据完整性:确保所有必填字段和附件完整
- 审计日志:记录所有升级和闭环操作
- 自动化提醒:工单接近升级时间时自动提醒
- 闭环后分析:定期分析升级原因和闭环效率
这个完整的工单升级与闭环系统可以帮助您的PHP项目有效管理工单生命周期,提高问题解决效率和服务质量。