| 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 [];    }  }}
 |