PHP项目工单升级与闭环

wen PHP项目 2

本文目录导读:

PHP项目工单升级与闭环

  1. 工单升级机制
  2. 工单闭环流程
  3. 升级与闭环关联功能
  4. 前端交互示例
  5. 最佳实践建议

我来为您详细介绍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);
            }
        }
    }
}

最佳实践建议

  1. 升级规则配置化:将升级规则存储在数据库或配置文件中,便于动态调整
  2. 闭环数据完整性:确保所有必填字段和附件完整
  3. 审计日志:记录所有升级和闭环操作
  4. 自动化提醒:工单接近升级时间时自动提醒
  5. 闭环后分析:定期分析升级原因和闭环效率

这个完整的工单升级与闭环系统可以帮助您的PHP项目有效管理工单生命周期,提高问题解决效率和服务质量。

抱歉,评论功能暂时关闭!