説明なし

index.vue 6.4KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278
  1. <script setup lang="ts">
  2. import { useRouter } from 'vue-router';
  3. const router = useRouter();
  4. // 跳转至任务详情页
  5. const handleTaskClick = (taskId: number) => {
  6. router.push(`/schedule/detail/${taskId}`);
  7. };
  8. // 模拟数据
  9. const emergencyTasks = [
  10. {
  11. id: 1,
  12. title: '应急演练',
  13. icon: 'warning',
  14. color: '#FFB020',
  15. deadline: '12-31 23:59',
  16. days: 61,
  17. },
  18. {
  19. id: 2,
  20. title: '纳税人普查',
  21. icon: 'document',
  22. color: '#409EFF',
  23. deadline: '12-31 23:59',
  24. days: 61,
  25. },
  26. ];
  27. const todayTasks = [
  28. {
  29. id: 1,
  30. title: '监控录像抽检',
  31. icon: 'monitor',
  32. color: '#F56C6C',
  33. deadline: '12-07 23:59',
  34. },
  35. {
  36. id: 2,
  37. title: '爆缸试水1',
  38. icon: 'water',
  39. color: '#409EFF',
  40. deadline: '12-14 23:00',
  41. },
  42. {
  43. id: 3,
  44. title: '应急消防用品月检',
  45. icon: 'fire',
  46. color: '#67C23A',
  47. deadline: '12-31 13:59',
  48. },
  49. {
  50. id: 4,
  51. title: '核对销售(油品)调查1',
  52. icon: 'check',
  53. color: '#E6A23C',
  54. deadline: '12-15 23:59',
  55. },
  56. {
  57. id: 5,
  58. title: '便利店盘点',
  59. icon: 'shopping',
  60. color: '#E6A23C',
  61. deadline: '12-31 23:59',
  62. },
  63. {
  64. id: 6,
  65. title: '新员工三级教育',
  66. icon: 'user',
  67. color: '#409EFF',
  68. deadline: '12-06 23:00',
  69. },
  70. {
  71. id: 7,
  72. title: '厨房宿舍月检',
  73. icon: 'home',
  74. color: '#909399',
  75. deadline: '12-31 23:59',
  76. },
  77. {
  78. id: 8,
  79. title: '收油流程巡检',
  80. icon: 'oil',
  81. color: '#409EFF',
  82. deadline: '12-07 23:59',
  83. },
  84. {
  85. id: 9,
  86. title: '第一次例会',
  87. icon: 'meeting',
  88. color: '#409EFF',
  89. deadline: '12-15 23:00',
  90. },
  91. {
  92. id: 10,
  93. title: '建军计划',
  94. icon: 'plan',
  95. color: '#67C23A',
  96. deadline: '12-03 23:00',
  97. },
  98. {
  99. id: 11,
  100. title: '员工培训',
  101. icon: 'training',
  102. color: '#409EFF',
  103. deadline: '12-31 23:59',
  104. },
  105. ];
  106. const tomorrowTasks = [
  107. {
  108. id: 1,
  109. title: '巡检日检',
  110. icon: 'check',
  111. color: '#67C23A',
  112. deadline: '12-31 13:59',
  113. },
  114. {
  115. id: 2,
  116. title: '爆缸试水1',
  117. icon: 'water',
  118. color: '#409EFF',
  119. deadline: '12-14 23:00',
  120. },
  121. {
  122. id: 3,
  123. title: '应急消防用品月检',
  124. icon: 'fire',
  125. color: '#67C23A',
  126. deadline: '12-31 13:59',
  127. },
  128. {
  129. id: 4,
  130. title: '核对销售(油品)调查1',
  131. icon: 'check',
  132. color: '#E6A23C',
  133. deadline: '12-15 23:59',
  134. },
  135. {
  136. id: 5,
  137. title: '便利店盘点',
  138. icon: 'shopping',
  139. color: '#E6A23C',
  140. deadline: '12-31 23:59',
  141. },
  142. {
  143. id: 6,
  144. title: '新员工三级教育',
  145. icon: 'user',
  146. color: '#409EFF',
  147. deadline: '12-06 23:00',
  148. },
  149. {
  150. id: 7,
  151. title: '巡检日检',
  152. icon: 'check',
  153. color: '#67C23A',
  154. deadline: '12-31 13:59',
  155. },
  156. ];
  157. // 模拟图标映射
  158. const getIconEmoji = (icon: string) => {
  159. const iconMap: Record<string, string> = {
  160. warning: '⚠️',
  161. document: '📄',
  162. monitor: '📺',
  163. water: '💧',
  164. fire: '🔥',
  165. check: '✅',
  166. shopping: '🛒',
  167. home: '🏠',
  168. oil: '⛽',
  169. meeting: '📋',
  170. plan: '📝',
  171. training: '🎓',
  172. user: '👤',
  173. };
  174. return iconMap[icon] || '📌';
  175. };
  176. </script>
  177. <template>
  178. <!-- 逾期待处理 -->
  179. <div class="mb-6">
  180. <h3 class="mb-3 text-lg font-semibold">逾期待处理</h3>
  181. <div
  182. class="grid grid-cols-4 gap-4 sm:grid-cols-4 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6"
  183. >
  184. <div
  185. v-for="task in emergencyTasks"
  186. :key="task.id"
  187. class="hover:border-primary flex cursor-pointer items-center rounded-lg border border-gray-200 bg-white p-4 shadow-sm transition-all hover:shadow-md"
  188. @click="handleTaskClick(task.id)"
  189. >
  190. <div
  191. class="mr-4 flex h-10 w-10 items-center justify-center rounded-full"
  192. :style="{ backgroundColor: `${task.color}20`, color: task.color }"
  193. >
  194. <span class="text-xl">{{ getIconEmoji(task.icon) }}</span>
  195. </div>
  196. <div class="min-w-0 flex-1">
  197. <div
  198. class="overflow-hidden text-ellipsis whitespace-nowrap font-medium"
  199. >
  200. {{ task.title }}
  201. </div>
  202. <div class="text-sm text-gray-500">{{ task.deadline }}</div>
  203. </div>
  204. <div class="ml-4 whitespace-nowrap font-medium text-red-500">
  205. {{ task.days }}天
  206. </div>
  207. </div>
  208. </div>
  209. </div>
  210. <!-- 当日任务 -->
  211. <div class="mb-6">
  212. <h3 class="mb-3 text-lg font-semibold">当日</h3>
  213. <div
  214. class="grid grid-cols-4 gap-4 sm:grid-cols-4 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6"
  215. >
  216. <div
  217. v-for="task in todayTasks"
  218. :key="task.id"
  219. class="hover:border-primary flex cursor-pointer items-center rounded-lg border border-gray-200 bg-white p-4 shadow-sm transition-all hover:shadow-md"
  220. @click="handleTaskClick(task.id)"
  221. >
  222. <div
  223. class="mr-4 flex h-10 w-10 items-center justify-center rounded-full"
  224. :style="{ backgroundColor: `${task.color}20`, color: task.color }"
  225. >
  226. <span class="text-xl">{{ getIconEmoji(task.icon) }}</span>
  227. </div>
  228. <div class="min-w-0 flex-1">
  229. <div
  230. class="overflow-hidden text-ellipsis whitespace-nowrap font-medium"
  231. >
  232. {{ task.title }}
  233. </div>
  234. <div class="text-sm text-gray-500">{{ task.deadline }}</div>
  235. </div>
  236. </div>
  237. </div>
  238. </div>
  239. <!-- 明日任务 -->
  240. <div>
  241. <h3 class="mb-3 text-lg font-semibold">明日</h3>
  242. <div
  243. class="grid grid-cols-4 gap-4 sm:grid-cols-4 md:grid-cols-4 lg:grid-cols-5 xl:grid-cols-6"
  244. >
  245. <div
  246. v-for="task in tomorrowTasks"
  247. :key="task.id"
  248. class="hover:border-primary flex cursor-pointer items-center rounded-lg border border-gray-200 bg-white p-4 shadow-sm transition-all hover:shadow-md"
  249. @click="handleTaskClick(task.id)"
  250. >
  251. <div
  252. class="mr-4 flex h-10 w-10 items-center justify-center rounded-full"
  253. :style="{ backgroundColor: `${task.color}20`, color: task.color }"
  254. >
  255. <span class="text-xl">{{ getIconEmoji(task.icon) }}</span>
  256. </div>
  257. <div class="min-w-0 flex-1">
  258. <div
  259. class="overflow-hidden text-ellipsis whitespace-nowrap font-medium"
  260. >
  261. {{ task.title }}
  262. </div>
  263. <div class="text-sm text-gray-500">{{ task.deadline }}</div>
  264. </div>
  265. </div>
  266. </div>
  267. </div>
  268. </template>