<?php
// 确保输出缓冲开启，避免header错误
ob_start();

require_once __DIR__ . '/../lib/config.php';
require_once __DIR__ . '/../lib/db_connect.php';
require_once __DIR__ . '/../includes/header.php';

if (!isset($_SESSION['user_id'])) {
    header('Location: login.php');
    exit;
}

// 图片上传函数
function uploadDeductionImages($task_id) {
    $uploaded_images = [];
    
    if (!empty($_FILES['deduction_images']['name'][0])) {
        $total_files = count($_FILES['deduction_images']['name']);
        
        for ($i = 0; $i < $total_files; $i++) {
            $file_name = $_FILES['deduction_images']['name'][$i];
            $file_tmp = $_FILES['deduction_images']['tmp_name'][$i];
            $file_size = $_FILES['deduction_images']['size'][$i];
            $file_error = $_FILES['deduction_images']['error'][$i];
            
            // 检查文件错误
            if ($file_error !== UPLOAD_ERR_OK) {
                continue;
            }
            
            // 检查文件大小（限制为5MB）
            if ($file_size > 5 * 1024 * 1024) {
                continue;
            }
            
            // 生成唯一文件名
            $file_ext = pathinfo($file_name, PATHINFO_EXTENSION);
            $new_file_name = "deduction_{$task_id}_" . uniqid() . '.' . $file_ext;
            $upload_path = UPLOAD_DIR . 'deduction_images/' . $new_file_name;
            
            // 移动文件到上传目录
            if (move_uploaded_file($file_tmp, $upload_path)) {
                $uploaded_images[] = $new_file_name;
            }
        }
    }
    
    return $uploaded_images;
}

// +++ 新增：任务规格计算函数 +++
function calculateTaskSpec($level, $coin) {
    $spec = '';
    if ($level == 30) {
        if ($coin == 10000000) $spec = '30级+1000w';
        elseif ($coin == 15000000) $spec = '30级+1500w';
        elseif ($coin == 20000000) $spec = '30级+2000w';
    } elseif ($level == 33) {
        if ($coin == 10000000) $spec = '33级+1000w';
        elseif ($coin == 15000000) $spec = '33级+1500w';
        elseif ($coin == 20000000) $spec = '33级+2000w';
    }
    return $spec ?: 'N/A';
}

// +++ 新增：处理扣回任务逻辑 +++
if (isset($_POST['recall_task'])) {
    $task_id = intval($_POST['task_id']);
    $remark = $_POST['remark'] ?? '';
    
    // 获取任务信息 - 增加代理用户ID、实际积分和佣金字段
    $task_sql = "SELECT t.id, t.user_id, t.coin_amount, t.agent_id, t.agent_approved, t.status, t.actual_points, 
                        a.user_id as agent_user_id, a.commission_rate,
                        u.wx_openid  
                 FROM tasks t
                 LEFT JOIN agents a ON t.agent_id = a.id
                 LEFT JOIN users u ON t.user_id = u.id 
                 WHERE t.id = ?";
    
    // 添加错误检查
    $task_stmt = $conn->prepare($task_sql);
    if ($task_stmt === false) {
        error_log("SQL准备失败: " . $conn->error);
        $_SESSION['error'] = "数据库查询准备失败，请检查日志获取详细信息";
        header("Location: tasks.php");
        exit;
    }
    
    $task_stmt->bind_param("i", $task_id);
    $task_stmt->execute();
    $task_result = $task_stmt->get_result();
    $task = $task_result->fetch_assoc();
    
    if ($task) {
        // 检查任务是否可扣回
        if ($task['status'] !== 'approved' || $task['agent_approved'] == 0) {
            $_SESSION['error'] = "只有已通过且代理已审核的任务才能扣回";
            header("Location: tasks.php");
            exit;
        }
        
        // 上传扣回图片
        $deduction_images = uploadDeductionImages($task_id);
        $deduction_images_json = !empty($deduction_images) ? json_encode($deduction_images) : null;
        
        // 开始事务
        $conn->begin_transaction();
        
        try {
            // 更新任务状态为扣回中（添加deduction_images字段和recalled_at时间）
            $update_sql = "UPDATE tasks SET status = 'recall_initiated', deduction_remark = ?, deduction_images = ?, recalled_at = NOW() WHERE id = ?";
            $update_stmt = $conn->prepare($update_sql);
            if ($update_stmt === false) {
                throw new Exception("更新语句准备失败: " . $conn->error);
            }
            $update_stmt->bind_param("ssi", $remark, $deduction_images_json, $task_id);
            $update_stmt->execute();
            
            // +++ 修复：直接扣回任务积分总额 +++
            $agent_user_id = $task['agent_user_id'];
            $coin_amount = $task['coin_amount'];
            
            if ($agent_user_id && $coin_amount > 0) {
                // 修复：直接扣回任务积分总额
                $deduct_sql = "UPDATE users SET points = points - ? WHERE id = ?";
                $deduct_stmt = $conn->prepare($deduct_sql);
                if ($deduct_stmt === false) {
                    throw new Exception("扣回积分语句准备失败: " . $conn->error);
                }
                $deduct_stmt->bind_param("ii", $coin_amount, $agent_user_id);
                $deduct_stmt->execute();
                
                // 记录积分交易
                $deduct_amount = -$coin_amount;
                $description = "任务 #{$task_id} 系统积分扣回（任务总额）";
                $trans_sql = "INSERT INTO point_transactions 
                              (user_id, amount, type, description, status, created_at) 
                              VALUES (?, ?, 'system_recall', ?, 'completed', NOW())";
                $trans_stmt = $conn->prepare($trans_sql);
                if ($trans_stmt === false) {
                    throw new Exception("积分交易语句准备失败: " . $conn->error);
                }
                $trans_stmt->bind_param("iis", $agent_user_id, $deduct_amount, $description);
                $trans_stmt->execute();
            }
            
            // 发送通知给代理
            $title = "任务扣回通知";
            $content = "任务 #{$task_id} 已被管理员标记为扣回，请前往代理面板处理。";
            
            $insert_sql = "INSERT INTO notifications (user_id, title, content) VALUES (?, ?, ?)";
            $stmt_notify = $conn->prepare($insert_sql);
            if ($stmt_notify === false) {
                throw new Exception("通知语句准备失败: " . $conn->error);
            }
            $stmt_notify->bind_param('iss', $task['agent_id'], $title, $content);
            $stmt_notify->execute();
            
            $conn->commit();
            $_SESSION['success'] = "任务已标记为扣回，系统积分已扣回";
            
            // +++ 新增：发送微信模板消息 +++
            if (!empty($task['wx_openid'])) {
                require_once __DIR__ . '/wechat_template_service.php';
                
                $wechatService = new WeChatTemplateService();
                $recallTime = date('Y-m-d H:i:s');
                
                $notificationResult = $wechatService->sendRecallNotification(
                    $task['wx_openid'], 
                    $task_id,
                    $recallTime
                );
                
                // 记录发送结果（可选）
                if (!$notificationResult['success']) {
                    error_log("微信扣回通知发送失败: " . $notificationResult['msg']);
                }
            }
            
        } catch (Exception $e) {
            $conn->rollback();
            $_SESSION['error'] = "扣回操作失败: " . $e->getMessage();
        }
    } else {
        $_SESSION['error'] = "任务不存在";
    }
    
    header("Location: tasks.php");
    exit;
}

if (isset($_POST['update_status'])) {
    $task_id = intval($_POST['task_id']);
    $new_status = $_POST['status'];
    $remark = $_POST['remark'] ?? '';
    
    // 如果是审核操作，记录审核时间
    $reviewed_at_sql = "";
    if ($new_status === 'approved' || $new_status === 'rejected') {
        $reviewed_at_sql = ", reviewed_at = NOW()";
    }
    
    $sql = "UPDATE tasks SET status = ?, remark = ? $reviewed_at_sql WHERE id = ?";
    $stmt = $conn->prepare($sql);
    $stmt->bind_param("ssi", $new_status, $remark, $task_id);
    
    if ($stmt->execute()) {
        $_SESSION['success'] = "任务状态已更新";
        
        // ====== 新增：发送通知给用户 ======
        // 获取任务信息
        $task_sql = "SELECT user_id, coin_amount FROM tasks WHERE id = ?";
        $task_stmt = $conn->prepare($task_sql);
        $task_stmt->bind_param("i", $task_id);
        $task_stmt->execute();
        $task_result = $task_stmt->get_result();
        $task = $task_result->fetch_assoc();
        
        if ($task) {
            $user_id = $task['user_id'];
            $title = "任务状态更新";
            
            if ($new_status === 'approved') {
                $content = "您的任务 #{$task_id} 已通过管理员审核，获得 {$task['coin_amount']} 积分。";
            } elseif ($new_status === 'rejected') {
                $content = "您的任务 #{$task_id} 已被管理员拒绝。";
                if (!empty($remark)) {
                    $content .= "<br>原因：" . htmlspecialchars($remark);
                }
            } else {
                $content = "您的任务 #{$task_id} 状态已更新为：" . $new_status;
            }
            
            $insert_sql = "INSERT INTO notifications (user_id, title, content) VALUES (?, ?, ?)";
            $stmt_notify = $conn->prepare($insert_sql);
            $stmt_notify->bind_param('iss', $user_id, $title, $content);
            $stmt_notify->execute();
        }
        // ====== 新增结束 ======
        
    } else {
        $_SESSION['error'] = "更新失败: " . $conn->error;
    }
    
    header("Location: tasks.php");
    exit;
}

// 获取当前用户的任务
$user_id = $_SESSION['user_id'];
$role = $_SESSION['role'];

// 批量操作处理 - 修复数组类型错误
if ($role === 'admin' && isset($_POST['batch_action'])) {
    // ... [批量操作代码保持不变，但添加索引优化] ...
}

// +++ 修改：在SQL查询中添加号源名称字段和审核时间、扣回时间字段 +++
if ($role === 'admin') {
    $base_sql = "SELECT tasks.*, users.name AS user_name, users.user_group, 
                        tasks.exported, tasks.export_time,
                        tasks.original_level, tasks.original_coin_amount,
                        tasks.product_name, tasks.reviewed_at, tasks.recalled_at  
                 FROM tasks 
                 JOIN users ON tasks.user_id = users.id";
} else {
    $base_sql = "SELECT tasks.*, users.user_group, 
                        tasks.exported, tasks.export_time,
                        tasks.original_level, tasks.original_coin_amount,
                        tasks.product_name, tasks.reviewed_at, tasks.recalled_at  
                 FROM tasks 
                 JOIN users ON tasks.user_id = users.id 
                 WHERE tasks.user_id = ?";
}

// 处理搜索参数
$search = $_GET['search'] ?? '';
// 默认状态设为 'pending'（待审核）
$status = $_GET['status'] ?? 'pending';  // 修改这里，默认值设为'pending'
$start_date = $_GET['start_date'] ?? '';
$end_date = $_GET['end_date'] ?? '';
// +++ 新增：任务规格筛选参数 +++
$spec_filter = $_GET['spec'] ?? '';
// +++ 新增：号源名称筛选参数 +++
$product_filter = $_GET['product'] ?? '';

// +++ 新增：任务规格映射 +++
$spec_mapping = [
    '30级+1000w' => ['level' => 30, 'coin' => 10000000],
    '30级+1500w' => ['level' => 30, 'coin' => 15000000],
    '30级+2000w' => ['level' => 30, 'coin' => 20000000],
    '33级+1000w' => ['level' => 33, 'coin' => 10000000],
    '33级+1500w' => ['level' => 33, 'coin' => 15000000],
    '33级+2000w' => ['level' => 33, 'coin' => 20000000]
];

// +++ 新增：获取所有号源名称（用于下拉菜单） +++
$product_names = [];
$product_query = "SELECT DISTINCT product_name FROM tasks WHERE product_name IS NOT NULL AND product_name != ''";
$product_result = $conn->query($product_query);
if ($product_result && $product_result->num_rows > 0) {
    while ($row = $product_result->fetch_assoc()) {
        $product_names[] = $row['product_name'];
    }
}

// 构建SQL查询
$where = [];
$params = [];
$types = '';

if ($role === 'admin') {
    // 管理员模式
    if (!empty($search)) {
        $where[] = "(tasks.account LIKE ? OR tasks.password LIKE ?)";
        $params[] = "%$search%";
        $params[] = "%$search%";
        $types .= 'ss';
    }
    
    // +++ 新增：任务规格筛选条件 +++
    if (!empty($spec_filter) && isset($spec_mapping[$spec_filter])) {
        $spec_data = $spec_mapping[$spec_filter];
        $where[] = "tasks.original_level = ?";
        $where[] = "tasks.original_coin_amount = ?";
        $params[] = $spec_data['level'];
        $params[] = $spec_data['coin'];
        $types .= 'ii';
    }
    
    // +++ 新增：号源名称筛选条件 +++
    if (!empty($product_filter)) {
        $where[] = "tasks.product_name = ?";
        $params[] = $product_filter;
        $types .= 's';
    }
} else {
    // 普通用户模式
    $params[] = $user_id;
    $types .= 'i';
    if (!empty($search)) {
        $where[] = "(tasks.account LIKE ? OR tasks.password LIKE ?)";
        $params[] = "%$search%";
        $params[] = "%$search%";
        $types .= 'ss';
    }
}

// 修复：添加状态条件 - 现在对管理员和普通用户都生效
if (!empty($status) && $status !== 'all') {
    $where[] = "tasks.status = ?";
    $params[] = $status;
    $types .= 's';
}

// 修复：指定完整的表名(tasks.created_at)
if (!empty($start_date) && !empty($end_date)) {
    $where[] = "DATE(tasks.created_at) BETWEEN ? AND ?";
    $params[] = $start_date;
    $params[] = $end_date;
    $types .= 'ss';
}

// 构建完整SQL
if (!empty($where)) {
    $where_clause = " WHERE " . implode(' AND ', $where);
    if (strpos($base_sql, 'WHERE') !== false) {
        $sql = $base_sql . ' AND ' . implode(' AND ', $where);
    } else {
        $sql = $base_sql . $where_clause;
    }
} else {
    $sql = $base_sql;
}

// 创建用于计数的SQL
$count_sql = "SELECT COUNT(*) AS total " . substr($sql, strpos($sql, "FROM"));

// 使用预处理语句获取总记录数
$count_stmt = $conn->prepare($count_sql);
if ($count_stmt === false) {
    die("SQL错误: " . $conn->error);
}

if (!empty($params)) {
    $count_stmt->bind_param($types, ...$params);
}
$count_stmt->execute();
$count_result = $count_stmt->get_result();
$total_records = $count_result->fetch_assoc()['total'];

// 分页设置 - 添加每页显示数量选择功能
$per_page_options = [10, 30, 50, 100];
$per_page = isset($_GET['per_page']) && in_array($_GET['per_page'], $per_page_options) ? intval($_GET['per_page']) : 10;
$current_page = isset($_GET['page']) ? intval($_GET['page']) : 1;
if ($current_page < 1) $current_page = 1;
$total_pages = ceil($total_records / $per_page);
if ($current_page > $total_pages && $total_pages > 0) $current_page = $total_pages;
$offset = ($current_page - 1) * $per_page;

// 添加排序和分页到查询
$sql .= " ORDER BY tasks.created_at DESC LIMIT ?, ?";
$types .= 'ii';
$params[] = $offset;
$params[] = $per_page;

// 使用预处理语句
$stmt = $conn->prepare($sql);
if ($stmt === false) {
    die("SQL错误: " . $conn->error);
}

if (!empty($params)) {
    $stmt->bind_param($types, ...$params);
}
$stmt->execute();
$result = $stmt->get_result();

// +++ 优化：减少数据库查询，预先获取所有需要的数据 +++
$taskPointsMap = [];
$taskIds = [];

if ($result->num_rows > 0) {
    // 收集当前页所有任务ID
    while ($row = $result->fetch_assoc()) {
        $taskIds[] = $row['id'];
    }
    // 重置结果集指针
    $result->data_seek(0);
    
    // 查询这些任务对应的实际积分
    if (!empty($taskIds)) {
        $ids_str = implode(',', $taskIds);
        $sql_points = "SELECT description, amount 
                      FROM point_transactions 
                      WHERE description LIKE '%任务 #%' 
                        AND user_id = ? 
                        AND type = 'task_reward' 
                        AND description REGEXP ?";
        
        $stmt_points = $conn->prepare($sql_points);
        // 构建正则表达式匹配任务ID
        $regex = '任务 #(' . implode('|', $taskIds) . ')';
        $stmt_points->bind_param("is", $_SESSION['user_id'], $regex);
        $stmt_points->execute();
        $points_result = $stmt_points->get_result();
        
        while ($point_row = $points_result->fetch_assoc()) {
            // 从描述中提取任务ID
            if (preg_match('/任务 #(\d+)/', $point_row['description'], $matches)) {
                $taskId = intval($matches[1]);
                $taskPointsMap[$taskId] = $point_row['amount'];
            }
        }
    }
}

// 获取所有用户组的平均佣金率
$avg_commission_rates = [];
$groups_result = $conn->query("SELECT user_group, AVG(commission_rate) AS avg_rate FROM agents GROUP BY user_group");
if ($groups_result) {
    while ($group = $groups_result->fetch_assoc()) {
        $avg_commission_rates[$group['user_group']] = $group['avg_rate'] ?? 0;
    }
}

// 获取用户组的默认积分
$group_default_points = [];
$default_points_result = $conn->query("SELECT group_name, default_points FROM user_groups");
if ($default_points_result) {
    while ($group = $default_points_result->fetch_assoc()) {
        $group_default_points[$group['group_name']] = $group['default_points'] ?? 0;
    }
}

// 获取代理佣金率（用于已审核任务）
$agent_commissions = [];
$agents_result = $conn->query("SELECT id, commission_rate FROM agents");
if ($agents_result) {
    while ($agent = $agents_result->fetch_assoc()) {
        $agent_commissions[$agent['id']] = $agent['commission_rate'] ?? 0;
    }
}
?>

<!DOCTYPE html>
<html lang="zh-CN">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>任务管理系统</title>
    <link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.4.0/css/all.min.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/css/bootstrap.min.css" rel="stylesheet">
    <link href="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.min.css" rel="stylesheet">
    <style>
        /* 精简CSS，移除复杂特效 */
        body {
            background: #f5f7ff;
            min-height: 100vh;
            font-family: 'Segoe UI', Tahoma, Geneva, Verdana, sans-serif;
            color: #495057;
        }

        .main-content {
            padding: 20px;
        }

        /* 简化卡片样式 */
        .card {
            border-radius: 8px;
            border: 1px solid #e2e8f0;
            box-shadow: 0 2px 8px rgba(0, 0, 0, 0.08);
            background: #fff;
            margin-bottom: 20px;
        }

        .card-header {
            background: #5b67f8;
            color: white;
            border-bottom: none;
            padding: 12px 16px;
            font-weight: 600;
            border-radius: 8px 8px 0 0 !important;
        }

        .card-body {
            padding: 20px;
        }

        /* 简化导航标签样式 */
        .nav-tabs {
            border-bottom: 1px solid #dee2e6;
            margin-bottom: 1rem;
        }

        .nav-tabs .nav-link {
            border: none;
            border-bottom: 2px solid transparent;
            color: #6c757d;
            padding: 0.5rem 1rem;
            font-weight: 500;
        }

        .nav-tabs .nav-link.active {
            color: #5b67f8;
            border-bottom: 2px solid #5b67f8;
        }

        /* 简化按钮样式 */
        .btn {
            border-radius: 6px;
            padding: 6px 12px;
            font-weight: 500;
        }

        .btn-primary {
            background: #5b67f8;
            border: none;
        }

        /* 简化表格样式 - 修复移动端滚动问题 */
        .table-responsive {
            border-radius: 6px;
            overflow-x: auto;
            -webkit-overflow-scrolling: touch;
            position: relative;
        }
        
        /* 添加滑动指示器 */
        .table-responsive::after {
            content: '↔';
            position: absolute;
            top: 50%;
            right: 10px;
            transform: translateY(-50%);
            font-size: 20px;
            color: #5b67f8;
            opacity: 0.7;
            z-index: 10;
            display: none;
            animation: pulse 2s infinite;
        }
        
        @keyframes pulse {
            0% { opacity: 0.3; }
            50% { opacity: 0.7; }
            100% { opacity: 0.3; }
        }
        
        /* 只在移动设备上显示滑动指示器 */
        @media (max-width: 768px) {
            .table-responsive::after {
                display: block;
            }
            
            /* 表格样式优化 */
            .table {
                min-width: 800px; /* 确保表格足够宽以触发滚动 */
            }
            
            .table th, .table td {
                white-space: nowrap;
                padding: 8px 10px;
            }
            
            /* 操作按钮优化 */
            .action-buttons {
                display: flex;
                flex-wrap: nowrap;
            }
            
            .action-btn {
                padding: 4px 8px;
                font-size: 0.8rem;
                margin: 2px;
            }
        }

        .table th {
            background: #f8f9fa;
            color: #495057;
            font-weight: 600;
            padding: 12px;
            border-bottom: 2px solid #dee2e6;
        }

        .table td {
            padding: 10px;
            border-bottom: 1px solid #f1f3f7;
        }

        /* 简化状态标签样式 */
        .status-badge {
            border-radius: 4px;
            display: inline-block;
            font-size: 0.75rem;
            font-weight: 600;
            padding: 4px 8px;
            text-align: center;
            min-width: 60px;
        }

        .status-pending {
            background: #ffc107;
            color: #000;
        }

        .status-approved {
            background: #28a745;
            color: #fff;
        }

        .status-rejected {
            background: #dc3545;
            color: #fff;
        }

        .status-recall_initiated {
            background: #ff9800;
            color: #fff;
        }

        .status-recall_completed {
            background: #9c27b0;
            color: #fff;
        }

        .status-self_consumed {
            background: #20c997;
            color: #fff;
        }

        /* 简化表单控件样式 */
        .form-control, .form-select {
            border-radius: 6px;
            padding: 8px 12px;
            border: 1px solid #e2e8f0;
        }

        /* 简化分页样式 */
        .pagination {
            display: flex;
            justify-content: center;
            margin-top: 15px;
        }

        .page-link {
            border-radius: 6px;
            border: 1px solid #e2e8f0;
            padding: 6px 12px;
            color: #5b67f8;
            font-weight: 500;
        }

        /* 每页显示条数选择器样式 */
        .per-page-selector {
            display: flex;
            align-items: center;
            justify-content: flex-end;
            margin-bottom: 15px;
            padding: 8px 12px;
            background-color: #f8f9fa;
            border-radius: 6px;
        }

        /* 简化导出状态标签 */
        .export-status {
            font-size: 0.75rem;
            padding: 3px 8px;
            border-radius: 4px;
            display: inline-block;
            margin-top: 3px;
            font-weight: 500;
        }

        .exported {
            background: #e8f5e9;
            color: #2e7d32;
        }

        .not-exported {
            background: #ffebee;
            color: #c62828;
        }

        .exporting {
            background: #e3f2fd;
            color: #0d47a1;
        }

        /* 简化批量操作工具栏 */
        .batch-toolbar {
            background: #f8f9fa;
            border-radius: 8px;
            padding: 12px;
            margin-bottom: 15px;
        }

        /* 简化模态框样式 */
        .modal-content {
            border-radius: 8px;
            border: none;
        }

        /* 复制工具栏样式 */
        .copy-toolbar {
            background: #e8f4fd;
            border-radius: 8px;
            padding: 12px;
            margin-bottom: 15px;
            display: flex;
            align-items: center;
            justify-content: space-between;
        }

        .copy-options {
            display: flex;
            align-items: center;
            gap: 10px;
        }

        .copy-select {
            width: 180px;
        }

        /* 响应式设计 */
        @media (max-width: 992px) {
            .main-content {
                padding: 15px;
            }
            
            .card-body {
                padding: 15px;
            }
        }

        @media (max-width: 768px) {
            .nav-tabs .nav-link {
                padding: 0.4rem 0.6rem;
                font-size: 0.85rem;
            }
            
            .copy-toolbar {
                flex-direction: column;
                gap: 10px;
            }
            
            .copy-options {
                flex-wrap: wrap;
                justify-content: center;
            }
            
            /* 移动端表格字体调整 */
            .table {
                font-size: 0.8rem;
            }
            
            .table th, .table td {
                padding: 6px 8px;
            }
            
            .btn {
                padding: 4px 8px;
                font-size: 0.8rem;
            }
        }

        @media (max-width: 576px) {
            .main-content {
                padding: 10px;
            }
            
            .card-body {
                padding: 10px;
            }
            
            .table th, .table td {
                padding: 6px 4px;
                font-size: 0.75rem;
            }
            
            .status-badge {
                min-width: 50px;
                font-size: 0.7rem;
                padding: 2px 4px;
            }
            
            .copy-select {
                width: 140px;
            }
            
            /* 移动端操作按钮优化 */
            .action-buttons {
                display: flex;
                flex-direction: column;
                gap: 3px;
            }
            
            .action-btn {
                padding: 3px 6px;
                font-size: 0.7rem;
                margin: 1px;
            }
        }
    </style>
</head>
<body>
    <!-- 导航栏和头部 -->
    <?php require_once __DIR__ . '/../includes/header.php'; ?>
    
    <div class="main-content">
        <!-- 消息提示 -->
        <?php if ($role === 'admin' && isset($_SESSION['batch_message'])): ?>
            <div class="alert alert-<?= $_SESSION['batch_message']['type'] == 'success' ? 'success' : 'danger' ?> alert-dismissible fade show" role="alert">
                <?= $_SESSION['batch_message']['text'] ?>
                <button type="button" class="btn-close" data-bs-dismiss="alert" aria-label="Close"></button>
            </div>
            <?php unset($_SESSION['batch_message']); ?>
        <?php endif; ?>
        
        <div class="d-flex justify-content-between align-items-center mb-4">
            <h4 class="mb-0 fw-bold text-dark"><?= $role === 'admin' ? '全部' : '我的' ?>任务列表</h4>
            <?php if ($role !== 'admin'): ?>
                <a href="<?= BASE_URL ?>order_history.php" class="btn btn-primary">
                    <i class="fas fa-plus me-1"></i>新建任务
                </a>
            <?php endif; ?>
        </div>
        
        <!-- 复制工具栏 -->
        <div class="card copy-toolbar">
            <div class="copy-options">
                <div>
                    <input type="checkbox" id="copySelectAll" class="form-check-input">
                    <label class="form-check-label ms-1 fw-medium" for="copySelectAll">全选复制项</label>
                </div>
                
                <select id="copyContentType" class="form-select copy-select">
                    <option value="account">复制账号</option>
                    <option value="password">复制密码</option>
                    <option value="account_password">复制账号和密码</option>
                    <option value="all">复制全部信息</option>
                </select>
                
                <button type="button" id="copySelected" class="btn btn-success">
                    <i class="fas fa-copy me-1"></i>复制选中内容
                </button>
            </div>
            
            <div class="copy-info text-muted small">
                已选择 <span id="selectedCount">0</span> 个任务进行复制
            </div>
        </div>
        
                                        <?php if ($role === 'admin'): ?>
        <!-- 批量操作工具栏 -->
        <?php if ($result->num_rows > 0): ?>
        <div class="card batch-toolbar">
            <form id="batchForm" method="post" action="tasks.php">
                <div class="d-flex align-items-center">
                    <div class="me-3">
                        <input type="checkbox" id="selectAllTop" class="form-check-input">
                        <label class="form-check-label ms-1 fw-medium" for="selectAllTop">全选</label>
                    </div>
                    
                    <div class="me-3 flex-grow-1">
                        <select name="batch_action" class="form-select" id="batchAction">
                            <option value="">选择批量操作</option>
                            <option value="approve">批量审核通过</option>
                            <option value="reject">批量拒绝</option>
                            <option value="delete">批量删除</option>
                        </select>
                    </div>
                    
                    <div>
                        <button type="button" id="executeBatch" class="btn btn-primary">
                            <i class="fas fa-play me-1"></i>执行操作
                        </button>
                    </div>
                </div>
                
                <input type="hidden" name="task_ids" id="selectedTasks">
                <input type="hidden" name="batch_remark" id="batchRemark" value="">
            </form>
        </div>
        <?php endif; ?>
        
        <!-- 管理员搜索区域 -->
        <div class="card">
            <div class="card-body">
                <form method="GET" class="row g-3">
                    <div class="col-md-3">
                        <input type="text" name="search" class="form-control" placeholder="搜索账号或密码..." value="<?= htmlspecialchars($search) ?>">
                    </div>
                    <div class="col-md-2">
                        <select name="status" class="form-select">
                            <option value="all">所有状态</option>
                            <option value="pending" <?= $status === 'pending' ? 'selected' : '' ?>>待审核</option>
                            <option value="approved" <?= $status === 'approved' ? 'selected' : '' ?>>已通过</option>
                            <option value="rejected" <?= $status === 'rejected' ? 'selected' : '' ?>>已拒绝</option>
                            <option value="recall_initiated" <?= $status === 'recall_initiated' ? 'selected' : '' ?>>扣回中</option>
                            <option value="recall_completed" <?= $status === 'recall_completed' ? 'selected' : '' ?>>已扣回</option>
                            <option value="self_consumed" <?= $status === 'self_consumed' ? 'selected' : '' ?>>用户自留</option>
                        </select>
                    </div>
                    <div class="col-md-2">
                        <select name="spec" class="form-select">
                            <option value="">所有规格</option>
                            <option value="30级+1000w" <?= $spec_filter === '30级+1000w' ? 'selected' : '' ?>>30级+1000w</option>
                            <option value="30级+1500w" <?= $spec_filter === '30级+1500w' ? 'selected' : '' ?>>30级+1500w</option>
                            <option value="30级+2000w" <?= $spec_filter === '30级+2000w' ? 'selected' : '' ?>>30级+2000w</option>
                            <option value="33级+1000w" <?= $spec_filter === '33级+1000w' ? 'selected' : '' ?>>33级+1000w</option>
                            <option value="33级+1500w" <?= $spec_filter === '33级+1500w' ? 'selected' : '' ?>>33级+1500w</option>
                            <option value="33级+2000w" <?= $spec_filter === '33级+2000w' ? 'selected' : '' ?>>33级+2000w</option>
                        </select>
                    </div>
                    <div class="col-md-2">
                        <select name="product" class="form-select">
                            <option value="">所有号源</option>
                            <?php foreach ($product_names as $name): ?>
                                <option value="<?= htmlspecialchars($name) ?>" <?= $product_filter === $name ? 'selected' : '' ?>>
                                    <?= htmlspecialchars($name) ?>
                                </option>
                            <?php endforeach; ?>
                        </select>
                    </div>
                    <div class="col-md-3">
                        <div class="input-group">
                            <input type="date" name="start_date" class="form-control" value="<?= htmlspecialchars($start_date) ?>" placeholder="开始日期">
                            <span class="input-group-text">至</span>
                            <input type="date" name="end_date" class="form-control" value="<?= htmlspecialchars($end_date) ?>" placeholder="结束日期">
                        </div>
                    </div>
                    <div class="col-md-2">
                        <button type="submit" class="btn btn-primary w-100">搜索</button>
                    </div>
                    <div class="col-md-2">
                        <a href="tasks.php" class="btn btn-outline-secondary w-100">重置</a>
                    </div>
                </form>
            </div>
        </div>
        <?php else: ?>
        <!-- 普通用户选项卡导航 -->
        <div class="card">
            <div class="card-body">
                <ul class="nav nav-tabs">
                    <li class="nav-item">
                        <a class="nav-link <?= ($status === 'all') ? 'active' : '' ?>" 
                           href="tasks.php?status=all">全部工单</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link <?= ($status === 'pending' || !isset($_GET['status'])) ? 'active' : '' ?>" 
                           href="tasks.php?status=pending">待处理工单</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link <?= ($status === 'approved') ? 'active' : '' ?>" 
                           href="tasks.php?status=approved">已通过工单</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link <?= ($status === 'rejected') ? 'active' : '' ?>" 
                           href="tasks.php?status=rejected">已拒绝工单</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link <?= ($status === 'recall_initiated') ? 'active' : '' ?>" 
                           href="tasks.php?status=recall_initiated">扣回中工单</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link <?= ($status === 'recall_completed') ? 'active' : '' ?>" 
                           href="tasks.php?status=recall_completed">已扣回工单</a>
                    </li>
                    <li class="nav-item">
                        <a class="nav-link <?= ($status === 'self_consumed') ? 'active' : '' ?>" 
                           href="tasks.php?status=self_consumed">用户自留工单</a>
                    </li>
                </ul>
                
                <!-- 普通用户搜索表单 -->
                <div class="mt-3">
                    <form method="GET" class="row g-3">
                        <input type="hidden" name="status" value="<?= $status ?>">
                        <div class="col-md-9">
                            <input type="text" name="search" class="form-control" placeholder="搜索账号或密码..." value="<?= htmlspecialchars($search) ?>">
                        </div>
                        <div class="col-md-3">
                            <button type="submit" class="btn btn-primary w-100">搜索</button>
                        </div>
                    </form>
                </div>
            </div>
        </div>
        <?php endif; ?>
                        <!-- 任务列表 -->
        <div class="card">
            <div class="card-body">
                <div class="table-responsive">
                    <table class="table table-striped table-hover">
                        <thead>
                            <tr>
                                <?php if ($role === 'admin'): ?>
                                    <th><input type="checkbox" id="selectAll"></th>
                                <?php endif; ?>
                                <th>复制</th>
                                <th>工单ID</th>
                                <?php if ($role === 'admin'): ?><th>用户</th><?php endif; ?>
                                <th>账号</th>
                                <th>号源名称</th>
                                <th>任务规格</th>
                                <th>获得积分</th>
                                <th>提交时间</th>
                                <th>状态</th>
                                <th>代理审核</th>
                                <th>导出状态</th>
                                <th>审核时间</th>
                                <th>扣回时间</th>
                                <th>操作</th>
                            </tr>
                        </thead>
                        <tbody>
                            <?php if ($result->num_rows > 0): ?>
                                <?php while($row = $result->fetch_assoc()): 
                                    // 优先使用实际积分记录
                                    $user_points = $taskPointsMap[$row['id']] ?? 0;
                                    
                                    // 如果没有实际积分记录，则使用原逻辑
                                    if ($user_points == 0) {
                                        $user_group = $row['user_group'];
                                        
                                        if ($row['status'] == 'pending') {
                                            // 待审核任务：用户组默认积分 × (1 - 用户组平均佣金率)
                                            $default_points = $group_default_points[$user_group] ?? 0;
                                            $avg_rate = $avg_commission_rates[$user_group] ?? 0;
                                            $user_points = round($default_points * (1 - ($avg_rate / 100)));
                                        } 
                                        elseif ($row['status'] == 'approved') {
                                            if ($row['agent_approved'] && $row['agent_id']) {
                                                // 已审核且代理已审核：显示任务积分（实际值可能不同）
                                                $user_points = $row['coin_amount'];
                                            } else {
                                                // +++ 已审核但代理未审核：使用与待审核相同的计算方式 +++
                                                $default_points = $group_default_points[$user_group] ?? 0;
                                                $avg_rate = $avg_commission_rates[$user_group] ?? 0;
                                                $user_points = round($default_points * (1 - ($avg_rate / 100)));
                                            }
                                        }
                                    }
                                    
                                    // 检查导出状态
                                    $exported = !empty($row['exported']) && $row['exported'] == 1;
                                    $export_time = !empty($row['export_time']) ? date('m-d H:i', strtotime($row['export_time'])) : '';
                                    
                                    // +++ 修改：使用统一逻辑计算任务规格 +++
                                    $spec = calculateTaskSpec($row['original_level'], $row['original_coin_amount']);
                                    
                                    // 格式化审核时间和扣回时间
                                    $reviewed_at = !empty($row['reviewed_at']) ? date('Y-m-d H:i', strtotime($row['reviewed_at'])) : '-';
                                    $recalled_at = !empty($row['recalled_at']) ? date('Y-m-d H:i', strtotime($row['recalled_at'])) : '-';
                                    
                                    // 状态显示逻辑
                                    $status_class = '';
                                    $statusText = '';
                                    switch ($row['status']) {
                                        case 'pending':
                                            $status_class = 'status-pending';
                                            $statusText = '待审核';
                                            break;
                                        case 'approved':
                                            $status_class = 'status-approved';
                                            $statusText = '已通过';
                                            break;
                                        case 'rejected':
                                            $status_class = 'status-rejected';
                                            $statusText = '已拒绝';
                                            break;
                                        case 'recall_initiated':
                                            $status_class = 'status-recall_initiated';
                                            $statusText = '扣回中';
                                            break;
                                        case 'recall_completed':
                                            $status_class = 'status-recall_completed';
                                            $statusText = '已扣回';
                                            break;
                                        case 'self_consumed':
                                            $status_class = 'status-self_consumed';
                                            $statusText = '用户自留';
                                            break;
                                        default:
                                            $status_class = 'status-default';
                                            $statusText = $row['status'];
                                    }
                                ?>
                                    <tr>
                                        <?php if ($role === 'admin'): ?>
                                            <td>
                                                <input type="checkbox" name="task_ids[]" 
                                                       value="<?= $row['id'] ?>" 
                                                       class="task-checkbox form-check-input"
                                                       data-status="<?= $row['status'] ?>"
                                                       data-group="<?= $row['user_group'] ?>">
                                            </td>
                                        <?php endif; ?>
                                        <td>
                                            <input type="checkbox" class="copy-task-checkbox form-check-input" 
                                                   data-id="<?= $row['id'] ?>"
                                                   data-account="<?= htmlspecialchars($row['account']) ?>"
                                                   data-password="<?= htmlspecialchars($row['password']) ?>"
                                                   data-spec="<?= htmlspecialchars($spec) ?>"
                                                   data-product="<?= htmlspecialchars($row['product_name'] ?? '未知号源') ?>">
                                        </td>
                                        <td>#TASK-<?= $row['id'] ?></td>
                                        <?php if ($role === 'admin'): ?><td><?= $row['user_name'] ?? 'N/A' ?></td><?php endif; ?>
                                        <td><?= htmlspecialchars($row['account']) ?></td>
                                        <td><?= htmlspecialchars($row['product_name'] ?? '未知号源') ?></td>
                                        <td title="<?= htmlspecialchars($spec) ?>">
                                            <?= htmlspecialchars(
                                                mb_strlen($spec, 'UTF-8') > 30 
                                                    ? mb_substr($spec, 0, 30, 'UTF-8').'...' 
                                                    : $spec
                                            ) ?>
                                        </td>
                                        <td>
                                            <?php if ($row['status'] === 'approved' && $row['agent_approved'] == 1): ?>
                                                <?= number_format($user_points) ?>
                                            <?php else: ?>
                                                - 
                                            <?php endif; ?>
                                        </td>
                                        <td><?= date('Y-m-d H:i', strtotime($row['created_at'])) ?></td>
                                        <td>
                                            <span class="status-badge <?= $status_class ?>"><?= $statusText ?></span>
                                        </td>
                                        <td>
                                            <?php if ($row['status'] === 'approved'): ?>
                                                <?php if ($row['agent_approved']): ?>
                                                    <span class="badge bg-success">代理已审核</span>
                                                <?php else: ?>
                                                    <span class="badge bg-warning">待代理审核</span>
                                                <?php endif; ?>
                                            <?php endif; ?>
                                        </td>
                                        <td>
                                            <?php if ($exported): ?>
                                                <span class="export-status exported">
                                                    <i class="fas fa-check-circle me-1"></i>已导出
                                                    <?php if ($export_time): ?>
                                                        <br><small><?= $export_time ?></small>
                                                    <?php endif; ?>
                                                </span>
                                            <?php else: ?>
                                                <span class="export-status not-exported">
                                                    <i class="fas fa-times-circle me-1"></i>未导出
                                                </span>
                                            <?php endif; ?>
                                        </td>
                                        <td><?= $reviewed_at ?></td>
                                        <td><?= $recalled_at ?></td>
                                        <td>
                                            <div class="action-buttons">
                                                <a href="view_task.php?id=<?= $row['id'] ?>" class="btn btn-sm btn-outline-primary action-btn">查看</a>
                                                <a href="export_zip.php?id=<?= $row['id'] ?>" class="btn btn-sm btn-outline-info action-btn export-btn" data-id="<?= $row['id'] ?>">
                                                    <?= $exported ? '再次导出' : '导出' ?>
                                                </a>
                                                <?php if ($role === 'admin'): ?>
                                                    <?php if ($row['status'] === 'pending'): ?>
                                                        <a href="task_review.php?id=<?= $row['id'] ?>" class="btn btn-sm btn-outline-success action-btn">审核</a>
                                                    <?php endif; ?>
                                                    <?php if ($row['status'] === 'approved' && $row['agent_approved']): ?>
                                                        <button class="btn btn-sm btn-warning recall-btn action-btn" 
                                                                data-id="<?= $row['id'] ?>" 
                                                                data-points="<?= $row['coin_amount'] ?>">扣回</button>
                                                    <?php endif; ?>
                                                    <a href="javascript:void(0);" onclick="confirmDelete(<?= $row['id'] ?>)" class="btn btn-sm btn-outline-danger action-btn">删除</a>
                                                <?php endif; ?>
                                            </div>
                                        </td>
                                    </tr>
                                <?php endwhile; ?>
                            <?php else: ?>
                                <tr>
                                    <td colspan="<?= $role === 'admin' ? 15 : 14 ?>" class="text-center py-4 text-muted">
                                        <i class="fas fa-inbox fs-1 mb-2"></i>
                                        <p class="mb-0">暂无任务</p>
                                    </td>
                                </tr>
                            <?php endif; ?>
                        </tbody>
                    </table>
                </div>
                
                <!-- 每页显示条数选择器 -->
                <div class="per-page-selector">
                    <span class="per-page-label">每页显示:</span>
                    <select class="per-page-select form-select" onchange="updatePerPage(this.value)">
                        <option value="10" <?= $per_page == 10 ? 'selected' : '' ?>>10条</option>
                        <option value="30" <?= $per_page == 30 ? 'selected' : '' ?>>30条</option>
                        <option value="50" <?= $per_page == 50 ? 'selected' : '' ?>>50条</option>
                        <option value="100" <?= $per_page == 100 ? 'selected' : '' ?>>100条</option>
                    </select>
                </div>
                
                
                                                <!-- 分页导航 -->
                <?php if ($total_pages > 1): ?>
                <nav aria-label="Page navigation">
                    <ul class="pagination">
                        <li class="page-item <?= $current_page <= 1 ? 'disabled' : '' ?>">
                            <a class="page-link" href="?<?= http_build_query(array_merge($_GET, ['page' => 1, 'per_page' => $per_page])) ?>" aria-label="First">
                                <span aria-hidden="true">&laquo;&laquo;</span>
                            </a>
                        </li>
                        <li class="page-item <?= $current_page <= 1 ? 'disabled' : '' ?>">
                            <a class="page-link" href="?<?= http_build_query(array_merge($_GET, ['page' => $current_page - 1, 'per_page' => $per_page])) ?>" aria-label="Previous">
                                <span aria-hidden="true">&laquo;</span>
                            </a>
                        </li>
                        
                        <?php
                        // 显示页码范围
                        $start_page = max(1, $current_page - 2);
                        $end_page = min($total_pages, $current_page + 2);
                        
                        for ($i = $start_page; $i <= $end_page; $i++): ?>
                            <li class="page-item <?= $i == $current_page ? 'active' : '' ?>">
                                <a class="page-link" href="?<?= http_build_query(array_merge($_GET, ['page' => $i, 'per_page' => $per_page])) ?>">
                                    <?= $i ?>
                                </a>
                            </li>
                        <?php endfor; ?>
                        
                        <li class="page-item <?= $current_page >= $total_pages ? 'disabled' : '' ?>">
                            <a class="page-link" href="?<?= http_build_query(array_merge($_GET, ['page' => $current_page + 1, 'per_page' => $per_page])) ?>" aria-label="Next">
                                <span aria-hidden="true">&raquo;</span>
                            </a>
                        </li>
                        <li class="page-item <?= $current_page >= $total_pages ? 'disabled' : '' ?>">
                            <a class="page-link" href="?<?= http_build_query(array_merge($_GET, ['page' => $total_pages, 'per_page' => $per_page])) ?>" aria-label="Last">
                                <span aria-hidden="true">&raquo;&raquo;</span>
                            </a>
                        </li>
                    </ul>
                    <div class="page-info">
                        显示第 <?= min(($current_page - 1) * $per_page + 1, $total_records) ?> 至 
                        <?= min($current_page * $per_page, $total_records) ?> 条记录，共 <?= $total_records ?> 条记录
                    </div>
                </nav>
                <?php endif; ?>
                
                <?php if ($role === 'admin' && $result->num_rows > 0): ?>
                <div class="d-flex justify-content-between align-items-center mt-3">
                    <div class="form-check">
                        <input class="form-check-input" type="checkbox" id="selectAllBottom">
                        <label class="form-check-label fw-medium" for="selectAllBottom">全选</label>
                    </div>
                    <div>
                        <button type="button" id="exportSelected" class="btn btn-danger">
                            <i class="fas fa-file-archive me-1"></i> 导出选中工单
                        </button>
                    </div>
                </div>
                <?php endif; ?>
            </div>
        </div>
    </div>
            <!-- 扣回任务模态框 -->
    <div class="modal fade" id="recallModal" tabindex="-1" aria-hidden="true">
        <div class="modal-dialog">
            <div class="modal-content">
                <form method="post" action="tasks.php" enctype="multipart/form-data">
                    <input type="hidden" name="task_id" id="recallTaskId">
                    <input type="hidden" name="recall_task" value="1">
                    <div class="modal-header">
                        <h5 class="modal-title">扣回任务</h5>
                        <button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
                    </div>
                    <div class="modal-body">
                        <div class="mb-3">
                            <label class="form-label">扣回积分</label>
                            <input type="text" class="form-control" id="recallPoints" readonly>
                        </div>
                        <div class="mb-3">
                            <label class="form-label">扣回原因 <span class="text-danger">*</span></label>
                            <textarea name="remark" class="form-control" rows="3" required></textarea>
                        </div>
                        <div class="mb-3">
                            <label class="form-label">扣回凭证（可选）</label>
                            <input type="file" name="deduction_images[]" class="form-control" multiple accept="image/*">
                            <div class="form-text">可上传多张图片，每张不超过5MB</div>
                        </div>
                    </div>
                    <div class="modal-footer">
                        <button type="button" class="btn btn-secondary" data-bs-dismiss="modal">取消</button>
                        <button type="submit" class="btn btn-warning">确认扣回</button>
                    </div>
                </form>
            </div>
        </div>
    </div>
    
    <script src="https://cdn.jsdelivr.net/npm/bootstrap@5.3.0/dist/js/bootstrap.bundle.min.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/sweetalert2@11/dist/sweetalert2.all.min.js"></script>
    <script>
        // 使用防抖技术减少频繁操作
        function debounce(func, wait) {
            let timeout;
            return function executedFunction(...args) {
                const later = () => {
                    clearTimeout(timeout);
                    func(...args);
                };
                clearTimeout(timeout);
                timeout = setTimeout(later, wait);
            };
        }

        // 更新每页显示数量
        function updatePerPage(value) {
            const params = new URLSearchParams(window.location.search);
            params.set('per_page', value);
            params.set('page', 1); // 重置到第一页
            window.location.href = 'tasks.php?' + params.toString();
        }

        // 全选功能
        function updateSelectAll() {
            const checkboxes = document.querySelectorAll('.task-checkbox');
            const allChecked = checkboxes.length > 0 && 
                            Array.from(checkboxes).every(checkbox => checkbox.checked);
            
            document.getElementById('selectAll').checked = allChecked;
            document.getElementById('selectAllBottom').checked = allChecked;
            document.getElementById('selectAllTop').checked = allChecked;
        }

        // 复制选择全选功能
        function updateCopySelectAll() {
            const checkboxes = document.querySelectorAll('.copy-task-checkbox');
            const allChecked = checkboxes.length > 0 && 
                            Array.from(checkboxes).every(checkbox => checkbox.checked);
            
            document.getElementById('copySelectAll').checked = allChecked;
            updateSelectedCount();
        }

        // 更新选中计数
        function updateSelectedCount() {
            const selectedCount = document.querySelectorAll('.copy-task-checkbox:checked').length;
            document.getElementById('selectedCount').textContent = selectedCount;
        }

        // 使用事件委托减少事件监听器数量
        document.addEventListener('change', function(e) {
            if (e.target.matches('#selectAll, #selectAllBottom, #selectAllTop')) {
                const checkboxes = document.querySelectorAll('.task-checkbox');
                checkboxes.forEach(checkbox => {
                    checkbox.checked = e.target.checked;
                });
                updateSelectAll();
            }
            
            if (e.target.matches('.task-checkbox')) {
                updateSelectAll();
            }
            
            if (e.target.matches('#copySelectAll')) {
                const checkboxes = document.querySelectorAll('.copy-task-checkbox');
                checkboxes.forEach(checkbox => {
                    checkbox.checked = e.target.checked;
                });
                updateCopySelectAll();
            }
            
            if (e.target.matches('.copy-task-checkbox')) {
                updateCopySelectAll();
            }
        });

        // 导出选中工单 - 添加导出状态更新
        document.getElementById('exportSelected').addEventListener('click', function() {
            const selectedTasks = [];
            const selectedCheckboxes = document.querySelectorAll('.task-checkbox:checked');
            
            selectedCheckboxes.forEach(checkbox => {
                selectedTasks.push({
                    id: checkbox.value,
                    status: checkbox.getAttribute('data-status'),
                    group: checkbox.getAttribute('data-group')
                });
            });
            
            if (selectedTasks.length === 0) {
                Swal.fire({
                    icon: 'error',
                    title: '导出错误',
                    text: '请至少选择一个工单进行导出',
                    confirmButtonColor: '#3085d6'
                });
                return;
            }
            
            // 显示导出中提示
            Swal.fire({
                title: '正在导出',
                html: `已选择 ${selectedTasks.length} 个工单，正在处理中...`,
                timer: 2000,
                timerProgressBar: true,
                didOpen: () => {
                    Swal.showLoading();
                }
            });
            
            // 创建表单提交
            const form = document.createElement('form');
            form.method = 'POST';
            form.action = 'export_multiple_tasks.php';
            
            selectedTasks.forEach(task => {
                const input = document.createElement('input');
                input.type = 'hidden';
                input.name = 'task_ids[]';
                input.value = task.id;
                form.appendChild(input);
            });
            
            document.body.appendChild(form);
            form.submit();
            
            // 更新前端状态显示（实际状态由数据库记录）
            setTimeout(() => {
                selectedCheckboxes.forEach(checkbox => {
                    const taskId = checkbox.value;
                    const row = checkbox.closest('tr');
                    if (row) {
                        const exportBtn = row.querySelector('.export-btn');
                        const statusElement = row.querySelector('.export-status');
                        
                        if (exportBtn) {
                            exportBtn.textContent = '再次导出';
                        }
                        
                        if (statusElement) {
                            statusElement.innerHTML = '<i class="fas fa-check-circle me-1"></i>已导出<br><small>刚刚</small>';
                            statusElement.className = 'export-status exported';
                        }
                    }
                });
            }, 1500);
        });

        // 删除任务确认函数 - 简化样式
        function confirmDelete(taskId) {
            Swal.fire({
                title: '确认删除任务',
                text: '您确定要删除这个任务吗？此操作不可恢复！',
                icon: 'warning',
                showCancelButton: true,
                confirmButtonColor: '#d33',
                cancelButtonColor: '#6c757d',
                confirmButtonText: '确认删除',
                cancelButtonText: '取消'
            }).then((result) => {
                if (result.isConfirmed) {
                    // 发送删除请求
                    fetch('delete_task.php?id=' + taskId, {
                        method: 'DELETE',
                        headers: {
                            'Content-Type': 'application/json'
                        }
                    })
                    .then(response => response.json())
                    .then(data => {
                        if (data.success) {
                            Swal.fire({
                                title: '删除成功',
                                text: '任务已成功删除',
                                icon: 'success',
                                confirmButtonText: '确定'
                            }).then(() => {
                                location.reload(); // 刷新页面
                            });
                        } else {
                            Swal.fire({
                                title: '删除失败',
                                text: data.message,
                                icon: 'error'
                            });
                        }
                    })
                    .catch(error => {
                        Swal.fire({
                            title: '请求失败',
                            text: '网络错误: ' + error,
                            icon: 'error'
                        });
                    });
                }
            });
        }

        // 扣回按钮点击事件 - 修复事件委托
        document.addEventListener('click', function(e) {
            // 检查点击的是否是扣回按钮或其中的元素
            const recallBtn = e.target.closest('.recall-btn');
            if (recallBtn) {
                const taskId = recallBtn.getAttribute('data-id');
                const points = recallBtn.getAttribute('data-points');
                
                // 检查必要属性
                if (!taskId || !points) {
                    console.error('扣回按钮缺少必要的data属性');
                    return;
                }
                
                const recallTaskIdInput = document.getElementById('recallTaskId');
                const recallPointsInput = document.getElementById('recallPoints');
                const recallModalElement = document.getElementById('recallModal');
                
                if (!recallTaskIdInput || !recallPointsInput || !recallModalElement) {
                    console.error('扣回模态框相关元素未找到');
                    return;
                }
                
                recallTaskIdInput.value = taskId;
                recallPointsInput.value = points;
                
                // 显示模态框
                const modal = new bootstrap.Modal(recallModalElement);
                modal.show();
            }
        });

        // 复制选中内容功能
        document.getElementById('copySelected').addEventListener('click', function() {
            const selectedTasks = [];
            const contentType = document.getElementById('copyContentType').value;
            
            document.querySelectorAll('.copy-task-checkbox:checked').forEach(checkbox => {
                selectedTasks.push({
                    id: checkbox.getAttribute('data-id'),
                    account: checkbox.getAttribute('data-account'),
                    password: checkbox.getAttribute('data-password'),
                    spec: checkbox.getAttribute('data-spec'),
                    product: checkbox.getAttribute('data-product')
                });
            });
            
            if (selectedTasks.length === 0) {
                Swal.fire({
                    icon: 'error',
                    title: '复制失败',
                    text: '请至少选择一个任务进行复制',
                    confirmButtonColor: '#3085d6'
                });
                return;
            }
            
            let textToCopy = '';
            
            switch(contentType) {
                case 'account':
                    textToCopy = selectedTasks.map(task => task.account).join('\n');
                    break;
                case 'password':
                    textToCopy = selectedTasks.map(task => task.password).join('\n');
                    break;
                case 'account_password':
                    textToCopy = selectedTasks.map(task => `${task.account}\t${task.password}`).join('\n');
                    break;
                case 'all':
                    textToCopy = selectedTasks.map(task => 
                        `ID: ${task.id}\n账号: ${task.account}\n密码: ${task.password}\n规格: ${task.spec}\n号源: ${task.product}\n`
                    ).join('\n');
                    break;
            }
            
            // 复制到剪贴板
            navigator.clipboard.writeText(textToCopy).then(() => {
                Swal.fire({
                    icon: 'success',
                    title: '复制成功',
                    text: `已复制 ${selectedTasks.length} 个任务的内容到剪贴板`,
                    confirmButtonColor: '#3085d6',
                    timer: 2000
                });
            }).catch(err => {
                console.error('复制失败:', err);
                Swal.fire({
                    icon: 'error',
                    title: '复制失败',
                    text: '请手动复制内容',
                    confirmButtonColor: '#3085d6'
                });
                
                // 备选方案：显示文本区域供用户手动复制
                const modalHtml = `
                    <div class="mb-3">
                        <label class="form-label">请手动复制以下内容</label>
                        <textarea class="form-control" rows="10" style="font-family: monospace;">${textToCopy}</textarea>
                    </div>
                `;
                
                Swal.fire({
                    title: '复制失败',
                    html: modalHtml,
                    confirmButtonText: '关闭',
                    width: '600px'
                });
            });
        });

        <?php if ($role === 'admin'): ?>
        // 批量操作处理 - 添加积分和原因输入
        document.getElementById('executeBatch').addEventListener('click', function() {
            const selectedTasks = [];
            document.querySelectorAll('.task-checkbox:checked').forEach(checkbox => {
                selectedTasks.push({
                    id: checkbox.value,
                    status: checkbox.getAttribute('data-status'),
                    group: checkbox.getAttribute('data-group')
                });
            });
            
            if (selectedTasks.length === 0) {
                Swal.fire({
                    icon: 'error',
                    title: '操作失败',
                    text: '请至少选择一个任务',
                    confirmButtonColor: '#3085d6'
                });
                return;
            }
            
            const action = document.getElementById('batchAction').value;
            if (!action) {
                Swal.fire({
                    icon: 'error',
                    title: '操作失败',
                    text: '请选择要执行的批量操作',
                    confirmButtonColor: '#3085d6'
                });
                return;
            }
            
            // 操作类型映射
            const actionTextMap = {
                'approve': '审核通过',
                'reject': '拒绝',
                'delete': '删除'
            };
            const actionText = actionTextMap[action];
            
            // 检查是否包含非待审核任务（仅审核操作需要）
            let hasReviewed = false;
            if (action === 'approve' || action === 'reject') {
                hasReviewed = selectedTasks.some(task => task.status !== 'pending');
            }
            
            // 处理不同操作类型的输入
            if (action === 'approve') {
                // 审核通过操作 - 无需输入积分数量
                Swal.fire({
                    title: `批量${actionText}操作`,
                    html: `
                        <div class="mb-3">
                            <p>您将批量审核通过 <strong>${selectedTasks.length}</strong> 个任务</p>
                            <p class="text-info">将使用用户组默认积分进行发放</p>
                            <div class="mb-3">
                                <label class="form-label">备注 (可选)</label>
                                <textarea id="batchRemarkInput" class="form-control" placeholder="请输入备注（可选）" rows="3"></textarea>
                            </div>
                        </div>
                    `,
                    showCancelButton: true,
                    confirmButtonColor: '#28a745',
                    cancelButtonColor: '#6c757d',
                    confirmButtonText: '确认通过',
                    cancelButtonText: '取消',
                    preConfirm: () => {
                        return {
                            remark: document.getElementById('batchRemarkInput').value.trim()
                        };
                    }
                }).then((result) => {
                    if (result.isConfirmed) {
                        // 设置隐藏字段值
                        document.getElementById('batchRemark').value = result.value.remark;
                        
                        // 设置选中的任务
                        const taskIds = selectedTasks.map(task => task.id);
                        document.getElementById('selectedTasks').value = JSON.stringify(taskIds);
                        
                        // 提交表单
                        document.getElementById('batchForm').submit();
                    }
                });
            } 
            else if (action === 'reject') {
                // 拒绝操作
                Swal.fire({
                    title: `批量${actionText}操作`,
                    html: `
                        <div class="mb-3">
                            <p>您将批量拒绝 <strong>${selectedTasks.length}</strong> 个任务</p>
                            <div class="mb-3">
                                <label class="form-label">拒绝原因 <span class="text-danger">*</span></label>
                                <textarea id="batchRemarkInput" class="form-control" placeholder="请输入拒绝原因" rows="3" required></textarea>
                            </div>
                        </div>
                    `,
                    showCancelButton: true,
                    confirmButtonColor: '#dc3545',
                    cancelButtonColor: '#6c757d',
                    confirmButtonText: '确认拒绝',
                    cancelButtonText: '取消',
                    preConfirm: () => {
                        // 验证输入
                        const remark = document.getElementById('batchRemarkInput').value.trim();
                        if (!remark) {
                            Swal.showValidationMessage('拒绝原因不能为空');
                            return false;
                        }
                        
                        return {
                            remark: remark
                        };
                    }
                }).then((result) => {
                    if (result.isConfirmed) {
                        document.getElementById('batchRemark').value = result.value.remark;
                        const taskIds = selectedTasks.map(task => task.id);
                        document.getElementById('selectedTasks').value = JSON.stringify(taskIds);
                        document.getElementById('batchForm').submit();
                    }
                });
            } 
            else if (action === 'delete') {
                // 删除操作
                Swal.fire({
                    title: '确认批量删除',
                    text: `您确定要删除选中的 ${selectedTasks.length} 个任务吗？此操作不可恢复！`,
                    icon: 'warning',
                    showCancelButton: true,
                    confirmButtonColor: '#d33',
                    cancelButtonColor: '#6c757d',
                    confirmButtonText: '确认删除',
                    cancelButtonText: '取消'
                }).then((result) => {
                    if (result.isConfirmed) {
                        const taskIds = selectedTasks.map(task => task.id);
                        document.getElementById('selectedTasks').value = JSON.stringify(taskIds);
                        document.getElementById('batchForm').submit();
                    }
                });
            }
        });
        <?php endif; ?>

        // 导出按钮点击后更新状态 - 使用事件委托
        document.addEventListener('click', function(e) {
            if (e.target.matches('.export-btn')) {
                const taskId = e.target.getAttribute('data-id');
                const row = e.target.closest('tr');
                const statusElement = row.querySelector('.export-status');
                
                // 显示导出中状态
                if (statusElement) {
                    statusElement.innerHTML = '<i class="fas fa-sync-alt fa-spin me-1"></i>导出中...';
                    statusElement.className = 'export-status exporting';
                }
                
                // 这里可以添加一个延迟，让服务器有时间更新状态
                setTimeout(() => {
                    if (statusElement) {
                        statusElement.innerHTML = '<i class="fas fa-check-circle me-1"></i>已导出<br><small>刚刚</small>';
                        statusElement.className = 'export-status exported';
                    }
                    
                    // 更新按钮文本
                    e.target.textContent = '再次导出';
                }, 1500);
            }
        });

        // 显示消息提示
        <?php if (isset($_SESSION['success'])): ?>
            Swal.fire({
                icon: 'success',
                title: '操作成功',
                text: '<?= addslashes($_SESSION['success']) ?>',
                confirmButtonColor: '#3085d6'
            });
            <?php unset($_SESSION['success']); ?>
        <?php endif; ?>

        <?php if (isset($_SESSION['error'])): ?>
            Swal.fire({
                icon: 'error',
                title: '操作失败',
                text: '<?= addslashes($_SESSION['error']) ?>',
                confirmButtonColor: '#3085d6'
            });
            <?php unset($_SESSION['error']); ?>
        <?php endif; ?>
    </script>
        </body>
</html>

<?php require_once __DIR__ . '/../includes/footer.php'; ?>