ソースを参照

Merge branch 'master' of http://git.fmode.cn:3000/nkkj/yss-project

Future 1 日 前
コミット
707499a2ab
2 ファイル変更1883 行追加0 行削除
  1. 851 0
      docs/prd/组件-客户选择.md
  2. 1032 0
      docs/prd/项目-日志人效分析.md

+ 851 - 0
docs/prd/组件-客户选择.md

@@ -0,0 +1,851 @@
+# 项目客户选择组件产品设计
+
+## 概述
+
+**组件名称**: `app-customer-selector`
+**功能定位**: 基于企微群聊成员的项目客户选择组件
+**应用场景**: 项目管理中为项目指定客户的场景,支持从群聊成员中选择外部用户并自动创建或关联ContactInfo
+
+## 数据结构分析
+
+### 1. GroupChat.member_list 数据结构
+
+根据企微群聊管理规范,`member_list` 字段包含群成员信息:
+
+```typescript
+interface GroupMember {
+  userid: string;           // 用户ID(企业员工)或 external_userid(外部用户)
+  type: number;            // 用户类型:1=企业员工 2=外部用户
+  join_time: number;       // 加入时间(时间戳)
+  join_scene: number;      // 加入场景
+  invitor?: {              // 邀请人信息
+    userid: string;
+  };
+}
+```
+
+### 2. ContactInfo 表结构
+
+```typescript
+interface ContactInfo {
+  objectId: string;
+  name: string;                    // 客户姓名
+  mobile?: string;                 // 手机号
+  company: Pointer<Company>;     // 所属企业
+  external_userid?: string;        // 企微外部联系人ID
+  source?: string;                 // 来源渠道
+  data?: Object;                   // 扩展数据
+  isDeleted: Boolean;
+  createdAt: Date;
+  updatedAt: Date;
+}
+```
+
+### 3. Project 表关联
+
+```typescript
+interface Project {
+  objectId: string;
+  title: string;
+  company: Pointer<Company>;
+  customer?: Pointer<ContactInfo>;  // 项目客户(可选)
+  assignee?: Pointer<Profile>;      // 负责设计师
+  // ... 其他字段
+}
+```
+
+## 组件接口设计
+
+### 输入属性(@Input)
+
+```typescript
+interface CustomerSelectorInputs {
+  // 必填属性
+  project: Parse.Object;           // 项目对象
+  groupChat: Parse.Object;         // 企微群聊对象
+
+  // 可选属性
+  placeholder?: string;           // 选择框占位文本,默认"请选择项目客户"
+  disabled?: boolean;             // 是否禁用选择,默认false
+  showCreateButton?: boolean;     // 是否显示创建新客户按钮,默认true
+  filterCriteria?: {              // 过滤条件
+    joinTimeAfter?: Date;         // 加入时间筛选
+    joinScenes?: number[];        // 加入场景筛选
+    excludeUserIds?: string[];    // 排除的用户ID列表
+  };
+  company?: Parse.Object;        // 企业对象(可选,用于权限验证)
+}
+```
+
+### 输出事件(@Output)
+
+```typescript
+interface CustomerSelectorOutputs {
+  // 客户选择事件
+  customerSelected: EventEmitter<{
+    customer: Parse.Object;       // 选中的客户对象
+    isNewCustomer: boolean;        // 是否为新创建的客户
+    action: 'selected' | 'created' | 'updated'; // 操作类型
+  }>;
+
+  // 加载状态事件
+  loadingChange: EventEmitter<boolean>;
+
+  // 错误事件
+  error: EventEmitter<{
+    type: 'load_failed' | 'create_failed' | 'permission_denied';
+    message: string;
+    details?: any;
+  }>;
+}
+```
+
+## 组件功能设计
+
+### 1. 核心功能流程
+
+#### 1.1 初始化流程
+```mermaid
+graph TD
+    A[组件初始化] --> B[检查项目客户状态]
+    B --> C{项目已有客户?}
+    C -->|是| D[显示当前客户信息]
+    C -->|否| E[加载群聊成员列表]
+    E --> F[过滤外部用户 type=2]
+    F --> G[显示客户选择界面]
+    G --> H[等待用户选择/创建]
+```
+
+#### 1.2 客户选择流程
+```mermaid
+graph TD
+    A[用户选择外部用户] --> B[查询ContactInfo表]
+    B --> C{客户记录存在?}
+    C -->|是| D[关联现有客户]
+    C -->|否| E[创建新客户]
+    E --> F[设置项目客户]
+    D --> F
+    F --> G[触发customerSelected事件]
+    G --> H[更新UI状态]
+```
+
+### 2. 组件状态管理
+
+```typescript
+enum ComponentState {
+  LOADING = 'loading',           // 加载中
+  CUSTOMER_EXISTS = 'exists',    // 项目已有客户
+  SELECTING = 'selecting',       // 选择客户中
+  CREATING = 'creating',         // 创建客户中
+  ERROR = 'error'               // 错误状态
+}
+
+interface ComponentData {
+  project: Parse.Object;
+  groupChat: Parse.Object;
+  currentCustomer?: Parse.Object;
+  availableCustomers: Parse.Object[];
+  loading: boolean;
+  state: ComponentState;
+  error?: ErrorInfo;
+}
+```
+
+## 用户界面设计
+
+### 1. 视觉状态
+
+#### 1.1 项目已有客户状态
+```html
+<div class="customer-selector has-customer">
+  <div class="current-customer">
+    <ion-avatar>
+      <img [src]="currentCustomerAvatar" />
+    </ion-avatar>
+    <div class="customer-info">
+      <h3>{{ currentCustomer.name }}</h3>
+      <p>{{ currentCustomer.mobile }}</p>
+    </div>
+    <ion-button (click)="changeCustomer()" fill="outline" size="small">
+      更换客户
+    </ion-button>
+  </div>
+</div>
+```
+
+#### 1.2 选择客户状态
+```html
+<div class="customer-selector selecting">
+  <ion-searchbar
+    [(ngModel)]="searchKeyword"
+    placeholder="搜索客户姓名或手机号"
+    (ionInput)="onSearchChange($event)">
+  </ion-searchbar>
+
+  <div class="customer-list">
+    <ion-item
+      *ngFor="let customer of filteredCustomers"
+      (click)="selectCustomer(customer)">
+      <ion-avatar slot="start">
+        <img [src]="customerAvatar(customer)" />
+      </ion-avatar>
+      <ion-label>
+        <h2>{{ customer.name }}</h2>
+        <p>{{ customer.mobile || '未绑定手机' }}</p>
+      </ion-label>
+      <ion-icon name="checkmark" slot="end" *ngIf="isSelected(customer)"></ion-icon>
+    </ion-item>
+  </div>
+
+  <ion-button (click)="createNewCustomer()" expand="block" fill="outline">
+    <ion-icon name="person-add" slot="start"></ion-icon>
+    创建新客户
+  </ion-button>
+</div>
+```
+
+#### 1.3 加载状态
+```html
+<div class="customer-selector loading">
+  <ion-spinner name="dots"></ion-spinner>
+  <p>{{ loadingText }}</p>
+</div>
+```
+
+### 2. 交互设计
+
+#### 2.1 客户卡片展示
+- **头像**: 显示客户头像,无头像时显示默认图标
+- **姓名**: 客户姓名,加粗显示
+- **手机号**: 客户手机号,灰色小字
+- **操作按钮**: 更换客户、查看详情等
+
+#### 2.2 客户列表交互
+- **搜索功能**: 支持按姓名、手机号搜索
+- **单选模式**: 一次只能选择一个客户
+- **选中状态**: 选中项显示对勾图标
+- **悬停效果**: 鼠标悬停时背景色变化
+
+#### 2.3 创建新客户
+- **弹窗表单**: 包含姓名、手机号等必填字段
+- **验证规则**: 手机号格式验证、姓名长度限制
+- **自动关联**: 创建后自动关联到项目
+
+## 技术实现方案
+
+### 1. 组件代码结构
+
+```typescript
+@Component({
+  selector: 'app-customer-selector',
+  standalone: true,
+  imports: [
+    CommonModule,
+    FormsModule,
+    IonicModule,
+    // 其他依赖
+  ],
+  template: './customer-selector.component.html',
+  styleUrls: ['./customer-selector.component.scss']
+})
+export class CustomerSelectorComponent implements OnInit, OnChanges {
+  // 输入输出属性
+  @Input() project!: Parse.Object;
+  @Input() groupChat!: Parse.Object;
+  @Input() placeholder: string = '请选择项目客户';
+  @Input() disabled: boolean = false;
+  @Input() showCreateButton: boolean = true;
+
+  @Output() customerSelected = new EventEmitter<CustomerSelectedEvent>();
+  @Output() loadingChange = new EventEmitter<boolean>();
+  @Output() error = new EventEmitter<ErrorEvent>();
+
+  // 组件状态
+  state: ComponentState = ComponentState.LOADING;
+  currentCustomer?: Parse.Object;
+  availableCustomers: Parse.Object[] = [];
+  searchKeyword: string = '';
+
+  constructor(
+    private parseService: ParseService,
+    private wxworkService: WxworkService,
+    private modalController: ModalController
+  ) {}
+
+  ngOnInit() {
+    this.initializeComponent();
+  }
+
+  ngOnChanges(changes: SimpleChanges) {
+    if (changes.project || changes.groupChat) {
+      this.initializeComponent();
+    }
+  }
+
+  private async initializeComponent() {
+    this.state = ComponentState.LOADING;
+    this.loadingChange.emit(true);
+
+    try {
+      // 1. 检查项目是否已有客户
+      await this.checkProjectCustomer();
+
+      if (this.currentCustomer) {
+        this.state = ComponentState.CUSTOMER_EXISTS;
+      } else {
+        // 2. 加载可选客户列表
+        await this.loadAvailableCustomers();
+        this.state = ComponentState.SELECTING;
+      }
+    } catch (error) {
+      this.handleError(error);
+    } finally {
+      this.loadingChange.emit(false);
+    }
+  }
+
+  private async checkProjectCustomer(): Promise<void> {
+    const customer = this.project.get('customer');
+    if (customer) {
+      this.currentCustomer = await this.parseService.fetchFullObject(customer);
+    }
+  }
+
+  private async loadAvailableCustomers(): Promise<void> {
+    const memberList = this.groupChat.get('member_list') || [];
+    const company = this.project.get('company');
+
+    // 过滤外部用户(type=2)
+    const externalMembers = memberList.filter((member: any) => member.type === 2);
+
+    // 查询对应的ContactInfo记录
+    const externalUserIds = externalMembers.map((member: any) => member.userid);
+
+    if (externalUserIds.length === 0) {
+      this.availableCustomers = [];
+      return;
+    }
+
+    const ContactInfo = Parse.Object.extend('ContactInfo');
+    const query = new Parse.Query(ContactInfo);
+    query.containedIn('external_userid', externalUserIds);
+    query.equalTo('company', company);
+    query.notEqualTo('isDeleted', true);
+    query.ascending('name');
+
+    this.availableCustomers = await query.find();
+  }
+
+  async selectCustomer(customer: Parse.Object): Promise<void> {
+    this.state = ComponentState.LOADING;
+    this.loadingChange.emit(true);
+
+    try {
+      // 关联客户到项目
+      this.project.set('customer', customer);
+      await this.project.save();
+
+      this.currentCustomer = customer;
+      this.state = ComponentState.CUSTOMER_EXISTS;
+
+      this.customerSelected.emit({
+        customer,
+        isNewCustomer: false,
+        action: 'selected'
+      });
+    } catch (error) {
+      this.handleError(error);
+    } finally {
+      this.loadingChange.emit(false);
+    }
+  }
+
+  async createNewCustomer(): Promise<void> {
+    // 弹出创建客户模态框
+    const modal = await this.modalController.create({
+      component: CreateCustomerModalComponent,
+      componentProps: {
+        company: this.project.get('company'),
+        project: this.project
+      }
+    });
+
+    modal.onDidDismiss().then(async (result) => {
+      if (result.data?.customer) {
+        await this.handleCustomerCreated(result.data.customer);
+      }
+    });
+
+    await modal.present();
+  }
+
+  private async handleCustomerCreated(customer: Parse.Object): Promise<void> {
+    this.currentCustomer = customer;
+    this.state = ComponentState.CUSTOMER_EXISTS;
+
+    this.customerSelected.emit({
+      customer,
+      isNewCustomer: true,
+      action: 'created'
+    });
+  }
+
+  async changeCustomer(): Promise<void> {
+    // 重新进入选择状态
+    this.currentCustomer = undefined;
+    this.project.unset('customer');
+    await this.project.save();
+
+    await this.loadAvailableCustomers();
+    this.state = ComponentState.SELECTING;
+  }
+
+  private handleError(error: any): void {
+    console.error('Customer selector error:', error);
+    this.state = ComponentState.ERROR;
+
+    this.error.emit({
+      type: 'load_failed',
+      message: '加载客户列表失败',
+      details: error
+    });
+  }
+}
+```
+
+### 2. 创建客户模态框
+
+```typescript
+@Component({
+  selector: 'app-create-customer-modal',
+  standalone: true,
+  imports: [CommonModule, FormsModule, IonicModule],
+  template: `
+    <ion-header>
+      <ion-toolbar>
+        <ion-title>创建新客户</ion-title>
+        <ion-buttons slot="end">
+          <ion-button (click)="dismiss()">取消</ion-button>
+        </ion-buttons>
+      </ion-toolbar>
+    </ion-header>
+
+    <ion-content class="ion-padding">
+      <form #customerForm="ngForm" (ngSubmit)="onSubmit()">
+        <ion-item>
+          <ion-label position="stacked">客户姓名 *</ion-label>
+          <ion-input
+            name="name"
+            [(ngModel)]="customerData.name"
+            required
+            placeholder="请输入客户姓名">
+          </ion-input>
+        </ion-item>
+
+        <ion-item>
+          <ion-label position="stacked">手机号码</ion-label>
+          <ion-input
+            name="mobile"
+            [(ngModel)]="customerData.mobile"
+            type="tel"
+            placeholder="请输入手机号码">
+          </ion-input>
+        </ion-item>
+
+        <ion-item>
+          <ion-label position="stacked">来源渠道</ion-label>
+          <ion-select
+            name="source"
+            [(ngModel)]="customerData.source"
+            placeholder="请选择来源渠道">
+            <ion-select-option value="朋友圈">朋友圈</ion-select-option>
+            <ion-select-option value="信息流">信息流</ion-select-option>
+            <ion-select-option value="转介绍">转介绍</ion-select-option>
+            <ion-select-option value="其他">其他</ion-select-option>
+          </ion-select>
+        </ion-item>
+
+        <ion-button
+          type="submit"
+          expand="block"
+          [disabled]="!customerForm.valid || loading"
+          class="ion-margin-top">
+          <ion-spinner *ngIf="loading" name="dots" slot="start"></ion-spinner>
+          创建客户
+        </ion-button>
+      </form>
+    </ion-content>
+  `
+})
+export class CreateCustomerModalComponent {
+  @Input() company!: Parse.Object;
+  @Input() project!: Parse.Object;
+
+  customerData = {
+    name: '',
+    mobile: '',
+    source: ''
+  };
+
+  loading: boolean = false;
+
+  constructor(
+    private modalController: ModalController,
+    private parseService: ParseService
+  ) {}
+
+  async onSubmit(): Promise<void> {
+    if (this.loading) return;
+
+    this.loading = true;
+
+    try {
+      // 创建ContactInfo记录
+      const ContactInfo = Parse.Object.extend('ContactInfo');
+      const customer = new ContactInfo();
+
+      customer.set('name', this.customerData.name);
+      customer.set('mobile', this.customerData.mobile);
+      customer.set('source', this.customerData.source);
+      customer.set('company', this.company);
+
+      await customer.save();
+
+      // 关联到项目
+      this.project.set('customer', customer);
+      await this.project.save();
+
+      this.modalController.dismiss({
+        customer,
+        action: 'created'
+      });
+    } catch (error) {
+      console.error('创建客户失败:', error);
+      // 显示错误提示
+    } finally {
+      this.loading = false;
+    }
+  }
+
+  dismiss(): void {
+    this.modalController.dismiss();
+  }
+}
+```
+
+### 3. 样式设计
+
+```scss
+.customer-selector {
+  border: 1px solid var(--ion-color-light);
+  border-radius: 8px;
+  overflow: hidden;
+  background: var(--ion-background-color);
+
+  // 已有客户状态
+  &.has-customer {
+    .current-customer {
+      display: flex;
+      align-items: center;
+      padding: 12px 16px;
+      gap: 12px;
+
+      .customer-info {
+        flex: 1;
+
+        h3 {
+          margin: 0;
+          font-size: 16px;
+          font-weight: 600;
+        }
+
+        p {
+          margin: 4px 0 0;
+          font-size: 14px;
+          color: var(--ion-color-medium);
+        }
+      }
+    }
+  }
+
+  // 选择客户状态
+  &.selecting {
+    .customer-list {
+      max-height: 300px;
+      overflow-y: auto;
+
+      ion-item {
+        cursor: pointer;
+        transition: background-color 0.2s;
+
+        &:hover {
+          background-color: var(--ion-color-light);
+        }
+
+        &.selected {
+          background-color: var(--ion-color-light);
+
+          ion-icon {
+            color: var(--ion-color-primary);
+          }
+        }
+      }
+    }
+  }
+
+  // 加载状态
+  &.loading {
+    display: flex;
+    flex-direction: column;
+    align-items: center;
+    justify-content: center;
+    padding: 40px 20px;
+    text-align: center;
+
+    ion-spinner {
+      margin-bottom: 16px;
+    }
+
+    p {
+      color: var(--ion-color-medium);
+      margin: 0;
+    }
+  }
+
+  // 错误状态
+  &.error {
+    padding: 20px;
+    text-align: center;
+
+    .error-message {
+      color: var(--ion-color-danger);
+      margin-bottom: 16px;
+    }
+
+    ion-button {
+      margin: 0 auto;
+    }
+  }
+}
+```
+
+## 使用示例
+
+### 1. 基础用法
+
+```typescript
+@Component({
+  selector: 'app-project-detail',
+  standalone: true,
+  imports: [CustomerSelectorComponent],
+  template: `
+    <div class="project-customer-section">
+      <h3>项目客户</h3>
+      <app-customer-selector
+        [project]="project"
+        [groupChat]="groupChat"
+        (customerSelected)="onCustomerSelected($event)"
+        (error)="onSelectorError($event)">
+      </app-customer-selector>
+    </div>
+  `
+})
+export class ProjectDetailComponent {
+  @Input() project!: Parse.Object;
+  @Input() groupChat!: Parse.Object;
+
+  onCustomerSelected(event: CustomerSelectedEvent) {
+    console.log('客户已选择:', event.customer);
+    console.log('是否为新客户:', event.isNewCustomer);
+
+    if (event.isNewCustomer) {
+      // 新客户创建成功后的处理
+      this.showWelcomeMessage(event.customer);
+    }
+  }
+
+  onSelectorError(error: ErrorEvent) {
+    console.error('客户选择器错误:', error);
+    this.showErrorMessage(error.message);
+  }
+}
+```
+
+### 2. 高级配置
+
+```typescript
+@Component({
+  selector: 'app-project-setup',
+  standalone: true,
+  imports: [CustomerSelectorComponent],
+  template: `
+    <app-customer-selector
+      [project]="project"
+      [groupChat]="groupChat"
+      placeholder="请为项目指定客户"
+      [showCreateButton]="true"
+      [filterCriteria]="filterOptions"
+      [disabled]="isProjectLocked"
+      (customerSelected)="handleCustomerChange($event)">
+    </app-customer-selector>
+  `
+})
+export class ProjectSetupComponent {
+  project: Parse.Object;
+  groupChat: Parse.Object;
+  isProjectLocked = false;
+
+  filterOptions = {
+    joinTimeAfter: new Date('2024-01-01'),
+    joinScenes: [1, 2],
+    excludeUserIds: ['user123', 'user456']
+  };
+
+  handleCustomerChange(event: CustomerSelectedEvent) {
+    // 处理客户变更
+    this.updateProjectStatus(event.action);
+  }
+}
+```
+
+## 错误处理与边界情况
+
+### 1. 常见错误场景
+
+#### 1.1 群聊无外部用户
+```typescript
+if (externalUserIds.length === 0) {
+  this.state = ComponentState.ERROR;
+  this.error.emit({
+    type: 'load_failed',
+    message: '当前群聊中没有外部客户用户',
+    details: { memberCount: memberList.length }
+  });
+  return;
+}
+```
+
+#### 1.2 权限不足
+```typescript
+if (error.code === 119) {
+  this.error.emit({
+    type: 'permission_denied',
+    message: '没有权限访问该项目的客户信息',
+    details: error
+  });
+}
+```
+
+#### 1.3 网络错误
+```typescript
+if (error.message?.includes('Network')) {
+  this.error.emit({
+    type: 'load_failed',
+    message: '网络连接失败,请检查网络后重试',
+    details: error
+  });
+}
+```
+
+### 2. 降级方案
+
+#### 2.1 搜索功能降级
+```typescript
+private filterCustomers(keyword: string): Parse.Object[] {
+  if (!keyword) return this.availableCustomers;
+
+  const lowerKeyword = keyword.toLowerCase();
+  return this.availableCustomers.filter(customer => {
+    const name = (customer.get('name') || '').toLowerCase();
+    const mobile = (customer.get('mobile') || '').toLowerCase();
+    return name.includes(lowerKeyword) || mobile.includes(lowerKeyword);
+  });
+}
+```
+
+#### 2.2 缓存策略
+```typescript
+private customerCache = new Map<string, Parse.Object>();
+
+private async getCachedCustomer(externalUserId: string): Promise<Parse.Object | null> {
+  if (this.customerCache.has(externalUserId)) {
+    return this.customerCache.get(externalUserId)!;
+  }
+
+  const customer = await this.queryCustomerByExternalId(externalUserId);
+  if (customer) {
+    this.customerCache.set(externalUserId, customer);
+  }
+
+  return customer;
+}
+```
+
+## 性能优化
+
+### 1. 数据加载优化
+- **懒加载**: 只在需要时加载客户详情
+- **分页加载**: 大量客户时支持分页显示
+- **缓存机制**: 缓存已查询的客户信息
+
+### 2. UI优化
+- **虚拟滚动**: 大列表时使用虚拟滚动
+- **防抖搜索**: 搜索输入时进行防抖处理
+- **骨架屏**: 加载时显示骨架屏提升体验
+
+## 测试策略
+
+### 1. 单元测试
+```typescript
+describe('CustomerSelectorComponent', () => {
+  let component: CustomerSelectorComponent;
+  let fixture: ComponentFixture<CustomerSelectorComponent>;
+
+  beforeEach(async () => {
+    await TestBed.configureTestingModule({
+      imports: [CustomerSelectorComponent]
+    }).compileComponents();
+
+    fixture = TestBed.createComponent(CustomerSelectorComponent);
+    component = fixture.componentInstance;
+  });
+
+  it('should load existing customer when project has customer', async () => {
+    // 测试项目已有客户的情况
+  });
+
+  it('should show customer list when project has no customer', async () => {
+    // 测试显示客户列表的情况
+  });
+
+  it('should filter external users from member list', async () => {
+    // 测试过滤外部用户功能
+  });
+});
+```
+
+### 2. 集成测试
+```typescript
+describe('Customer Integration', () => {
+  it('should create new customer and associate with project', async () => {
+    // 测试创建新客户并关联到项目的完整流程
+  });
+
+  it('should select existing customer and update project', async () => {
+    // 测试选择现有客户并更新项目的流程
+  });
+});
+```
+
+## 总结
+
+`app-customer-selector` 组件提供了完整的项目客户选择解决方案:
+
+✅ **智能识别**: 自动从群聊成员中识别外部用户
+✅ **数据同步**: 支持创建和关联ContactInfo记录
+✅ **用户体验**: 流畅的选择、搜索、创建交互
+✅ **错误处理**: 完善的错误处理和降级方案
+✅ **性能优化**: 缓存、懒加载等性能优化策略
+✅ **扩展性**: 支持自定义过滤条件和样式定制
+
+该组件可有效解决项目管理中客户指定的痛点,提升用户操作效率。

+ 1032 - 0
docs/prd/项目-日志人效分析.md

@@ -0,0 +1,1032 @@
+# 项目日志与人效分析方案
+
+## 概述
+
+基于Product表统一空间管理和ProjectChange表的项目变化日志,设计完整的项目管理行为数据追踪和人效分析系统,为企业提供数据驱动的绩效评估和优化决策支持。
+
+## ProjectChange表设计
+
+### 表结构定义
+
+```typescript
+interface ProjectChange {
+  objectId: string;                    // 主键ID
+  company: Pointer<Company>;          // 所属企业
+  project?: Pointer<Project>;         // 关联项目(可选)
+  product?: Pointer<Product>;         // 关联空间产品(可选)
+  profile: Pointer<Profile>;         // 操作人员
+  changeType: string;                // 变化类型
+  changeCategory: string;             // 变化分类
+  changeAction: string;               // 具体动作
+  description: string;                // 变化描述
+  oldValue?: any;                     // 变化前值
+  newValue?: any;                     // 变化后值
+  metadata?: Object;                  // 扩展元数据
+  timestamp: Date;                    // 发生时间
+  source: string;                     // 数据来源
+  clientInfo?: Object;                // 客户端信息
+  duration?: Number;                  // 操作耗时(毫秒)
+  relatedModule: string;              // 关联模块
+  impactLevel: string;                // 影响级别
+  tags?: Array<string>;               // 标签
+  data?: Object;                      // 扩展数据
+  isDeleted: Boolean;
+  createdAt: Date;
+  updatedAt: Date;
+}
+```
+
+### 核心字段枚举值
+
+#### changeType(变化类型)
+- `project_basic`: 项目基础信息变更
+- `project_status`: 项目状态变更
+- `product_create`: 产品创建
+- `product_update`: 产品更新
+- `product_stage`: 产品阶段变更
+- `team_assign`: 团队分配
+- `file_upload`: 文件上传
+- `payment_record`: 付款记录
+- `feedback_create`: 反馈创建
+- `requirement_update`: 需求更新
+- `quotation_change`: 报价变更
+- `quality_review`: 质量审核
+- `communication`: 沟通记录
+- `exception`: 异常事件
+- `milestone`: 里程碑达成
+
+#### changeCategory(变化分类)
+- `项目管理`: project_management
+- `设计执行`: design_execution
+- `团队协作`: team_collaboration
+- `客户沟通`: client_communication
+- `财务管理`: financial_management
+- `质量控制`: quality_control
+- `文件管理`: file_management
+- `交付管理`: delivery_management
+
+#### changeAction(具体动作)
+- `create`: 创建
+- `update`: 更新
+- `delete`: 删除
+- `assign`: 分配
+- `approve`: 审批
+- `reject`: 拒绝
+- `complete`: 完成
+- `cancel`: 取消
+- `upload`: 上传
+- `download`: 下载
+- `review`: 审核
+- `comment`: 评论
+- `modify`: 修改
+
+#### impactLevel(影响级别)
+- `low`: 低影响 - 常规操作,影响范围小
+- `medium`: 中影响 - 重要操作,影响项目进度
+- `high`: 高影响 - 关键操作,影响项目交付
+- `critical`: 严重 - 风险事件,可能导致项目延期或失败
+
+## 项目管理行为数据分析
+
+### 1. 岗位行为模式识别
+
+#### 客服人员行为数据
+```typescript
+interface ServiceBehaviorData {
+  // 项目接单与分配
+  orderAcceptance: {
+    totalOrders: number;           // 接单总数
+    averageResponseTime: number;   // 平均响应时间
+    conversionRate: number;       // 成交转化率
+    orderToProjectTime: number;    // 接单转项目平均时间
+  };
+
+  // 客户沟通
+  clientCommunication: {
+    communicationCount: number;    // 沟通次数
+    averageResponseTime: number;   // 客户回复响应时间
+    satisfactionScore: number;     // 客户满意度
+    followupFrequency: number;    // 跟进频次
+  };
+
+  // 需求管理
+  requirementManagement: {
+    requirementCollectionRate: number;  // 需求收集完整率
+    requirementClarificationCount: number; // 需求澄清次数
+    analysisAccuracy: number;           // 需求分析准确度
+  };
+}
+```
+
+#### 设计师行为数据
+```typescript
+interface DesignerBehaviorData {
+  // 设计执行效率
+  designExecution: {
+    projectCount: number;          // 负责项目数
+    averageDesignTime: number;    // 平均设计时间
+    revisionCount: number;         // 修改次数
+    firstPassRate: number;        // 一次通过率
+  };
+
+  // 质量表现
+  qualityMetrics: {
+    clientRating: number;          // 客户评分
+    qualityIssueCount: number;     // 质量问题数
+    reworkRate: number;           // 返工率
+    innovationScore: number;       // 创新评分
+  };
+
+  // 协作表现
+  collaboration: {
+    teamCommunication: number;     // 团队沟通频次
+    knowledgeSharing: number;     // 知识分享次数
+    mentorshipActivity: number;  // 指导新人次数
+  };
+}
+```
+
+#### 组长行为数据
+```typescript
+interface LeaderBehaviorData {
+  // 项目管理
+  projectManagement: {
+    teamProjectCount: number;     // 团队项目数
+    onTimeDeliveryRate: number;   // 按时交付率
+    budgetUtilization: number;    // 预算使用率
+    resourceAllocation: number;   // 资源分配效率
+  };
+
+  // 团队管理
+  teamManagement: {
+    teamSize: number;             // 团队规模
+    teamSatisfaction: number;     // 团队满意度
+    teamPerformanceScore: number; // 团队绩效
+    conflictResolution: number;   // 冲突解决次数
+  };
+
+  // 质量控制
+  qualityControl: {
+    reviewCount: number;          // 审核次数
+    qualityImprovement: number;   // 质量改进建议数
+    errorPrevention: number;      // 错误预防次数
+  };
+}
+```
+
+### 2. 项目生命周期行为数据
+
+#### 项目启动阶段
+```typescript
+interface ProjectInitiationData {
+  // 需求收集
+  requirementCollection: {
+    collectionTime: number;       // 需求收集耗时
+    completenessScore: number;   // 需求完整度
+    clarificationRound: number;  // 需求澄清轮次
+    stakeholderEngagement: number; // 相关方参与度
+  };
+
+  // 项目规划
+  projectPlanning: {
+    planningTime: number;         // 规划时间
+    scopeDefinitionQuality: number; // 范围定义质量
+    timelineAccuracy: number;     // 时间预估准确性
+    resourcePlanningAccuracy: number; // 资源规划准确性
+  };
+}
+```
+
+#### 设计执行阶段
+```typescript
+interface DesignExecutionData {
+  // 产品创建
+  productCreation: {
+    productCount: number;          // 产品数量
+    creationTime: number;         // 创建时间
+    qualityScore: number;          // 质量评分
+    clientApprovalRate: number;   // 客户通过率
+  };
+
+  // 阶段管理
+  stageManagement: {
+    stageTransitionTime: number;  // 阶段转换时间
+    blockageFrequency: number;    // 阻塞频率
+    stageQualityScore: number;   // 各阶段质量评分
+    coordinationEfficiency: number; // 协调效率
+  };
+}
+```
+
+#### 交付完成阶段
+```typescript
+interface DeliveryCompletionData {
+  // 交付管理
+  deliveryManagement: {
+    deliveryTime: number;         // 交付时间
+    qualityCompliance: number;   // 质量合规性
+    clientAcceptanceRate: number; // 客户验收率
+    defectRate: number;          // 缺陷率
+  };
+
+  // 客户满意度
+  clientSatisfaction: {
+    satisfactionScore: number;    // 满意度评分
+    feedbackCount: number;        // 反馈数量
+    complaintCount: number;      // 投诉数量
+    recommendationRate: number;   // 推荐率
+  };
+}
+```
+
+## ProjectChange记录场景设计
+
+### 1. 项目管理场景
+
+#### 项目创建与分配
+```typescript
+// 场景:客服接收新项目并分配给设计师
+const projectAssignmentChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  profile: serviceProfilePointer,
+  changeType: "project_basic",
+  changeCategory: "项目管理",
+  changeAction: "assign",
+  description: "客服张三将项目'李总现代简约全案'分配给设计师李四",
+  oldValue: { assignee: null },
+  newValue: { assignee: "李四", assignedAt: timestamp },
+  metadata: {
+    customerResponseTime: 1200,    // 客户响应时间(毫秒)
+    orderValue: 85000,              // 订单金额
+    projectComplexity: "medium"    // 项目复杂度
+  },
+  duration: 3500,
+  impactLevel: "medium",
+  tags: ["项目分配", "新项目", "客户转化"],
+  relatedModule: "项目管理"
+};
+```
+
+#### 项目状态变更
+```typescript
+// 场景:项目阶段推进
+const projectStageChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  profile: designerProfilePointer,
+  changeType: "project_status",
+  changeCategory: "项目管理",
+  changeAction: "update",
+  description: "设计师李四将项目'李总现代简约全案'从'建模'阶段推进到'渲染'阶段",
+  oldValue: { stage: "建模", progress: 45 },
+  newValue: { stage: "rendering", progress: 60 },
+  metadata: {
+    stageCompletionTime: 864000000,  // 阶段完成时间(毫秒)
+    qualityScore: 4.2,                // 阶段质量评分
+    clientFeedbackCount: 2            // 客户反馈次数
+  },
+  duration: 1200,
+  impactLevel: "high",
+  tags: ["阶段推进", "质量把控", "客户反馈"],
+  relatedModule: "设计执行"
+};
+```
+
+### 2. 产品管理场景
+
+#### 空间产品创建
+```typescript
+// 场景:设计师创建新的空间设计产品
+const productCreationChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  product: productPointer,
+  profile: designerProfilePointer,
+  changeType: "product_create",
+  changeCategory: "设计执行",
+  changeAction: "create",
+  description: "设计师李四创建空间产品'李总主卧设计'",
+  newValue: {
+    productName: "李总主卧设计",
+    productType: "bedroom",
+    estimatedBudget: 35000,
+    estimatedDuration: 7
+  },
+  metadata: {
+    spaceArea: 18.5,                 // 空间面积
+    designComplexity: "medium",       // 设计复杂度
+    templateUsed: "modern_minimal",   // 使用模板
+    innovationScore: 3.8             // 创新评分
+  },
+  duration: 5400,
+  impactLevel: "medium",
+  tags: ["产品设计", "空间规划", "创新设计"],
+  relatedModule: "产品设计"
+};
+```
+
+#### 产品报价更新
+```typescript
+// 场景:组长审核并批准产品报价
+const quotationApprovalChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  product: productPointer,
+  profile: leaderProfilePointer,
+  changeType: "quotation_change",
+  changeCategory: "财务管理",
+  changeAction: "approve",
+  description: "组长王五审核通过'李总主卧设计'产品报价,金额35000元",
+  oldValue: {
+    quotation: {
+      price: 32000,
+      status: "pending"
+    }
+  },
+  newValue: {
+    quotation: {
+      price: 35000,
+      status: "approved",
+      approvedBy: "王五",
+      approvedAt: timestamp
+    }
+  },
+  metadata: {
+    priceAdjustment: 3000,           // 价格调整
+    negotiationRound: 1,            // 商议轮次
+    profitMargin: 0.28,              // 利润率
+    marketCompetitiveness: "high"   // 市场竞争力
+  },
+  duration: 2800,
+  impactLevel: "high",
+  tags: ["报价审核", "财务决策", "利润管理"],
+  relatedModule: "财务管理"
+};
+```
+
+### 3. 团队协作场景
+
+#### 团队成员分配
+```typescript
+// 场景:组长为项目分配团队成员
+const teamAssignmentChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  profile: leaderProfilePointer,
+  changeType: "team_assign",
+  changeCategory: "团队协作",
+  changeAction: "assign",
+  description: "组长王五为项目'李总现代简约全案'分配渲染师赵六",
+  newValue: {
+    teamMember: "赵六",
+    role: "渲染师",
+    workload: 0.6,
+    startDate: timestamp,
+    responsibilities: ["主卧渲染", "客厅渲染"]
+  },
+  metadata: {
+    workloadBalance: 0.75,          // 工作负载平衡度
+    skillMatchScore: 4.5,           // 技能匹配评分
+    teamMemberAvailability: "high",  // 成员可用性
+    coordinationComplexity: "low"    // 协调复杂度
+  },
+  duration: 1800,
+  impactLevel: "medium",
+  tags: ["团队协作", "技能匹配", "资源分配"],
+  relatedModule: "团队管理"
+};
+```
+
+#### 工作负载调整
+```typescript
+// 场景:项目经理调整团队成员工作负载
+const workloadAdjustmentChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  profile: leaderProfilePointer,
+  changeType: "team_assign",
+  changeCategory: "团队协作",
+  changeAction: "modify",
+  description: "组长王五调整设计师李四的工作负载从0.8降至0.6,避免过载",
+  oldValue: { workload: 0.8, status: "高负载" },
+  newValue: { workload: 0.6, status: "正常负载" },
+  metadata: {
+    overloadRiskLevel: "medium",    // 过载风险级别
+    adjustmentReason: "质量保障",   // 调整原因
+    impactOnTimeline: "minimal",    // 对时间线影响
+    teamMemberConsent: true         // 成员同意
+  },
+  duration: 900,
+  impactLevel: "medium",
+  tags: ["负载调整", "资源优化", "团队管理"],
+  relatedModule: "团队管理"
+};
+```
+
+### 4. 文件管理场景
+
+#### 设计文件上传
+```typescript
+// 场景:设计师上传设计效果图
+const fileUploadChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  product: productPointer,
+  profile: designerProfilePointer,
+  changeType: "file_upload",
+  changeCategory: "文件管理",
+  changeAction: "upload",
+  description: "设计师李四上传'李总主卧设计'效果图3张",
+  newValue: {
+    files: [
+      {
+        fileName: "主卧效果图1.jpg",
+        fileSize: 2458176,
+        fileType: "rendering",
+        category: "delivery"
+      },
+      {
+        fileName: "主卧效果图2.jpg",
+        fileSize: 3152418,
+        fileType: "rendering",
+        category: "delivery"
+      }
+    ],
+    uploadCount: 3,
+    totalSize: 8452792
+  },
+  metadata: {
+    uploadDuration: 45000,          // 上传耗时(毫秒)
+    fileQualityScore: 4.7,          // 文件质量评分
+    revisionNumber: 1,              // 修改版本
+    clientApprovalRequired: true   // 需要客户审批
+  },
+  duration: 45000,
+  impactLevel: "medium",
+  tags: ["文件上传", "设计交付", "质量检查"],
+  relatedModule: "文件管理"
+};
+```
+
+#### 客户反馈文件
+```typescript
+// 场景:客户上传参考图片
+const customerFileUploadChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  profile: customerProfilePointer,
+  changeType: "file_upload",
+  changeCategory: "客户沟通",
+  changeAction: "upload",
+  description: "客户李总上传参考图片5张,用于明确设计风格偏好",
+  newValue: {
+    files: [
+      { fileName: "参考风格1.jpg", category: "reference" },
+      { fileName: "参考风格2.jpg", category: "reference" }
+    ],
+    uploadCount: 5,
+    purpose: "设计参考"
+  },
+  metadata: {
+    source: "客户上传",
+    referenceClarity: "high",       // 参考清晰度
+    designAlignment: 0.85,          // 设计契合度
+    designerFeedbackRequired: true  // 需要设计师反馈
+  },
+  duration: 32000,
+  impactLevel: "low",
+  tags: ["客户参与", "需求明确", "设计参考"],
+  relatedModule: "客户沟通"
+};
+```
+
+### 5. 财务管理场景
+
+#### 付款记录
+```typescript
+// 场景:财务人员记录客户付款
+const paymentRecordChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  profile: financeProfilePointer,
+  changeType: "payment_record",
+  changeCategory: "财务管理",
+  changeAction: "create",
+  description: "财务人员钱七记录客户李总支付项目首期款35000元",
+  newValue: {
+    payment: {
+      type: "advance",
+      amount: 35000,
+      currency: "CNY",
+      method: "bank_transfer",
+      status: "paid",
+      percentage: 30
+    }
+  },
+  metadata: {
+    paymentDelayDays: 2,            // 付款延迟天数
+    paymentMethod: "bank_transfer", // 付款方式
+    cashFlowImpact: "positive",     // 现金流影响
+    followUpRequired: false        // 需要跟进
+  },
+  duration: 2400,
+  impactLevel: "high",
+  tags: ["付款记录", "现金管理", "项目收款"],
+  relatedModule: "财务管理"
+};
+```
+
+#### 付款提醒
+```typescript
+// 场景:系统自动发送付款提醒
+const paymentReminderChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  profile: systemProfilePointer,
+  changeType: "payment_record",
+  changeCategory: "财务管理",
+  changeAction: "comment",
+  description: "系统自动发送付款提醒给客户李总,提醒第二笔款35000元将于3天后到期",
+  newValue: {
+    reminder: {
+      type: "payment_due",
+      amount: 35000,
+      dueDate: dueDate,
+      reminderSent: true,
+      reminderCount: 1
+    }
+  },
+  metadata: {
+    reminderChannel: "wechat",      // 提醒渠道
+    automationEnabled: true,        // 自动化启用
+    responseRequired: true,         // 需要响应
+    urgencyLevel: "medium"          // 紧急程度
+  },
+  duration: 500,
+  impactLevel: "medium",
+  tags: ["自动提醒", "付款管理", "客户沟通"],
+  relatedModule: "财务管理",
+  source: "system"
+};
+```
+
+### 6. 质量控制场景
+
+#### 设计质量审核
+```typescript
+// 场景:组长审核设计方案
+const qualityReviewChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  product: productPointer,
+  profile: leaderProfilePointer,
+  changeType: "quality_review",
+  changeCategory: "质量控制",
+  changeAction: "review",
+  description: "组长王五审核'李总主卧设计'方案,提出3点改进建议",
+  newValue: {
+    review: {
+      status: "approved_with_modifications",
+      qualityScore: 4.2,
+      issueCount: 3,
+      improvementSuggestions: [
+        "灯光布局需要优化",
+        "储物空间设计可以更充分利用",
+        "色彩搭配建议调整"
+      ]
+    }
+  },
+  metadata: {
+    reviewDuration: 3600,           // 审核耗时(秒)
+    checklistScore: 0.88,          // 检查表得分
+    standardCompliance: "high",     // 标准合规性
+    revisionImpact: "low"          // 修改影响程度
+  },
+  duration: 3600,
+  impactLevel: "high",
+  tags: ["质量审核", "设计把关", "改进建议"],
+  relatedModule: "质量控制"
+};
+```
+
+#### 客户反馈处理
+```typescript
+// 场景:客服处理客户反馈
+const feedbackHandlingChange: ProjectChange = {
+  company: companyPointer,
+  project: projectPointer,
+  profile: serviceProfilePointer,
+  changeType: "feedback_create",
+  changeCategory: "客户沟通",
+  changeAction: "update",
+  description: "客服张三处理客户李总关于客厅设计的反馈,协调设计师进行修改",
+  newValue: {
+    feedback: {
+      status: "in_progress",
+      priority: "medium",
+      assignedTo: "李四",
+      expectedResolution: timestamp + 86400000
+    }
+  },
+  metadata: {
+    responseTime: 1800,            // 响应时间(秒)
+    feedbackType: "design_modification", // 反馈类型
+    clientEmotion: "neutral",       // 客户情绪
+    resolutionComplexity: "medium"  // 解决复杂度
+  },
+  duration: 1500,
+  impactLevel: "medium",
+  tags: ["客户反馈", "问题处理", "协调沟通"],
+  relatedModule: "客户沟通"
+};
+```
+
+## 人效分析计算方案
+
+### 1. 个人绩效分析
+
+#### 基础效率指标
+```typescript
+interface IndividualEfficiencyMetrics {
+  // 工作量指标
+  workload: {
+    projectCount: number;          // 负责项目数量
+    productCount: number;          // 完成产品数量
+    taskCompletionRate: number;    // 任务完成率
+    averageTaskDuration: number;   // 平均任务时长
+  };
+
+  // 质量指标
+  quality: {
+    clientSatisfactionScore: number; // 客户满意度评分
+    revisionRate: number;           // 修改率
+    firstPassYield: number;         // 一次通过率
+    errorCount: number;             // 错误数量
+  };
+
+  // 效率指标
+  efficiency: {
+    outputPerHour: number;          // 每小时产出
+    resourceUtilization: number;    // 资源利用率
+    deadlineAdherence: number;      // 截止时间遵守率
+    reworkPercentage: number;       // 返工比例
+  };
+}
+```
+
+#### 协作表现指标
+```typescript
+interface CollaborationMetrics {
+  // 团队协作
+  teamwork: {
+    collaborationScore: number;     // 协作评分
+    knowledgeSharingCount: number;  // 知识分享次数
+    mentorshipScore: number;        // 指导评分
+    conflictResolutionSuccess: number; // 冲突解决成功率
+  };
+
+  // 沟通效率
+  communication: {
+    responseTime: number;           // 平均响应时间
+    communicationClarity: number;   // 沟通清晰度
+    stakeholderSatisfaction: number; // 相关方满意度
+    meetingEffectiveness: number;   // 会议有效性
+  };
+}
+```
+
+### 2. 团队效能分析
+
+#### 团队综合指标
+```typescript
+interface TeamEffectivenessMetrics {
+  // 交付能力
+  delivery: {
+    onTimeDeliveryRate: number;     // 按时交付率
+    qualityCompliance: number;     // 质量合规性
+    clientSatisfactionAverage: number; // 平均客户满意度
+    throughputPerPeriod: number;   // 周期产出量
+  };
+
+  // 资源利用
+  resource: {
+    teamUtilizationRate: number;    // 团队资源利用率
+    workloadBalance: number;       // 工作负载平衡度
+    skillUtilization: number;       // 技能利用率
+    overtimePercentage: number;     // 加班比例
+  };
+
+  // 财务表现
+  financial: {
+    revenuePerTeamMember: number;   // 人均收入
+    projectProfitability: number;   // 项目盈利性
+    costEfficiency: number;        // 成本效率
+    budgetAdherence: number;        // 预算遵守率
+  };
+}
+```
+
+### 3. 计算方法与公式
+
+#### 个人效率计算
+```typescript
+// 效率综合评分计算
+function calculateEfficiencyScore(changeLogs: ProjectChange[], timeRange: DateRange): number {
+  const workloadScore = calculateWorkloadScore(changeLogs, timeRange);
+  const qualityScore = calculateQualityScore(changeLogs, timeRange);
+  const speedScore = calculateSpeedScore(changeLogs, timeRange);
+
+  // 加权平均
+  const weights = { workload: 0.4, quality: 0.4, speed: 0.2 };
+  return workloadScore * weights.workload +
+         qualityScore * weights.quality +
+         speedScore * weights.speed;
+}
+
+// 工作量评分计算
+function calculateWorkloadScore(changeLogs: ProjectChange[], timeRange: DateRange): number {
+  const completedTasks = changeLogs.filter(log =>
+    log.changeAction === 'complete' &&
+    isDateInRange(log.timestamp, timeRange)
+  ).length;
+
+  const totalWorkingHours = calculateWorkingHours(timeRange);
+  const tasksPerHour = completedTasks / totalWorkingHours;
+
+  // 基准对比评分(假设基准为2 tasks/hour)
+  const baseline = 2.0;
+  return Math.min(tasksPerHour / baseline, 2.0) * 100;
+}
+
+// 质量评分计算
+function calculateQualityScore(changeLogs: ProjectChange[], timeRange: DateRange): number {
+  const feedbackLogs = changeLogs.filter(log =>
+    log.changeType === 'feedback_create' &&
+    isDateInRange(log.timestamp, timeRange)
+  );
+
+  if (feedbackLogs.length === 0) return 80; // 默认质量分
+
+  const averageRating = feedbackLogs.reduce((sum, log) => {
+    return sum + (log.metadata?.rating || 3);
+  }, 0) / feedbackLogs.length;
+
+  const revisionLogs = changeLogs.filter(log =>
+    log.changeAction === 'modify' &&
+    log.changeCategory === '设计执行'
+  ).length;
+
+  const revisionPenalty = Math.min(revisionLogs * 5, 30);
+  return Math.max((averageRating / 5) * 100 - revisionPenalty, 0);
+}
+
+// 速度评分计算
+function calculateSpeedScore(changeLogs: ProjectChange[], timeRange: DateRange): number {
+  const completedTasks = changeLogs.filter(log =>
+    log.changeAction === 'complete' &&
+    log.duration &&
+    isDateInRange(log.timestamp, timeRange)
+  );
+
+  if (completedTasks.length === 0) return 80;
+
+  const averageDuration = completedTasks.reduce((sum, log) =>
+    sum + log.duration!, 0) / completedTasks.length;
+
+  const expectedDuration = 3600000; // 1小时基准
+  const speedRatio = expectedDuration / averageDuration;
+
+  return Math.min(speedRatio * 100, 150); // 最高150分
+}
+```
+
+#### 团队效能计算
+```typescript
+// 团队效能综合评分
+function calculateTeamEffectivenessScore(teamChanges: ProjectChange[], timeRange: DateRange): TeamEffectivenessMetrics {
+  const teamMembers = getUniqueProfiles(teamChanges);
+
+  return {
+    delivery: {
+      onTimeDeliveryRate: calculateOnTimeDeliveryRate(teamChanges, timeRange),
+      qualityCompliance: calculateQualityComplianceRate(teamChanges, timeRange),
+      clientSatisfactionAverage: calculateAverageClientSatisfaction(teamChanges, timeRange),
+      throughputPerPeriod: calculateThroughput(teamChanges, timeRange)
+    },
+    resource: {
+      teamUtilizationRate: calculateTeamUtilization(teamChanges, teamMembers, timeRange),
+      workloadBalance: calculateWorkloadBalance(teamChanges, teamMembers, timeRange),
+      skillUtilization: calculateSkillUtilization(teamChanges, timeRange),
+      overtimePercentage: calculateOvertimePercentage(teamChanges, teamMembers, timeRange)
+    },
+    financial: {
+      revenuePerTeamMember: calculateRevenuePerMember(teamChanges, teamMembers, timeRange),
+      projectProfitability: calculateProjectProfitability(teamChanges, timeRange),
+      costEfficiency: calculateCostEfficiency(teamChanges, timeRange),
+      budgetAdherence: calculateBudgetAdherence(teamChanges, timeRange)
+    }
+  };
+}
+
+// 按时交付率计算
+function calculateOnTimeDeliveryRate(changes: ProjectChange[], timeRange: DateRange): number {
+  const deliveries = changes.filter(log =>
+    log.changeType === 'milestone' &&
+    log.changeAction === 'complete' &&
+    isDateInRange(log.timestamp, timeRange)
+  );
+
+  if (deliveries.length === 0) return 100;
+
+  const onTimeDeliveries = deliveries.filter(log =>
+    !log.metadata?.delay || log.metadata.delay <= 0
+  ).length;
+
+  return (onTimeDeliveries / deliveries.length) * 100;
+}
+
+// 工作负载平衡度计算
+function calculateWorkloadBalance(changes: ProjectChange[], members: Profile[], timeRange: DateRange): number {
+  const workloadByMember = members.map(member => {
+    const memberChanges = changes.filter(log =>
+      log.profile.objectId === member.objectId &&
+      isDateInRange(log.timestamp, timeRange)
+    );
+
+    return memberChanges.reduce((total, log) => {
+      if (log.changeAction === 'complete' || log.changeAction === 'create') {
+        return total + (log.metadata?.workload || 1);
+      }
+      return total;
+    }, 0);
+  });
+
+  const averageWorkload = workloadByMember.reduce((sum, w) => sum + w, 0) / workloadByMember.length;
+  const variance = workloadByMember.reduce((sum, w) => sum + Math.pow(w - averageWorkload, 2), 0) / workloadByMember.length;
+  const standardDeviation = Math.sqrt(variance);
+
+  // 平衡度 = 1 - (标准差/平均值),越接近1表示越平衡
+  return Math.max(0, Math.min(100, (1 - standardDeviation / averageWorkload) * 100));
+}
+```
+
+### 4. 预测分析模型
+
+#### 个人绩效预测
+```typescript
+interface PerformancePrediction {
+  predictedEfficiency: number;     // 预测效率评分
+  confidenceLevel: number;         // 预测置信度
+  riskFactors: string[];          // 风险因素
+  improvementSuggestions: string[]; // 改进建议
+}
+
+function predictIndividualPerformance(
+  profile: Profile,
+  historicalData: ProjectChange[],
+  timeHorizon: number // 预测天数
+): PerformancePrediction {
+  const recentPerformance = calculateRecentPerformance(historicalData, 30);
+  const trend = calculatePerformanceTrend(historicalData, 90);
+  const workloadPattern = analyzeWorkloadPattern(historicalData, 60);
+
+  // 线性回归预测
+  const predictedScore = recentPerformance.efficiencyScore + (trend * timeHorizon / 30);
+
+  // 识别风险因素
+  const riskFactors = identifyRiskFactors(historicalData);
+
+  // 生成改进建议
+  const suggestions = generateImprovementSuggestions(recentPerformance, riskFactors);
+
+  return {
+    predictedEfficiency: Math.max(0, Math.min(100, predictedScore)),
+    confidenceLevel: calculateConfidenceLevel(historicalData.length),
+    riskFactors,
+    improvementSuggestions: suggestions
+  };
+}
+```
+
+#### 项目风险预警
+```typescript
+interface ProjectRiskAlert {
+  riskLevel: 'low' | 'medium' | 'high' | 'critical';
+  riskFactors: Array<{
+    type: string;
+    probability: number;
+    impact: number;
+    description: string;
+  }>;
+  mitigationSuggestions: string[];
+}
+
+function predictProjectRisks(projectChanges: ProjectChange[]): ProjectRiskAlert {
+  const riskFactors = [];
+
+  // 进度风险分析
+  const scheduleRisk = analyzeScheduleRisk(projectChanges);
+  if (scheduleRisk.probability > 0.3) {
+    riskFactors.push(scheduleRisk);
+  }
+
+  // 质量风险分析
+  const qualityRisk = analyzeQualityRisk(projectChanges);
+  if (qualityRisk.probability > 0.2) {
+    riskFactors.push(qualityRisk);
+  }
+
+  // 资源风险分析
+  const resourceRisk = analyzeResourceRisk(projectChanges);
+  if (resourceRisk.probability > 0.25) {
+    riskFactors.push(resourceRisk);
+  }
+
+  // 综合风险评级
+  const overallRisk = calculateOverallRisk(riskFactors);
+
+  return {
+    riskLevel: overallRisk.level,
+    riskFactors,
+    mitigationSuggestions: generateMitigationStrategies(riskFactors)
+  };
+}
+```
+
+### 5. 数据可视化方案
+
+#### 个人绩效仪表板
+```typescript
+interface PersonalPerformanceDashboard {
+  profile: Profile;
+  timeRange: DateRange;
+  metrics: {
+    efficiencyScore: number;
+    qualityScore: number;
+    workloadBalance: number;
+    collaborationScore: number;
+  };
+  trends: {
+    efficiencyTrend: Array<{date: Date, value: number}>;
+    qualityTrend: Array<{date: Date, value: number}>;
+    workloadTrend: Array<{date: Date, value: number}>;
+  };
+  comparisons: {
+    teamAverage: number;
+    departmentRank: number;
+    personalBest: number;
+  };
+}
+```
+
+#### 团队效能雷达图
+```typescript
+interface TeamPerformanceRadar {
+  teamName: string;
+  dimensions: {
+    delivery: number;              // 交付能力
+    quality: number;               // 质量水平
+    efficiency: number;            // 效率指标
+    collaboration: number;         // 协作能力
+    innovation: number;            // 创新能力
+    clientSatisfaction: number;    // 客户满意度
+  };
+  benchmarks: {
+    departmentAverage: number;
+    companyAverage: number;
+    industryStandard: number;
+  };
+}
+```
+
+## 实施建议
+
+### 1. 数据收集策略
+- **实时记录**: 关键业务操作实时记录到ProjectChange表
+- **批量处理**: 高频操作可考虑批量写入,提高性能
+- **数据清洗**: 定期清理重复、无效的日志数据
+- **隐私保护**: 敏感信息进行脱敏处理
+
+### 2. 分析频率设置
+- **实时监控**: 关键指标异常实时告警
+- **日报**: 个人工作量和完成情况日报
+- **周报**: 团队效能和项目进度周报
+- **月报**: 综合绩效分析和趋势预测月报
+- **季报**: 人才发展和团队建设季报
+
+### 3. 激励机制设计
+- **绩效挂钩**: 将分析结果与薪酬激励挂钩
+- **发展导向**: 关注个人成长和技能提升
+- **团队奖励**: 鼓励团队协作和知识分享
+- **持续改进**: 基于数据持续优化工作流程
+
+### 4. 技术实施要点
+- **数据一致性**: 确保日志数据的完整性和一致性
+- **计算性能**: 优化大数据量下的计算性能
+- **存储优化**: 合理设计索引和分区策略
+- **安全防护**: 防止数据泄露和恶意访问
+
+---
+
+该方案通过完整的项目变化日志记录和科学的人效分析模型,为企业提供了数据驱动的人才管理和项目优化决策支持系统。