تخطَّ إلى المحتوى

نظرة عامة على البنية

يوفر هذا المستند وصفًا تقنيًا مفصلاً لحل Flexible Team Share، بما في ذلك بنية النظام، تدفق البيانات، وطبقات المعالجة.

flowchart TB
    subgraph UI["UI LAYER"]
        direction LR
        LWC1["objectTeamMember<br/>Team member list & management"]
        LWC2["objectTeamMemberWizard<br/>Admin configuration"]
        LWC3["ftsLabels<br/>Custom labels utility"]
    end

    subgraph CTRL["CONTROLLER LAYER"]
        direction LR
        C1["ObjectTeamMemberController<br/>CRUD operations for team members"]
        C2["TeamMemberWizardController<br/>Configuration wizard operations"]
    end

    subgraph DATA["DATA LAYER"]
        direction LR
        D1["ObjectTeamMember__c<br/>Team member assignments"]
        D2["Team_Sharing_Config__c<br/>Per-object sharing config"]
        D3["FlexiTeamShare_Config__mdt<br/>App configuration"]
        D4["Triggers:<br/>ObjectTeamMemberTrigger"]
    end

    subgraph ASYNC["ASYNC PROCESSING LAYER"]
        direction LR
        A1["ShareRecordQueueable<br/>Create/update/delete shares"]
        A2["SharingRecalculationBatch<br/>Bulk recalculation"]
        A3["ExpiredTeamMemberCleanupBatch<br/>Daily cleanup of expired members"]
    end

    subgraph SHARE["SALESFORCE SHARING MODEL"]
        direction LR
        S1["Standard Share Objects<br/>AccountShare, ContactShare,<br/>CaseShare, LeadShare,<br/>OpportunityShare, etc."]
        S2["Custom Object Shares<br/>[CustomObject]__Share"]
        S3["ObjectTeamMember__Share<br/>Team member visibility"]
    end

    UI --> CTRL
    CTRL --> DATA
    DATA --> ASYNC
    ASYNC --> SHARE

ثلاثة Lightning Web Components:

المكونالغرض
objectTeamMemberيعرض أعضاء الفريق على صفحات السجلات. يدعم الإضافة/التحرير/الحذف، قائمة قابلة للطي، وحد عرض قابل للتكوين.
objectTeamMemberWizardواجهة المسؤول لتكوين الكائنات، إدارة الإعدادات، وجدولة المهام.
ftsLabelsمكون أداة يوفر Custom Labels لدعم i18n (35 لغة).
وحدة التحكمالطرق
ObjectTeamMemberControllergetTeamMembers()، addTeamMember()، updateTeamMember()، removeTeamMember()، isCurrentUserManager()، isSharingConfigured()، getAccessLevelOptions()
TeamMemberWizardControllergetExistingConfigs()، getAvailableObjects()، createConfig()، toggleConfigStatus()، deleteConfig()، getScheduledJobInfo()، scheduleCleanupJob()
SyncOwnerInvocablesyncOwners() — Invocable Action لمزامنة عضو فريق Owner عند تغيير المالك الأصلي. قابل للاستدعاء من Flow أو Apex، مجمّع بالكامل.

كائنات مخصصة و trigger يعمل عند تغيير أعضاء الفريق:

  • ObjectTeamMember__c — يخزن تعيينات أعضاء الفريق
  • Team_Sharing_Config__c — تكوين المشاركة لكل كائن
  • FlexiTeamShare_Config__mdt — تكوين على مستوى التطبيق (Custom Metadata)
  • ObjectTeamMemberTriggerObjectTeamMemberTriggerHandler — يعالج Before Insert، Before Update، Before Delete

طبقة المعالجة غير المتزامنة

Section titled “طبقة المعالجة غير المتزامنة”
المكونالنوعالغرض
ShareRecordQueueableQueueableينشئ ويحدث ويحذف سجلات المشاركة للكائنات الأصلية وأعضاء الفريق
SharingRecalculationBatchBatchableإعادة حساب جميع المشاركات بشكل جماعي عند تغيير التكوين
ExpiredTeamMemberCleanupBatchBatchableيحذف أعضاء الفريق منتهي الصلاحية (مهمة مجدولة يوميًا)
ExpiredTeamMemberCleanupSchedulerSchedulableيجدول batch التنظيف (يعمل في الساعة 2:00 صباحًا يوميًا)

تدفق البيانات: إضافة عضو فريق

Section titled “تدفق البيانات: إضافة عضو فريق”
sequenceDiagram
    actor User
    participant LWC as objectTeamMember LWC
    participant Ctrl as ObjectTeamMemberController
    participant DB as Database
    participant Queue as ShareRecordQueueable

    User->>LWC: Click "Add Team Member"
    LWC->>LWC: Collect input (User, Access Level, Role, End Date)
    LWC->>Ctrl: addTeamMember(recordId, userId, accessLevel, role, endDate)

    Ctrl->>Ctrl: Check for duplicates
    Ctrl->>Ctrl: Verify CRUD permissions

    Ctrl->>DB: INSERT ObjectTeamMember__c
    DB-->>Ctrl: Success

    Note over Ctrl,Queue: Trigger fires after insert
    Ctrl->>Queue: System.enqueueJob()

    Ctrl-->>LWC: Return success
    LWC-->>User: Refresh team member list

    Note over Queue: Async processing
    Queue->>DB: INSERT [Object]Share
    Queue->>DB: INSERT ObjectTeamMember__Share

تدفق البيانات: مزامنة تغيير المالك

Section titled “تدفق البيانات: مزامنة تغيير المالك”
sequenceDiagram
    actor Admin
    participant Flow as Record-Triggered Flow
    participant Inv as SyncOwnerInvocable
    participant DB as Database
    participant Queue as ShareRecordQueueable

    Note over Admin: Changes record owner

    Admin->>DB: UPDATE Account SET OwnerId = :newOwner
    DB-->>Flow: Trigger: OwnerId changed

    Flow->>Inv: syncOwners([recordId])

    Inv->>DB: SELECT FROM ObjectTeamMember__c WHERE Role__c = 'Owner'
    DB-->>Inv: Owner team member

    Inv->>DB: SELECT OwnerId FROM Account
    DB-->>Inv: New owner ID

    alt Owner changed
        Inv->>DB: UPDATE ObjectTeamMember__c SET User_Id__c = :newOwner
        DB-->>Inv: Success

        Inv->>Queue: System.enqueueJob()

        Note over Queue: Async processing
        Queue->>DB: DELETE old AccountShare (if not member)
        Queue->>DB: INSERT new AccountShare
    else Owner unchanged
        Inv-->>Flow: success=true, "Owner unchanged"
    end

    Inv-->>Flow: SyncOwnerResult

تدفق البيانات: تنظيف الأعضاء منتهي الصلاحية

Section titled “تدفق البيانات: تنظيف الأعضاء منتهي الصلاحية”
flowchart TB
    A["Salesforce Scheduler<br/>(2:00 AM daily)"] --> B["ExpiredTeamMemberCleanupScheduler"]
    B --> C["ExpiredTeamMemberCleanupBatch"]
    C --> D["Query:<br/>SELECT FROM ObjectTeamMember__c<br/>WHERE End_Date__c < TODAY()"]
    D --> E["DELETE expired records<br/>(triggers remove shares)"]
  • جميع الطرق العامة ملفوفة في try-catch
  • رسائل خطأ سهلة الاستخدام عبر Custom Labels
  • AuraHandledException لعرض الأخطاء في LWC

المعالجة غير المتزامنة

Section titled “المعالجة غير المتزامنة”
  • Database.insert/update/delete(records, false) — نجاح جزئي
  • يتم تسجيل الأخطاء الفردية، ولا تفشل الدفعة بأكملها
  • يتم تتبع إحصائيات الأخطاء في مهام batch
  • نمط معالج trigger يمنع التكرار
  • تظهر الأخطاء للمستدعي لعملية DML

المعالجة غير المتزامنة

Section titled “المعالجة غير المتزامنة”
  • تستخدم عمليات سجل المشاركة Queueable (غير محظورة)
  • تستخدم العمليات الجماعية Batchable مع حجم batch قابل للتكوين
  • لا توجد DML متزامنة على سجلات المشاركة في triggers
  • يتم استخدام الحقول المفهرسة في جمل WHERE
  • تنسيق Record_Id__c يمكّن استعلامات LIKE فعالة
  • مجموعات نتائج محدودة مع جمل LIMIT
  • @AuraEnabled(cacheable=true) لعمليات القراءة
  • يتم تخزين تكوين التطبيق مؤقتًا في المعاملة

لا توجد تكاملات خارجية — هذه الحزمة تعمل بالكامل داخل Salesforce:

  • لا توجد استدعاءات HTTP
  • لا توجد واجهات برمجة تطبيقات خارجية
  • لا توجد Named Credentials
  • لا توجد External Objects
  • لا توجد Connected Apps
المكونالاستخدام
Apex Sharingينشئ/يدير سجلات المشاركة
Queueable Apexعمليات سجل المشاركة غير المتزامنة
Batchable Apexإعادة حساب المشاركة الجماعية، التنظيف
Schedulable Apexمهمة التنظيف اليومية
Custom Metadataتكوين التطبيق
Lightning Web Componentsواجهة المستخدم
Custom Labelsالترجمة الدولية