智慧水务管理系统 - 精河县供水工程综合管理平台

public-pool.html 5.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154
  1. <!DOCTYPE html>
  2. <html lang="zh-CN">
  3. <head>
  4. <meta charset="UTF-8">
  5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
  6. <title>公海池 - 轻量 CRM</title>
  7. <script src="https://cdn.tailwindcss.com"></script>
  8. <style>
  9. @media (max-width: 640px) {
  10. .mobile-stack { flex-direction: column !important; }
  11. .mobile-full { width: 100% !important; }
  12. }
  13. </style>
  14. </head>
  15. <body class="bg-gray-50 min-h-screen">
  16. <!-- 顶部导航 -->
  17. <nav class="bg-indigo-600 text-white shadow-lg">
  18. <div class="container mx-auto px-4 py-4">
  19. <div class="flex justify-between items-center">
  20. <div class="flex items-center space-x-3">
  21. <span class="text-2xl">📊</span>
  22. <h1 class="text-xl font-bold">轻量 CRM</h1>
  23. </div>
  24. <div class="flex space-x-4">
  25. <a href="/" class="hover:bg-indigo-500 px-3 py-2 rounded">首页</a>
  26. <a href="/customers" class="hover:bg-indigo-500 px-3 py-2 rounded">客户</a>
  27. <a href="/leads" class="hover:bg-indigo-500 px-3 py-2 rounded">线索</a>
  28. <a href="/public-pool" class="bg-indigo-500 px-3 py-2 rounded">公海池</a>
  29. </div>
  30. </div>
  31. </div>
  32. </nav>
  33. <!-- 主内容区 -->
  34. <main class="container mx-auto px-4 py-8">
  35. <!-- 页面标题 -->
  36. <div class="mb-8">
  37. <h2 class="text-3xl font-bold text-gray-800">🌊 公海池</h2>
  38. <p class="text-gray-600 mt-2">无人跟进的客户资源,领取后成为您的专属客户</p>
  39. </div>
  40. <!-- 统计卡片 -->
  41. <div class="grid grid-cols-1 md:grid-cols-3 gap-6 mb-8">
  42. <div class="bg-white rounded-lg shadow p-6">
  43. <div class="flex items-center justify-between">
  44. <div>
  45. <p class="text-gray-500 text-sm">公海客户数</p>
  46. <p id="poolCount" class="text-3xl font-bold text-blue-600">-</p>
  47. </div>
  48. <div class="text-4xl">🌊</div>
  49. </div>
  50. </div>
  51. <div class="bg-white rounded-lg shadow p-6">
  52. <div class="flex items-center justify-between">
  53. <div>
  54. <p class="text-gray-500 text-sm">本周领取</p>
  55. <p id="weekClaimed" class="text-3xl font-bold text-green-600">-</p>
  56. </div>
  57. <div class="text-4xl">📥</div>
  58. </div>
  59. </div>
  60. <div class="bg-white rounded-lg shadow p-6">
  61. <div class="flex items-center justify-between">
  62. <div>
  63. <p class="text-gray-500 text-sm">本周释放</p>
  64. <p id="weekReleased" class="text-3xl font-bold text-orange-600">-</p>
  65. </div>
  66. <div class="text-4xl">📤</div>
  67. </div>
  68. </div>
  69. </div>
  70. <!-- 公海池列表 -->
  71. <div class="bg-white rounded-lg shadow overflow-hidden">
  72. <div class="px-6 py-4 bg-gray-50 border-b">
  73. <h3 class="text-lg font-semibold">可领取客户</h3>
  74. </div>
  75. <div id="poolList" class="divide-y divide-gray-200">
  76. <div class="px-6 py-8 text-center text-gray-500">加载中...</div>
  77. </div>
  78. </div>
  79. </main>
  80. <script>
  81. const API_BASE = '';
  82. // 加载公海池列表
  83. async function loadPool() {
  84. try {
  85. const res = await fetch(`${API_BASE}/api/public-pool`);
  86. const data = await res.json();
  87. if (data.success) {
  88. document.getElementById('poolCount').textContent = data.data.length;
  89. renderPool(data.data);
  90. }
  91. } catch (error) {
  92. console.error('加载失败:', error);
  93. }
  94. }
  95. // 渲染公海池列表
  96. function renderPool(pool) {
  97. const container = document.getElementById('poolList');
  98. if (pool.length === 0) {
  99. container.innerHTML = '<div class="px-6 py-8 text-center text-gray-500">公海池空空如也 ~</div>';
  100. return;
  101. }
  102. container.innerHTML = pool.map(p => `
  103. <div class="px-6 py-4 hover:bg-gray-50 flex items-center justify-between">
  104. <div class="flex-1">
  105. <div class="flex items-center space-x-3">
  106. <h4 class="font-medium text-gray-900">${p.name}</h4>
  107. <span class="text-xs bg-blue-100 text-blue-700 px-2 py-1 rounded">公海客户</span>
  108. </div>
  109. <div class="mt-1 text-sm text-gray-600">
  110. ${p.company ? `<span>🏢 ${p.company}</span>` : ''}
  111. ${p.phone ? `<span class="ml-3">📱 ${p.phone}</span>` : ''}
  112. <span class="ml-3 text-gray-400">来源:${p.source || '-'}</span>
  113. </div>
  114. <div class="mt-1 text-xs text-gray-500">
  115. 释放原因:${p.reason || '无'} · 释放时间:${new Date(p.released_at).toLocaleString('zh-CN')}
  116. </div>
  117. </div>
  118. <button onclick="claimPool(${p.id}, '${p.name}')" class="ml-4 bg-green-600 text-white px-4 py-2 rounded-lg hover:bg-green-700 transition">
  119. 📥 领取
  120. </button>
  121. </div>
  122. `).join('');
  123. }
  124. // 领取公海池客户
  125. async function claimPool(id, name) {
  126. if (!confirm(`确定要领取客户"${name}"吗?领取后将成为您的专属客户。`)) return;
  127. try {
  128. const res = await fetch(`${API_BASE}/api/public-pool/${id}/claim`, { method: 'POST' });
  129. const result = await res.json();
  130. if (result.success) {
  131. alert(`✅ 已成功领取客户"${name}"`);
  132. loadPool();
  133. } else {
  134. alert('❌ ' + result.error);
  135. }
  136. } catch (error) {
  137. alert('❌ 领取失败:' + error.message);
  138. }
  139. }
  140. // 页面加载
  141. document.addEventListener('DOMContentLoaded', loadPool);
  142. </script>
  143. </body>
  144. </html>