暫無描述
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

menu.service.ts 3.6KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485868788899091929394
  1. import { Injectable, inject } from '@angular/core';
  2. import { HttpClient } from '@angular/common/http';
  3. import { Observable, map, BehaviorSubject } from 'rxjs';
  4. import { MenuItem, MenuResponse, SessionIdsResponse, SessionMenuMappingResponse } from '../models/menu.model';
  5. import { AuthService } from './auth.service';
  6. @Injectable({
  7. providedIn: 'root'
  8. })
  9. export class MenuService {
  10. private http = inject(HttpClient);
  11. private authService = inject(AuthService);
  12. private topMenuSubject = new BehaviorSubject<MenuItem[]>([]);
  13. topMenu$ = this.topMenuSubject.asObservable();
  14. // 获取顶部菜单
  15. getTopMenu(): Observable<MenuItem[]> {
  16. console.log('getTopMenu: 发送请求到 /api/menu/top');
  17. return this.http.get<MenuResponse>('/api/menu/top').pipe(
  18. map(response => {
  19. console.log('getTopMenu响应:', response);
  20. if (response.success && response.data) {
  21. console.log('获取到菜单项数据:', response.data);
  22. console.log('菜单项数量:', response.data.length);
  23. if (response.data.length > 0) {
  24. console.log('第一个菜单项结构:', response.data[0]);
  25. console.log('第一个菜单项ID值:', response.data[0].id);
  26. console.log('第一个菜单项ID类型:', typeof response.data[0].id);
  27. }
  28. this.topMenuSubject.next(response.data);
  29. return response.data;
  30. } else {
  31. console.error('获取菜单失败:', response.message || response.error);
  32. throw new Error(response.message || response.error || '获取菜单失败');
  33. }
  34. })
  35. );
  36. }
  37. // 获取菜单项的所有会话ID
  38. getSessionIdsByMenuItem(menuItemId: string): Observable<string[]> {
  39. console.log('getSessionIdsByMenuItem被调用,参数menuItemId:', menuItemId);
  40. console.log('参数类型:', typeof menuItemId);
  41. console.log('参数是否为空:', !menuItemId);
  42. console.log('参数去除空格后是否为空:', menuItemId ? menuItemId.trim() === '' : 'N/A');
  43. // 验证参数
  44. if (!menuItemId || menuItemId.trim() === '') {
  45. console.error('参数 menu_item_id 不能为空,当前值:', menuItemId);
  46. throw new Error(`参数 menu_item_id 不能为空`);
  47. }
  48. console.log(`发送请求到 /api/menu/sessions/${menuItemId}`);
  49. return this.http.get<SessionIdsResponse>(`/api/menu/sessions/${menuItemId}`).pipe(
  50. map(response => {
  51. console.log('getSessionIdsByMenuItem响应:', response);
  52. if (response.success) {
  53. const data = response.data || [];
  54. console.log('返回会话ID列表:', data);
  55. return data;
  56. } else {
  57. console.error('获取会话ID列表失败:', response.message || response.error);
  58. throw new Error(response.message || response.error || '获取会话ID列表失败');
  59. }
  60. })
  61. );
  62. }
  63. // 获取会话的菜单项ID
  64. getMenuItemBySessionId(sessionId: string): Observable<string> {
  65. return this.http.get<SessionMenuMappingResponse>('/api/session/menu', {
  66. params: { session_id: sessionId }
  67. }).pipe(
  68. map(response => {
  69. if (response.success && response.data !== undefined) {
  70. return response.data;
  71. } else {
  72. throw new Error(response.message || response.error || '获取会话菜单项失败');
  73. }
  74. })
  75. );
  76. }
  77. // 获取所有菜单项(缓存)
  78. getCachedTopMenu(): MenuItem[] {
  79. return this.topMenuSubject.value;
  80. }
  81. // 根据ID获取菜单项
  82. getMenuItemById(id: string): MenuItem | undefined {
  83. return this.topMenuSubject.value.find(item => item.id === id);
  84. }
  85. }