| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190 | 
							- import { Injectable } from '@angular/core';
 
- import { FmodeParse, FmodeObject } from 'fmode-ng/parse';
 
- const Parse = FmodeParse.with('nova');
 
- /**
 
-  * 全局 Profile 服务
 
-  *
 
-  * 用途:
 
-  * 1. 统一管理当前登录用户的 Profile 信息
 
-  * 2. 支持从 localStorage 缓存读取
 
-  * 3. 支持企微授权自动同步
 
-  * 4. 提供全局单例访问
 
-  */
 
- @Injectable({
 
-   providedIn: 'root'
 
- })
 
- export class ProfileService {
 
-   private currentProfile: FmodeObject | null = null;
 
-   private profileCache: Map<string, FmodeObject> = new Map();
 
-   constructor() {}
 
-   /**
 
-    * 获取当前 Profile
 
-    *
 
-    * 逻辑优先级:
 
-    * 1. 内存缓存
 
-    * 2. localStorage 的 "Parse/ProfileId"
 
-    * 3. 企微授权同步
 
-    *
 
-    * @param cid 公司ID,用于企微授权(可选)
 
-    * @param forceRefresh 强制刷新,默认 false
 
-    * @returns Profile 对象或 null
 
-    */
 
-   async getCurrentProfile(cid?: string, forceRefresh = false): Promise<FmodeObject | null> {
 
-     try {
 
-       // 1. 检查内存缓存
 
-       if (!forceRefresh && this.currentProfile) {
 
-         return this.currentProfile;
 
-       }
 
-       // 2. 尝试从 localStorage 加载
 
-       const profileId = localStorage.getItem('Parse/ProfileId');
 
-       if (profileId) {
 
-         // 检查缓存
 
-         if (!forceRefresh && this.profileCache.has(profileId)) {
 
-           this.currentProfile = this.profileCache.get(profileId)!;
 
-           return this.currentProfile;
 
-         }
 
-         // 从数据库加载
 
-         try {
 
-           const query = new Parse.Query('Profile');
 
-           this.currentProfile = await query.get(profileId);
 
-           this.profileCache.set(profileId, this.currentProfile);
 
-           return this.currentProfile;
 
-         } catch (err) {
 
-           console.warn('Failed to load Profile from localStorage:', err);
 
-           // 清除无效的 profileId
 
-           localStorage.removeItem('Parse/ProfileId');
 
-         }
 
-       }
 
-       // 3. 如果提供了 cid,尝试通过企微授权获取
 
-       if (cid) {
 
-         const profile = await this.syncFromWxwork(cid);
 
-         if (profile) {
 
-           this.currentProfile = profile;
 
-           // 缓存到 localStorage
 
-           profile?.id&&localStorage.setItem('Parse/ProfileId', profile.id);
 
-           profile?.id&&this.profileCache.set(profile.id, profile);
 
-           return profile;
 
-         }
 
-       }
 
-       return null;
 
-     } catch (error) {
 
-       console.error('Failed to get current profile:', error);
 
-       return null;
 
-     }
 
-   }
 
-   /**
 
-    * 通过企微授权同步 Profile
 
-    *
 
-    * @param cid 公司ID
 
-    * @returns Profile 对象或 null
 
-    */
 
-   private async syncFromWxwork(cid: string): Promise<FmodeObject | null> {
 
-     try {
 
-       // 动态导入 WxworkAuth
 
-       const { WxworkAuth } = await import('fmode-ng/core');
 
-       const wxAuth = new WxworkAuth({ cid, appId: 'crm' });
 
-       // 获取用户信息并同步
 
-       const { profile } = await wxAuth.authenticateAndLogin();
 
-       return profile;
 
-     } catch (error) {
 
-       console.error('Failed to sync profile from Wxwork:', error);
 
-       return null;
 
-     }
 
-   }
 
-   /**
 
-    * 根据 profileId 获取 Profile
 
-    *
 
-    * @param profileId Profile ID
 
-    * @param useCache 是否使用缓存,默认 true
 
-    * @returns Profile 对象或 null
 
-    */
 
-   async getProfileById(profileId: string, useCache = true): Promise<FmodeObject | null> {
 
-     try {
 
-       // 检查缓存
 
-       if (useCache && this.profileCache.has(profileId)) {
 
-         return this.profileCache.get(profileId)!;
 
-       }
 
-       // 从数据库加载
 
-       const query = new Parse.Query('Profile');
 
-       const profile = await query.get(profileId);
 
-       // 更新缓存
 
-       this.profileCache.set(profileId, profile);
 
-       return profile;
 
-     } catch (error) {
 
-       console.error('Failed to get profile by id:', error);
 
-       return null;
 
-     }
 
-   }
 
-   /**
 
-    * 设置当前 Profile
 
-    *
 
-    * @param profile Profile 对象
 
-    */
 
-   setCurrentProfile(profile: FmodeObject): void {
 
-     this.currentProfile = profile;
 
-     if(profile?.id){
 
-       this.profileCache.set(profile.id, profile);
 
-       localStorage.setItem('Parse/ProfileId', profile.id);
 
-     }
 
-   }
 
-   /**
 
-    * 清除当前 Profile 缓存
 
-    */
 
-   clearCurrentProfile(): void {
 
-     this.currentProfile = null;
 
-     localStorage.removeItem('Parse/ProfileId');
 
-   }
 
-   /**
 
-    * 清除所有缓存
 
-    */
 
-   clearCache(): void {
 
-     this.currentProfile = null;
 
-     this.profileCache.clear();
 
-     localStorage.removeItem('Parse/ProfileId');
 
-   }
 
-   /**
 
-    * 获取公司所有员工
 
-    *
 
-    * @param companyId 公司ID
 
-    * @param roleName 角色名称(可选)
 
-    * @returns Profile 列表
 
-    */
 
-   async getCompanyProfiles(companyId: string, roleName?: string): Promise<FmodeObject[]> {
 
-     try {
 
-       const query = new Parse.Query('Profile');
 
-       query.equalTo('company', companyId);
 
-       query.notEqualTo('isDeleted', true);
 
-       if (roleName) {
 
-         query.equalTo('roleName', roleName);
 
-       }
 
-       query.ascending('name');
 
-       query.limit(1000);
 
-       return await query.find();
 
-     } catch (error) {
 
-       console.error('Failed to get company profiles:', error);
 
-       return [];
 
-     }
 
-   }
 
- }
 
 
  |