device-management.html 12 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314
  1. <div class="device-management-container">
  2. <!-- 顶部导航 -->
  3. <header class="header">
  4. <div class="header-content">
  5. <div class="logo">
  6. <span class="logo-icon">♻️</span>
  7. <span>智回回收</span>
  8. </div>
  9. <div class="user-info">
  10. <span>企业管理员</span>
  11. <div class="avatar">
  12. <span>管</span>
  13. </div>
  14. </div>
  15. </div>
  16. </header>
  17. <!-- 主要内容 -->
  18. <main class="content">
  19. <div class="container">
  20. <section id="device-management">
  21. <h2 class="section-title">设备管理</h2>
  22. <!-- 设备总览状态卡片 -->
  23. <div class="stats-cards">
  24. <div class="stat-card">
  25. <div class="stat-icon" style="background: linear-gradient(135deg, #2ecc71, #27ae60);">
  26. <i class="fas fa-cogs"></i>
  27. </div>
  28. <div class="stat-info">
  29. <div class="stat-value">{{ deviceStats.total }}</div>
  30. <div class="stat-label">设备总数</div>
  31. </div>
  32. </div>
  33. <div class="stat-card">
  34. <div class="stat-icon" style="background: linear-gradient(135deg, #3498db, #2980b9);">
  35. <i class="fas fa-play-circle"></i>
  36. </div>
  37. <div class="stat-info">
  38. <div class="stat-value">{{ deviceStats.online }}</div>
  39. <div class="stat-label">运行中</div>
  40. </div>
  41. </div>
  42. <div class="stat-card">
  43. <div class="stat-icon" style="background: linear-gradient(135deg, #f39c12, #e67e22);">
  44. <i class="fas fa-exclamation-triangle"></i>
  45. </div>
  46. <div class="stat-info">
  47. <div class="stat-value">{{ deviceStats.warning }}</div>
  48. <div class="stat-label">预警</div>
  49. </div>
  50. </div>
  51. <div class="stat-card">
  52. <div class="stat-icon" style="background: linear-gradient(135deg, #95a5a6, #7f8c8d);">
  53. <i class="fas fa-wrench"></i>
  54. </div>
  55. <div class="stat-info">
  56. <div class="stat-value">{{ deviceStats.maintenance }}</div>
  57. <div class="stat-label">维护中</div>
  58. </div>
  59. </div>
  60. </div>
  61. <!-- 搜索和筛选栏 -->
  62. <div class="filter-search-bar">
  63. <div class="search-box">
  64. <input
  65. type="text"
  66. class="search-input"
  67. placeholder="搜索设备名称、编号、位置..."
  68. [(ngModel)]="searchQuery">
  69. <i class="fas fa-search search-icon"></i>
  70. </div>
  71. <div class="filter-dropdown">
  72. <select class="filter-select" [(ngModel)]="filterStatus">
  73. <option value="all">全部状态</option>
  74. <option value="online">运行中</option>
  75. <option value="offline">离线</option>
  76. <option value="maintenance">维护中</option>
  77. <option value="warning">预警</option>
  78. </select>
  79. </div>
  80. </div>
  81. <!-- 设备列表 -->
  82. <div class="device-list">
  83. <div
  84. *ngFor="let device of filteredDevices"
  85. class="device-item"
  86. (click)="openDeviceDetail(device)">
  87. <div class="device-header">
  88. <div class="device-info-main">
  89. <div class="device-name">{{ device.name }}</div>
  90. <div class="device-meta">
  91. <span class="device-id">{{ device.id }}</span>
  92. <span class="device-type">{{ device.type }}</span>
  93. </div>
  94. </div>
  95. <div class="device-status" [ngClass]="getStatusClass(device.status)">
  96. {{ getStatusText(device.status) }}
  97. </div>
  98. </div>
  99. <div class="device-body">
  100. <div class="device-stats-row">
  101. <div class="device-stat">
  102. <i class="fas fa-clock"></i>
  103. <span>{{ device.runningTime }}h</span>
  104. </div>
  105. <div class="device-stat">
  106. <i class="fas fa-box"></i>
  107. <span>{{ device.processedVolume }}kg</span>
  108. </div>
  109. <div class="device-stat">
  110. <i class="fas fa-map-marker-alt"></i>
  111. <span>{{ device.location }}</span>
  112. </div>
  113. <div class="device-stat">
  114. <i class="fas fa-chart-line"></i>
  115. <span>{{ device.efficiency }}%</span>
  116. </div>
  117. </div>
  118. </div>
  119. <div class="device-actions">
  120. <button class="action-btn btn-primary" (click)="openDeviceDetail(device)">
  121. <i class="fas fa-info-circle"></i> 详情
  122. </button>
  123. <button
  124. class="action-btn btn-secondary"
  125. (click)="startMaintenance(device, $event)"
  126. *ngIf="device.status === 'online' || device.status === 'warning'">
  127. <i class="fas fa-tools"></i> 维护
  128. </button>
  129. <button
  130. class="action-btn btn-warning"
  131. (click)="reportIssue(device, $event)">
  132. <i class="fas fa-bug"></i> 报修
  133. </button>
  134. <button
  135. class="action-btn btn-ar"
  136. (click)="viewARGuide(device, $event)"
  137. *ngIf="device.status !== 'offline'">
  138. <i class="fas fa-cube"></i> AR
  139. </button>
  140. </div>
  141. </div>
  142. <!-- 空状态 -->
  143. <div *ngIf="filteredDevices.length === 0" class="empty-state">
  144. <i class="fas fa-inbox"></i>
  145. <p>暂无设备</p>
  146. </div>
  147. </div>
  148. </section>
  149. </div>
  150. </main>
  151. <!-- 设备详情弹层 -->
  152. <div class="modal-overlay" [class.show]="showDetailModal" (click)="closeDeviceDetail()">
  153. <div class="modal-content" (click)="$event.stopPropagation()" *ngIf="selectedDevice">
  154. <div class="modal-header">
  155. <h3 class="modal-title">{{ selectedDevice.name }}</h3>
  156. <button class="close-btn" (click)="closeDeviceDetail()">&times;</button>
  157. </div>
  158. <div class="modal-body">
  159. <!-- 设备基本信息 -->
  160. <div class="detail-section">
  161. <h4 class="detail-title">设备信息</h4>
  162. <div class="detail-grid">
  163. <div class="detail-item">
  164. <span class="detail-label">设备编号</span>
  165. <span class="detail-value">{{ selectedDevice.id }}</span>
  166. </div>
  167. <div class="detail-item">
  168. <span class="detail-label">设备类型</span>
  169. <span class="detail-value">{{ selectedDevice.type }}</span>
  170. </div>
  171. <div class="detail-item">
  172. <span class="detail-label">所在位置</span>
  173. <span class="detail-value">{{ selectedDevice.location }}</span>
  174. </div>
  175. <div class="detail-item">
  176. <span class="detail-label">设备状态</span>
  177. <span class="detail-value" [ngClass]="getStatusClass(selectedDevice.status)">
  178. {{ getStatusText(selectedDevice.status) }}
  179. </span>
  180. </div>
  181. </div>
  182. </div>
  183. <!-- 实时运行参数监控 -->
  184. <div class="detail-section">
  185. <h4 class="detail-title">实时运行参数</h4>
  186. <div class="params-monitor">
  187. <div class="param-card">
  188. <div class="param-icon">🌡️</div>
  189. <div class="param-info">
  190. <div class="param-label">温度</div>
  191. <div class="param-value">{{ selectedDevice.temperature }}°C</div>
  192. </div>
  193. <div class="param-status" [class.normal]="selectedDevice.temperature! < 60" [class.warning]="selectedDevice.temperature! >= 60">
  194. {{ selectedDevice.temperature! < 60 ? '正常' : '偏高' }}
  195. </div>
  196. </div>
  197. <div class="param-card">
  198. <div class="param-icon">⚡</div>
  199. <div class="param-info">
  200. <div class="param-label">压力</div>
  201. <div class="param-value">{{ selectedDevice.pressure }} MPa</div>
  202. </div>
  203. <div class="param-status normal">正常</div>
  204. </div>
  205. <div class="param-card">
  206. <div class="param-icon">📊</div>
  207. <div class="param-info">
  208. <div class="param-label">效率</div>
  209. <div class="param-value">{{ selectedDevice.efficiency }}%</div>
  210. </div>
  211. <div class="param-status" [class.normal]="selectedDevice.efficiency >= 80" [class.warning]="selectedDevice.efficiency < 80">
  212. {{ selectedDevice.efficiency >= 80 ? '良好' : '待优化' }}
  213. </div>
  214. </div>
  215. </div>
  216. </div>
  217. <!-- 运行统计 -->
  218. <div class="detail-section">
  219. <h4 class="detail-title">运行统计</h4>
  220. <div class="detail-grid">
  221. <div class="detail-item">
  222. <span class="detail-label">运行时长</span>
  223. <span class="detail-value">{{ selectedDevice.runningTime }} 小时</span>
  224. </div>
  225. <div class="detail-item">
  226. <span class="detail-label">处理总量</span>
  227. <span class="detail-value">{{ selectedDevice.processedVolume }} kg</span>
  228. </div>
  229. </div>
  230. </div>
  231. <!-- 维护保养记录 -->
  232. <div class="detail-section">
  233. <h4 class="detail-title">维护保养</h4>
  234. <div class="detail-grid">
  235. <div class="detail-item">
  236. <span class="detail-label">上次维护</span>
  237. <span class="detail-value">{{ selectedDevice.lastMaintenance }}</span>
  238. </div>
  239. <div class="detail-item">
  240. <span class="detail-label">下次维护</span>
  241. <span class="detail-value">{{ selectedDevice.nextMaintenance }}</span>
  242. </div>
  243. </div>
  244. <div class="maintenance-history">
  245. <div class="history-item">
  246. <div class="history-date">2023-05-10</div>
  247. <div class="history-content">定期保养 - 更换滤芯</div>
  248. <div class="history-operator">张师傅</div>
  249. </div>
  250. <div class="history-item">
  251. <div class="history-date">2023-04-10</div>
  252. <div class="history-content">故障维修 - 电机异响</div>
  253. <div class="history-operator">李师傅</div>
  254. </div>
  255. </div>
  256. </div>
  257. <!-- AR参数调节指引 -->
  258. <div class="detail-section">
  259. <h4 class="detail-title">AR参数调节</h4>
  260. <div class="ar-guide-card" (click)="viewARGuide(selectedDevice)">
  261. <i class="fas fa-cube"></i>
  262. <span>启动AR调节指引</span>
  263. <i class="fas fa-chevron-right"></i>
  264. </div>
  265. </div>
  266. <!-- 报修申请 -->
  267. <div class="detail-section">
  268. <h4 class="detail-title">报修申请</h4>
  269. <button class="report-btn" (click)="reportIssue(selectedDevice)">
  270. <i class="fas fa-wrench"></i>
  271. 提交报修申请
  272. </button>
  273. </div>
  274. </div>
  275. </div>
  276. </div>
  277. <!-- 底部导航 -->
  278. <nav class="bottom-nav">
  279. <div class="nav-item" routerLink="/business/dashboard">
  280. <div class="nav-icon">🏠</div>
  281. <div>工作台</div>
  282. </div>
  283. <div class="nav-item" routerLink="/business/order-management">
  284. <div class="nav-icon">📦</div>
  285. <div>订单</div>
  286. </div>
  287. <div class="nav-item active">
  288. <div class="nav-icon">⚙️</div>
  289. <div>设备</div>
  290. </div>
  291. <div class="nav-item" routerLink="/business/data-reports">
  292. <div class="nav-icon">📊</div>
  293. <div>报表</div>
  294. </div>
  295. <div class="nav-item" routerLink="/business/enterprise-center">
  296. <div class="nav-icon">👤</div>
  297. <div>我的</div>
  298. </div>
  299. </nav>
  300. </div>