批量导出发货信息如何操作?

99ANYc3cd6
预计阅读时长 111 分钟
位置: 首页 业务流程 正文
<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">批量导出发货信息</title>
<link href="https://fonts.googleapis.com/css2?family=Space+Grotesk:wght@400;600;700&family=Noto+Sans+SC:wght@300;400;500;700&display=swap" rel="stylesheet">
<link href="https://cdnjs.cloudflare.com/ajax/libs/font-awesome/6.5.0/css/all.min.css" rel="stylesheet">
<script src="https://cdn.tailwindcss.com"></script>
<script src="https://cdn.jsdelivr.net/npm/xlsx@0.18.5/dist/xlsx.full.min.js"></script>
<style>
  :root {
    --bg: #0f1117;
    --bg-elevated: #181a24;
    --card: #1e2030;
    --card-hover: #252840;
    --border: #2a2d42;
    --fg: #e8e9f0;
    --fg-muted: #8b8fa3;
    --accent: #f59e0b;
    --accent-glow: rgba(245, 158, 11, 0.15);
    --success: #10b981;
    --danger: #ef4444;
    --info: #06b6d4;
  }
  * { margin: 0; padding: 0; box-sizing: border-box; }
  body {
    font-family: 'Noto Sans SC', sans-serif;
    background: var(--bg);
    color: var(--fg);
    min-height: 100vh;
    overflow-x: hidden;
  }
  /* 背景装饰 */
  .bg-decoration {
    position: fixed;
    inset: 0;
    pointer-events: none;
    z-index: 0;
    overflow: hidden;
  }
  .bg-decoration::before {
    content: '';
    position: absolute;
    top: -20%;
    right: -10%;
    width: 600px;
    height: 600px;
    background: radial-gradient(circle, rgba(245,158,11,0.06) 0%, transparent 70%);
    border-radius: 50%;
    animation: floatBlob 20s ease-in-out infinite;
  }
  .bg-decoration::after {
    content: '';
    position: absolute;
    bottom: -15%;
    left: -5%;
    width: 500px;
    height: 500px;
    background: radial-gradient(circle, rgba(6,182,212,0.04) 0%, transparent 70%);
    border-radius: 50%;
    animation: floatBlob 25s ease-in-out infinite reverse;
  }
  @keyframes floatBlob {
    0%, 100% { transform: translate(0, 0) scale(1); }
    33% { transform: translate(30px, -40px) scale(1.05); }
    66% { transform: translate(-20px, 20px) scale(0.95); }
  }
  /* 网格背景 */
  .grid-bg {
    position: fixed;
    inset: 0;
    pointer-events: none;
    z-index: 0;
    background-image:
      linear-gradient(rgba(42,45,66,0.3) 1px, transparent 1px),
      linear-gradient(90deg, rgba(42,45,66,0.3) 1px, transparent 1px);
    background-size: 60px 60px;
    mask-image: radial-gradient(ellipse 80% 60% at 50% 30%, black 20%, transparent 100%);
  }
  .app-container {
    position: relative;
    z-index: 1;
    max-width: 1400px;
    margin: 0 auto;
    padding: 24px;
  }
  /* 头部 */
  .app-header {
    display: flex;
    align-items: center;
    justify-content: space-between;
    margin-bottom: 32px;
    flex-wrap: wrap;
    gap: 16px;
  }
  .app-header .logo-area {
    display: flex;
    align-items: center;
    gap: 14px;
  }
  .logo-icon {
    width: 48px;
    height: 48px;
    background: linear-gradient(135deg, var(--accent), #d97706);
    border-radius: 14px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 22px;
    color: #000;
    box-shadow: 0 4px 20px rgba(245,158,11,0.25);
  }
  .app-title {
    font-family: 'Space Grotesk', 'Noto Sans SC', sans-serif;
    font-size: 26px;
    font-weight: 700;
    letter-spacing: -0.5px;
  }
  .app-subtitle {
    font-size: 13px;
    color: var(--fg-muted);
    margin-top: 2px;
  }
  /* 统计卡片 */
  .stats-row {
    display: grid;
    grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
    gap: 16px;
    margin-bottom: 28px;
  }
  .stat-card {
    background: var(--card);
    border: 1px solid var(--border);
    border-radius: 14px;
    padding: 20px 22px;
    display: flex;
    align-items: center;
    gap: 16px;
    transition: all 0.3s ease;
    position: relative;
    overflow: hidden;
  }
  .stat-card::after {
    content: '';
    position: absolute;
    top: 0;
    right: 0;
    width: 80px;
    height: 80px;
    border-radius: 50%;
    opacity: 0.06;
    transform: translate(20px, -20px);
  }
  .stat-card:hover {
    border-color: rgba(245,158,11,0.3);
    transform: translateY(-2px);
    box-shadow: 0 8px 30px rgba(0,0,0,0.3);
  }
  .stat-icon {
    width: 44px;
    height: 44px;
    border-radius: 12px;
    display: flex;
    align-items: center;
    justify-content: center;
    font-size: 18px;
    flex-shrink: 0;
  }
  .stat-value {
    font-family: 'Space Grotesk', sans-serif;
    font-size: 28px;
    font-weight: 700;
    line-height: 1;
  }
  .stat-label {
    font-size: 13px;
    color: var(--fg-muted);
    margin-top: 4px;
  }
  /* 工具栏 */
  .toolbar {
    background: var(--card);
    border: 1px solid var(--border);
    border-radius: 16px;
    padding: 20px 24px;
    margin-bottom: 20px;
    display: flex;
    align-items: center;
    gap: 12px;
    flex-wrap: wrap;
  }
  .search-box {
    position: relative;
    flex: 1;
    min-width: 220px;
  }
  .search-box i {
    position: absolute;
    left: 14px;
    top: 50%;
    transform: translateY(-50%);
    color: var(--fg-muted);
    font-size: 14px;
  }
  .search-box input {
    width: 100%;
    background: var(--bg-elevated);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 10px 14px 10px 40px;
    color: var(--fg);
    font-size: 14px;
    outline: none;
    transition: border-color 0.2s;
  }
  .search-box input::placeholder { color: var(--fg-muted); }
  .search-box input:focus { border-color: var(--accent); }
  .filter-select {
    background: var(--bg-elevated);
    border: 1px solid var(--border);
    border-radius: 10px;
    padding: 10px 36px 10px 14px;
    color: var(--fg);
    font-size: 14px;
    outline: none;
    cursor: pointer;
    appearance: none;
    background-image: url("data:image/svg+xml,%3Csvg xmlns='http://www.w3.org/2000/svg' width='12' height='12' viewBox='0 0 24 24' fill='none' stroke='%238b8fa3' stroke-width='2'%3E%3Cpath d='M6 9l6 6 6-6'/%3E%3C/svg%3E");
    background-repeat: no-repeat;
    background-position: right 12px center;
    transition: border-color 0.2s;
  }
  .filter-select:focus { border-color: var(--accent); }
  .btn {
    display: inline-flex;
    align-items: center;
    gap: 8px;
    padding: 10px 20px;
    border-radius: 10px;
    font-size: 14px;
    font-weight: 500;
    border: none;
    cursor: pointer;
    transition: all 0.25s ease;
    white-space: nowrap;
    font-family: inherit;
  }
  .btn-primary {
    background: linear-gradient(135deg, var(--accent), #d97706);
    color: #000;
    box-shadow: 0 2px 12px rgba(245,158,11,0.25);
  }
  .btn-primary:hover {
    transform: translateY(-1px);
    box-shadow: 0 4px 20px rgba(245,158,11,0.4);
  }
  .btn-secondary {
    background: var(--bg-elevated);
    color: var(--fg);
    border: 1px solid var(--border);
  }
  .btn-secondary:hover {
    border-color: var(--accent);
    background: var(--card-hover);
  }
  .btn-danger {
    background: rgba(239,68,68,0.1);
    color: var(--danger);
    border: 1px solid rgba(239,68,68,0.2);
  }
  .btn-danger:hover {
    background: rgba(239,68,68,0.2);
  }
  .btn-success {
    background: rgba(16,185,129,0.1);
    color: var(--success);
    border: 1px solid rgba(16,185,129,0.2);
  }
  .btn-success:hover {
    background: rgba(16,185,129,0.2);
  }
  .btn-sm {
    padding: 6px 12px;
    font-size: 12px;
    border-radius: 8px;
  }
  /* 表格容器 */
  .table-container {
    background: var(--card);
    border: 1px solid var(--border);
    border-radius: 16px;
    overflow: hidden;
    margin-bottom: 20px;
  }
  .table-scroll {
    overflow-x: auto;
  }
  table {
    width: 100%;
    border-collapse: collapse;
    min-width: 900px;
  }
  thead {
    background: var(--bg-elevated);
  }
  thead th {
    padding: 14px 16px;
    text-align: left;
    font-size: 12px;
    font-weight: 600;
    color: var(--fg-muted);
    text-transform: uppercase;
    letter-spacing: 0.5px;
    border-bottom: 1px solid var(--border);
    white-space: nowrap;
    user-select: none;
    cursor: pointer;
    transition: color 0.2s;
  }
  thead th:hover { color: var(--accent); }
  thead th .sort-icon { margin-left: 4px; font-size: 10px; opacity: 0.4; }
  thead th.sorted .sort-icon { opacity: 1; color: var(--accent); }
  tbody tr {
    border-bottom: 1px solid rgba(42,45,66,0.5);
    transition: background 0.15s;
  }
  tbody tr:hover { background: var(--card-hover); }
  tbody tr.selected { background: rgba(245,158,11,0.06); }
  tbody td {
    padding: 14px 16px;
    font-size: 14px;
    white-space: nowrap;
  }
  /* 复选框 */
  .custom-checkbox {
    width: 18px;
    height: 18px;
    border: 2px solid var(--border);
    border-radius: 5px;
    cursor: pointer;
    display: flex;
    align-items: center;
    justify-content: center;
    transition: all 0.2s;
    flex-shrink: 0;
  }
  .custom-checkbox:hover { border-color: var(--accent); }
  .custom-checkbox.checked {
    background: var(--accent);
    border-color: var(--accent);
  }
  .custom-checkbox.checked::after {
    content: '\f00c';
    font-family: 'Font Awesome 6 Free';
    font-weight: 900;
    font-size: 10px;
    color: #000;
  }
  /* 状态标签 */
  .status-badge {
    display: inline-flex;
    align-items: center;
    gap: 6px;
    padding: 4px 12px;
    border-radius: 20px;
    font-size: 12px;
    font-weight: 500;
  }
  .status-badge .dot {
    width: 6px;
    height: 6px;
    border-radius: 50%;
  }
  .status-pending { background: rgba(245,158,11,0.1); color: #fbbf24; }
  .status-pending .dot { background: #fbbf24; }
  .status-shipped { background: rgba(6,182,212,0.1); color: #22d3ee; }
  .status-shipped .dot { background: #22d3ee; }
  .status-delivered { background: rgba(16,185,129,0.1); color: #34d399; }
  .status-delivered .dot { background: #34d399; }
  .status-returned { background: rgba(239,68,68,0.1); color: #f87171; }
  .status-returned .dot { background: #f87171; }
  /* 底部操作栏 */
  .bottom-bar {
    background: var(--card);
    border: 1px solid var(--border);
    border-radius: 16px;
    padding: 16px 24px;
    display: flex;
    align-items: center;
    justify-content: space-between;
    flex-wrap: wrap;
    gap: 12px;
  }
  .selected-info {
    font-size: 14px;
    color: var(--fg-muted);
  }
  .selected-info strong {
    color: var(--accent);
    font-weight: 700;
  }
  .pagination {
    display: flex;
    align-items: center;
    gap: 4px;
  }
  .page-btn {
    width: 36px;
    height: 36px;
    display: flex;
    align-items: center;
    justify-content: center;
    border-radius: 8px;
    border: 1px solid var(--border);
    background: transparent;
    color: var(--fg-muted);
    cursor: pointer;
    font-size: 13px;
    transition: all 0.2s;
    font-family: 'Space Grotesk', sans-serif;
  }
  .page-btn:hover { border-color: var(--accent); color: var(--fg); }
  .page-btn.active {
    background: var(--accent);
    color: #000;
    border-color: var(--accent);
    font-weight: 700;
  }
  .page-btn:disabled { opacity: 0.3; cursor: not-allowed; }
  /* Toast 通知 */
  .toast-container {
    position: fixed;
    top: 24px;
    right: 24px;
    z-index: 9999;
    display: flex;
    flex-direction: column;
    gap: 10px;
  }
  .toast {
    background: var(--card);
    border: 1px solid var(--border);
    border-radius: 12px;
    padding: 14px 20px;
    display: flex;
    align-items: center;
    gap: 12px;
    font-size: 14px;
    box-shadow: 0 8px 30px rgba(0,0,0,0.4);
    animation: toastIn 0.35s ease;
    min-width: 280px;
  }
  .toast.toast-out { animation: toastOut 0.3s ease forwards; }
  .toast-icon { font-size: 18px; flex-shrink: 0; }
  .toast-success .toast-icon { color: var(--success); }
  .toast-error .toast-icon { color: var(--danger); }
  .toast-info .toast-icon { color: var(--info); }
  @keyframes toastIn {
    from { opacity: 0; transform: translateX(40px); }
    to { opacity: 1; transform: translateX(0); }
  }
  @keyframes toastOut {
    from { opacity: 1; transform: translateX(0); }
    to { opacity: 0; transform: translateX(40px); }
  }
  /* 模态框 */
  .modal-overlay {
    position: fixed;
    inset: 0;
    background: rgba(0,0,0,0.6);
    backdrop-filter: blur(4px);
    z-index: 1000;
    display: flex;
    align-items: center;
    justify-content: center;
    opacity: 0;
    pointer-events: none;
    transition: opacity 0.3s;
  }
  .modal-overlay.active { opacity: 1; pointer-events: all; }
  .modal {
    background: var(--card);
    border: 1px solid var(--border);
    border-radius: 20px;
    padding: 32px;
    max-width: 520px;
    width: 90%;
    transform: scale(0.9) translateY(20px);
    transition: transform 0.3s ease;
  }
  .modal-overlay.active .modal { transform: scale(1) translateY(0); }
  .modal-title {
    font-size: 20px;
    font-weight: 700;
    margin-bottom: 8px;
  }
  .modal-desc {
    font-size: 14px;
    color: var(--fg-muted);
    margin-bottom: 24px;
    line-height: 1.6;
  }
  .modal-actions {
    display: flex;
    gap: 10px;
    justify-content: flex-end;
  }
  /* 导出选项 */
  .export-options {
    display: grid;
    grid-template-columns: 1fr 1fr;
    gap: 12px;
    margin-bottom: 24px;
  }
  .export-option {
    background: var(--bg-elevated);
    border: 2px solid var(--border);
    border-radius: 12px;
    padding: 16px;
    cursor: pointer;
    transition: all 0.2s;
    text-align: center;
  }
  .export-option:hover { border-color: rgba(245,158,11,0.3); }
  .export-option.active { border-color: var(--accent); background: var(--accent-glow); }
  .export-option i { font-size: 28px; margin-bottom: 8px; display: block; }
  .export-option .label { font-size: 14px; font-weight: 600; }
  .export-option .desc { font-size: 11px; color: var(--fg-muted); margin-top: 4px; }
  /* 进度条 */
  .progress-bar {
    width: 100%;
    height: 4px;
    background: var(--bg-elevated);
    border-radius: 2px;
    overflow: hidden;
    margin-top: 16px;
    display: none;
  }
  .progress-bar.active { display: block; }
  .progress-fill {
    height: 100%;
    background: linear-gradient(90deg, var(--accent), #d97706);
    border-radius: 2px;
    width: 0%;
    transition: width 0.3s ease;
  }
  /* 空状态 */
  .empty-state {
    text-align: center;
    padding: 60px 20px;
    color: var(--fg-muted);
  }
  .empty-state i { font-size: 48px; margin-bottom: 16px; opacity: 0.3; }
  .empty-state p { font-size: 15px; }
  /* 滚动条 */
  ::-webkit-scrollbar { width: 6px; height: 6px; }
  ::-webkit-scrollbar-track { background: transparent; }
  ::-webkit-scrollbar-thumb { background: var(--border); border-radius: 3px; }
  ::-webkit-scrollbar-thumb:hover { background: var(--fg-muted); }
  /* 响应式 */
  @media (max-width: 768px) {
    .app-container { padding: 16px; }
    .app-title { font-size: 20px; }
    .stats-row { grid-template-columns: repeat(2, 1fr); }
    .toolbar { flex-direction: column; align-items: stretch; }
    .search-box { min-width: auto; }
    .export-options { grid-template-columns: 1fr; }
    .bottom-bar { flex-direction: column; align-items: stretch; text-align: center; }
    .pagination { justify-content: center; }
  }
  /* 动画入场 */
  @keyframes fadeUp {
    from { opacity: 0; transform: translateY(16px); }
    to { opacity: 1; transform: translateY(0); }
  }
  .animate-in {
    animation: fadeUp 0.5s ease both;
  }
  .delay-1 { animation-delay: 0.05s; }
  .delay-2 { animation-delay: 0.1s; }
  .delay-3 { animation-delay: 0.15s; }
  .delay-4 { animation-delay: 0.2s; }
  @media (prefers-reduced-motion: reduce) {
    *, *::before, *::after {
      animation-duration: 0.01ms !important;
      transition-duration: 0.01ms !important;
    }
  }
</style>
</head>
<body>
<div class="bg-decoration"></div>
<div class="grid-bg"></div>
<div class="app-container">
  <!-- 头部 -->
  <header class="app-header animate-in">
    <div class="logo-area">
      <div class="logo-icon"><i class="fa-solid fa-truck-fast"></i></div>
      <div>
        <div class="app-title">发货信息管理</div>
        <div class="app-subtitle">批量查询、筛选与导出发货数据</div>
      </div>
    </div>
    <div style="display:flex; gap:10px;">
      <button class="btn btn-secondary" onclick="addSampleData()">
        <i class="fa-solid fa-plus"></i> 添加示例
      </button>
      <button class="btn btn-primary" onclick="openExportModal()">
        <i class="fa-solid fa-file-export"></i> 批量导出
      </button>
    </div>
  </header>
  <!-- 统计卡片 -->
  <div class="stats-row animate-in delay-1">
    <div class="stat-card">
      <div class="stat-icon" style="background:rgba(245,158,11,0.1);color:#fbbf24;">
        <i class="fa-solid fa-box"></i>
      </div>
      <div>
        <div class="stat-value" id="statTotal">0</div>
        <div class="stat-label">总订单数</div>
      </div>
    </div>
    <div class="stat-card">
      <div class="stat-icon" style="background:rgba(245,158,11,0.1);color:#fbbf24;">
        <i class="fa-solid fa-clock"></i>
      </div>
      <div>
        <div class="stat-value" id="statPending">0</div>
        <div class="stat-label">待发货</div>
      </div>
    </div>
    <div class="stat-card">
      <div class="stat-icon" style="background:rgba(6,182,212,0.1);color:#22d3ee;">
        <i class="fa-solid fa-shipping-fast"></i>
      </div>
      <div>
        <div class="stat-value" id="statShipped">0</div>
        <div class="stat-label">运输中</div>
      </div>
    </div>
    <div class="stat-card">
      <div class="stat-icon" style="background:rgba(16,185,129,0.1);color:#34d399;">
        <i class="fa-solid fa-circle-check"></i>
      </div>
      <div>
        <div class="stat-value" id="statDelivered">0</div>
        <div class="stat-label">已签收</div>
      </div>
    </div>
    <div class="stat-card">
      <div class="stat-icon" style="background:rgba(239,68,68,0.1);color:#f87171;">
        <i class="fa-solid fa-rotate-left"></i>
      </div>
      <div>
        <div class="stat-value" id="statReturned">0</div>
        <div class="stat-label">已退回</div>
      </div>
    </div>
  </div>
  <!-- 工具栏 -->
  <div class="toolbar animate-in delay-2">
    <div class="search-box">
      <i class="fa-solid fa-magnifying-glass"></i>
      <input type="text" id="searchInput" placeholder="搜索订单号、收件人、物流单号..." oninput="handleSearch()">
    </div>
    <select class="filter-select" id="statusFilter" onchange="handleFilter()">
      <option value="all">全部状态</option>
      <option value="待发货">待发货</option>
      <option value="已发货">已发货</option>
      <option value="已签收">已签收</option>
      <option value="已退回">已退回</option>
    </select>
    <select class="filter-select" id="carrierFilter" onchange="handleFilter()">
      <option value="all">全部物流</option>
      <option value="顺丰速运">顺丰速运</option>
      <option value="中通快递">中通快递</option>
      <option value="圆通速递">圆通速递</option>
      <option value="韵达快递">韵达快递</option>
      <option value="京东物流">京东物流</option>
      <option value="极兔速递">极兔速递</option>
    </select>
    <select class="filter-select" id="dateFilter" onchange="handleFilter()">
      <option value="all">全部时间</option>
      <option value="7">近7天</option>
      <option value="30">近30天</option>
      <option value="90">近90天</option>
    </select>
    <button class="btn btn-secondary btn-sm" onclick="resetFilters()">
      <i class="fa-solid fa-arrow-rotate-left"></i> 重置
    </button>
  </div>
  <!-- 表格 -->
  <div class="table-container animate-in delay-3">
    <div class="table-scroll">
      <table>
        <thead>
          <tr>
            <th style="width:44px;">
              <div class="custom-checkbox" id="selectAll" onclick="toggleSelectAll()"></div>
            </th>
            <th onclick="sortBy('orderNo')">订单号 <i class="fa-solid fa-sort sort-icon"></i></th>
            <th onclick="sortBy('date')">下单日期 <i class="fa-solid fa-sort sort-icon"></i></th>
            <th onclick="sortBy('recipient')">收件人 <i class="fa-solid fa-sort sort-icon"></i></th>
            <th>联系电话</th>
            <th>收货地址</th>
            <th>商品名称</th>
            <th onclick="sortBy('quantity')">数量 <i class="fa-solid fa-sort sort-icon"></i></th>
            <th>物流公司</th>
            <th>物流单号</th>
            <th onclick="sortBy('status')">状态 <i class="fa-solid fa-sort sort-icon"></i></th>
            <th style="width:80px;">操作</th>
          </tr>
        </thead>
        <tbody id="tableBody"></tbody>
      </table>
    </div>
    <div class="empty-state" id="emptyState" style="display:none;">
      <i class="fa-solid fa-inbox"></i>
      <p>暂无匹配的发货记录</p>
    </div>
  </div>
  <!-- 底部操作栏 -->
  <div class="bottom-bar animate-in delay-4">
    <div class="selected-info">
      已选择 <strong id="selectedCount">0</strong> 条记录,
      共 <strong id="filteredTotal">0</strong> 条匹配
    </div>
    <div style="display:flex; align-items:center; gap:12px;">
      <button class="btn btn-success btn-sm" onclick="exportSelected('csv')" id="exportCsvBtn" disabled>
        <i class="fa-solid fa-file-csv"></i> 导出CSV
      </button>
      <button class="btn btn-success btn-sm" onclick="exportSelected('excel')" id="exportExcelBtn" disabled>
        <i class="fa-solid fa-file-excel"></i> 导出Excel
      </button>
      <button class="btn btn-danger btn-sm" onclick="deleteSelected()" id="deleteBtn" disabled>
        <i class="fa-solid fa-trash"></i> 删除选中
      </button>
    </div>
    <div class="pagination" id="pagination"></div>
  </div>
</div>
<!-- 导出模态框 -->
<div class="modal-overlay" id="exportModal">
  <div class="modal">
    <div class="modal-title">批量导出发货信息</div>
    <div class="modal-desc">选择导出格式和范围,系统将生成对应文件供下载。</div>
    <div class="export-options">
      <div class="export-option active" data-format="excel" onclick="selectExportFormat(this)">
        <i class="fa-solid fa-file-excel" style="color:#34d399;"></i>
        <div class="label">Excel 格式</div>
        <div class="desc">.xlsx · 支持筛选排序</div>
      </div>
      <div class="export-option" data-format="csv" onclick="selectExportFormat(this)">
        <i class="fa-solid fa-file-csv" style="color:#22d3ee;"></i>
        <div class="label">CSV 格式</div>
        <div class="desc">.csv · 通用兼容</div>
      </div>
    </div>
    <div style="margin-bottom:20px;">
      <label style="font-size:13px; color:var(--fg-muted); display:block; margin-bottom:8px;">导出范围</label>
      <div style="display:flex; gap:10px;">
        <label style="display:flex; align-items:center; gap:8px; cursor:pointer; font-size:14px;">
          <input type="radio" name="exportScope" value="selected" id="scopeSelected" style="accent-color:var(--accent);">
          仅选中项 (<span id="modalSelectedCount">0</span>条)
        </label>
        <label style="display:flex; align-items:center; gap:8px; cursor:pointer; font-size:14px;">
          <input type="radio" name="exportScope" value="filtered" id="scopeFiltered" checked style="accent-color:var(--accent);">
          当前筛选结果 (<span id="modalFilteredCount">0</span>条)
        </label>
        <label style="display:flex; align-items:center; gap:8px; cursor:pointer; font-size:14px;">
          <input type="radio" name="exportScope" value="all" style="accent-color:var(--accent);">
          全部数据 (<span id="modalAllCount">0</span>条)
        </label>
      </div>
    </div>
    <div class="progress-bar" id="exportProgress">
      <div class="progress-fill" id="exportProgressFill"></div>
    </div>
    <div class="modal-actions">
      <button class="btn btn-secondary" onclick="closeExportModal()">取消</button>
      <button class="btn btn-primary" onclick="doExport()" id="confirmExportBtn">
        <i class="fa-solid fa-download"></i> 确认导出
      </button>
    </div>
  </div>
</div>
<!-- 删除确认模态框 -->
<div class="modal-overlay" id="deleteModal">
  <div class="modal">
    <div class="modal-title">确认删除</div>
    <div class="modal-desc">确定要删除选中的 <strong id="deleteCount" style="color:var(--danger);">0</strong> 条发货记录吗?此操作不可撤销。</div>
    <div class="modal-actions">
      <button class="btn btn-secondary" onclick="closeDeleteModal()">取消</button>
      <button class="btn btn-danger" onclick="confirmDelete()">
        <i class="fa-solid fa-trash"></i> 确认删除
      </button>
    </div>
  </div>
</div>
<!-- Toast 容器 -->
<div class="toast-container" id="toastContainer"></div>
<script>
// ========== 数据 ==========
const recipients = ['张伟', '李娜', '王芳', '刘洋', '陈明', '杨丽', '赵强', '黄敏', '周杰', '吴秀英', '徐磊', '孙艳', '马超', '朱婷', '胡建华', '郭晓', '何雪', '林峰', '罗敏', '梁志远'];
const products = ['无线蓝牙耳机', '机械键盘', '手机壳', '充电宝', '智能手表', '平板支架', 'USB-C数据线', '鼠标垫', '显示器挂灯', '摄像头', '移动硬盘', '路由器', '蓝牙音箱', '笔记本散热器', 'Type-C扩展坞'];
const carriers = ['顺丰速运', '中通快递', '圆通速递', '韵达快递', '京东物流', '极兔速递'];
const statuses = ['待发货', '已发货', '已签收', '已退回'];
const cities = [
  '北京市朝阳区建国路88号', '上海市浦东新区陆家嘴环路1000号', '广州市天河区天河路385号',
  '深圳市南山区科技园南路16号', '杭州市西湖区文三路478号', '成都市武侯区天府大道999号',
  '南京市鼓楼区中山北路30号', '武汉市江汉区解放大道688号', '重庆市渝中区解放碑步行街1号',
  '西安市雁塔区高新路56号', '苏州市工业园区星湖街328号', '长沙市岳麓区麓山南路36号',
  '郑州市金水区花园路100号', '青岛市市南区香港中路76号
批量导出发货信息
(图片来源网络,侵删)
-- 展开阅读全文 --
头像
三亚荔枝沟顺丰快递
« 上一篇 今天
百世快递单号是几位数?
下一篇 » 今天

相关文章

取消
微信二维码
支付宝二维码

最近发表

网站分类

动态快讯

标签列表

目录[+]