Просмотр исходного кода

feat: company is yss but resId for nkkj

ryan 17 часов назад
Родитель
Сommit
c3fb9f09c0
88 измененных файлов с 266 добавлено и 247 удалено
  1. 2 2
      CHAT-ACTIVATION-TEST-TOOL.html
  2. 1 1
      CLOUD_FUNCTION_FINAL.js
  3. 1 1
      CLOUD_FUNCTION_MIGRATION_GUIDE.md
  4. 3 3
      CUSTOMER-SERVICE-REQUIREMENTS-BUTTON-FIX.md
  5. 2 2
      DELIVERY-APPROVAL-ALIGNMENT.md
  6. 2 2
      DELIVERY-APPROVAL-BUTTONS-IMPLEMENTATION.md
  7. 5 5
      DELIVERY-TEST-MARK-GUIDE.md
  8. 3 3
      GET-CHAT-URL.js
  9. 3 3
      README.md
  10. 2 2
      TEAM-LEADER-KANBAN-NAVIGATION-FIX.md
  11. 1 1
      docs/Database/database-tables-overview.md
  12. 12 12
      docs/activation-redirect-fix.md
  13. 1 1
      docs/delivery-upload-and-message-fix.md
  14. 3 3
      docs/designer-wxwork-real-data-implementation.md
  15. 5 5
      docs/dynamic-data-integration.md
  16. 1 1
      docs/employee-activation-troubleshooting.md
  17. 1 1
      docs/feature/组长端待办任务区域重构方案.md
  18. 10 10
      docs/fix/组长端项目路由修复.md
  19. 3 3
      docs/image-storage-and-classification-fix.md
  20. 8 8
      docs/implementation-summary-wxwork-project.md
  21. 3 3
      docs/project-loader-fix-summary.md
  22. 4 4
      docs/project.md
  23. 3 3
      docs/route-lazy-loading-summary.md
  24. 2 2
      docs/service-integration-complete.md
  25. 4 4
      docs/task/2025101701-admin-completed.md
  26. 1 1
      docs/task/2025101701-admin.md
  27. 1 1
      docs/task/2025102217-wxwork-sdk-init-fix.md
  28. 10 10
      docs/task/2025102219-clean-project-detail-navigation.md
  29. 2 2
      docs/task/2025102221-console-migration-script.md
  30. 3 3
      docs/task/2025102221-simple-solution.md
  31. 2 2
      docs/task/20251024-admin-project-data-fix.md
  32. 4 4
      docs/task/20251024-customer-service-dashboard-integration-summary.md
  33. 1 1
      docs/task/20251024-customer-service-dashboard-real-data-beautification.md
  34. 1 1
      docs/task/20251024-customer-service-dashboard-real-data.md
  35. 5 5
      docs/task/20251025-all-routes-auth-bypass.md
  36. 11 11
      docs/task/20251025-project-list-navigation-unified.md
  37. 2 2
      docs/task/team-leader-order-approval-implementation.md
  38. 2 2
      docs/task/设计师工作台-改造完成说明.md
  39. 1 1
      docs/task/设计师端导航条修复-最终版.md
  40. 2 2
      docs/task/设计师端项目加载-修复完成.md
  41. 2 2
      docs/task/设计师端项目加载-关键修复.md
  42. 3 3
      docs/task/设计师端项目加载-错误日志增强.md
  43. 2 2
      docs/task/设计师端项目加载问题诊断.md
  44. 4 4
      docs/task/设计师端项目路由修复.md
  45. 1 1
      docs/task/问题修复记录-2025-11-02.md
  46. 1 1
      docs/upload-631-error-final-fix.md
  47. 6 6
      docs/wxwork-appid-fix.md
  48. 2 2
      docs/wxwork-message-sending-fix-summary.md
  49. 4 4
      docs/wxwork-send-survey-link-example.md
  50. 2 2
      docs/wxwork-sendchatmessage-jssdk-fix.md
  51. 4 4
      docs/wxwork-sendmessage-debug-fix.md
  52. 5 5
      docs/wxwork-sendmessage-final-deploy-guide.md
  53. 2 2
      docs/紧急事件与待办任务组件复用指南.md
  54. 1 1
      docs/订单分配审批状态不同步问题修复.md
  55. 1 1
      docs/订单分配审批状态显示修复-完整版.md
  56. 26 8
      package-lock.json
  57. 1 0
      package.json
  58. 2 2
      public/test-aftercare.html
  59. 2 2
      public/test-stage-navigation.html
  60. 1 1
      rules/agents.md
  61. 1 1
      rules/schemas.md
  62. 10 10
      rules/wxwork/auth.md
  63. 2 2
      rules/wxwork/group-chat-contact.md
  64. 2 2
      rules/wxwork/guard-wxwork.md
  65. 2 2
      scripts/debug-team-leader-navigation.js
  66. 2 2
      src/app/app.config.ts
  67. 6 6
      src/app/pages/admin/dashboard/dashboard.ts
  68. 1 1
      src/app/pages/admin/groupchats/groupchats.ts
  69. 2 2
      src/app/pages/admin/services/admin-data.service.ts
  70. 1 1
      src/app/pages/admin/services/employee.service.ts
  71. 1 1
      src/app/pages/auth/login/login.html
  72. 8 8
      src/app/pages/customer-service/dashboard/dashboard.ts
  73. 2 2
      src/app/pages/designer/dashboard/dashboard.ts
  74. 1 1
      src/app/pages/designer/project-detail/services/designer-data.service.ts
  75. 2 2
      src/app/pages/team-leader/dashboard/dashboard.ts
  76. 2 2
      src/app/pages/team-leader/services/dashboard-navigation.helper.ts
  77. 1 1
      src/app/pages/team-leader/team-management/team-management.ts
  78. 1 1
      src/app/pages/team-leader/workload-calendar/workload-calendar.ts
  79. 2 2
      src/app/services/project.service.ts
  80. 1 1
      src/app/shared/components/upload-component/upload.component.ts
  81. 1 1
      src/modules/project/scripts/test-aftercare-connection.ts
  82. 1 1
      src/modules/project/services/wxwork-sdk.service.ts
  83. 2 2
      test-chat-activation-wxwork.html
  84. 2 2
      修复完成总结.md
  85. 1 1
      修复验证清单.txt
  86. 2 2
      快速开始.md
  87. 1 1
      核心代码变更.md
  88. 1 1
      清理日志并重新测试.md

+ 2 - 2
CHAT-ACTIVATION-TEST-TOOL.html

@@ -209,8 +209,8 @@
         <input 
           type="text" 
           id="cid" 
-          placeholder="例如: E4KpGvTEto"
-          value="E4KpGvTEto"
+          placeholder="例如: cDL6R1hgSi"
+          value="cDL6R1hgSi"
         />
         <p class="hint">企业微信公司标识符</p>
       </div>

+ 1 - 1
CLOUD_FUNCTION_FINAL.js

@@ -2,7 +2,7 @@ async function handler(request, response) {
   console.log('🚀 执行高性能 SQL 统计 (完全体 - 最终修正版)...');
   
   try {
-    let companyId = 'E4KpGvTEto';
+    let companyId = 'cDL6R1hgSi';
     if (request.company && request.company.id) companyId = request.company.id;
     else if (request.params && request.params.companyId) companyId = request.params.companyId;
     else if (request.body && request.body.companyId) companyId = request.body.companyId;

+ 1 - 1
CLOUD_FUNCTION_MIGRATION_GUIDE.md

@@ -16,7 +16,7 @@ async function handler(request, response) {
   
   try {
     // 1. 获取 companyId
-    let companyId = 'E4KpGvTEto';
+    let companyId = 'cDL6R1hgSi';
     if (request.company && request.company.id) companyId = request.company.id;
     else if (request.params && request.params.companyId) companyId = request.params.companyId;
     else if (request.body && request.body.companyId) companyId = request.body.companyId;

+ 3 - 3
CUSTOMER-SERVICE-REQUIREMENTS-BUTTON-FIX.md

@@ -133,7 +133,7 @@ calculatedCanEdit = false → canEdit被覆盖为false →
   用户角色: "客服",
   有currentUser: true,
   原始canEdit: true,
-  cid: "E4KpGvTEto",
+  cid: "cDL6R1hgSi",
   projectId: "B1ndTeOGpP"
 }
 ✅ 根据角色计算canEdit: true 角色: 客服
@@ -148,7 +148,7 @@ calculatedCanEdit = false → canEdit被覆盖为false →
   用户角色: "",
   有currentUser: false,
   原始canEdit: true,
-  cid: "E4KpGvTEto",
+  cid: "cDL6R1hgSi",
   projectId: "B1ndTeOGpP"
 }
 ⚠️ 未获取到用户角色,保留默认canEdit: true
@@ -174,7 +174,7 @@ calculatedCanEdit = false → canEdit被覆盖为false →
 
 ```
 1. 确保已登录且角色为"客服"
-2. 访问:http://localhost:4200/wxwork/E4KpGvTEto/project/xxx/requirements
+2. 访问:http://localhost:4200/wxwork/cDL6R1hgSi/project/xxx/requirements
 3. 预期:
    - 控制台显示"根据角色计算canEdit: true 角色: 客服"
    - 页面显示"确认需求"按钮 ✅

+ 2 - 2
DELIVERY-APPROVAL-ALIGNMENT.md

@@ -129,12 +129,12 @@ this.router.navigate(['/wxwork', cid, 'project', projectId, stagePath], {
 ## 🔍 测试验证点
 
 ### 1. 组长端进入 ✅
-- URL: `http://localhost:4200/wxwork/E4KpGvTEto/project/{projectId}/delivery?roleName=team-leader`
+- URL: `http://localhost:4200/wxwork/cDL6R1hgSi/project/{projectId}/delivery?roleName=team-leader`
 - 预期:显示审批按钮(通过审批 + 驳回交付)
 - 状态横幅:显示 "等待组长审批"
 
 ### 2. 客服端进入 ✅
-- URL: `http://localhost:4200/wxwork/E4KpGvTEto/project/{projectId}/delivery`(无 roleName 参数)
+- URL: `http://localhost:4200/wxwork/cDL6R1hgSi/project/{projectId}/delivery`(无 roleName 参数)
 - 预期:隐藏审批按钮
 - 只显示状态横幅和文件管理
 

+ 2 - 2
DELIVERY-APPROVAL-BUTTONS-IMPLEMENTATION.md

@@ -368,7 +368,7 @@ async rejectDelivery(): Promise<void> {
 
 ```
 1. 组长从组长看板进入交付执行阶段
-   URL: http://localhost:4200/wxwork/E4KpGvTEto/project/xxx/delivery?roleName=team-leader
+   URL: http://localhost:4200/wxwork/cDL6R1hgSi/project/xxx/delivery?roleName=team-leader
 
 2. 页面检测到 isTeamLeader=true, 调用 shouldShowApprovalButtons()
    → 返回 true(项目未审批完成)
@@ -536,7 +536,7 @@ async rejectDelivery(): Promise<void> {
 
 **测试URL**:
 ```
-http://localhost:4200/wxwork/E4KpGvTEto/project/iKvYck89zE/delivery?roleName=team-leader
+http://localhost:4200/wxwork/cDL6R1hgSi/project/iKvYck89zE/delivery?roleName=team-leader
 ```
 
 您现在可以测试完整的审批流程了!🎉

+ 5 - 5
DELIVERY-TEST-MARK-GUIDE.md

@@ -32,7 +32,7 @@
 
 ### 方式 1:从组长看板进入(推荐)
 ```
-1. 访问组长看板:http://localhost:4200/wxwork/E4KpGvTEto/team-leader/dashboard
+1. 访问组长看板:http://localhost:4200/wxwork/cDL6R1hgSi/team-leader/dashboard
 2. 点击任意项目(会自动添加 ?roleName=team-leader 参数)
 3. 如果项目当前阶段是"交付执行",会直接跳转到交付执行页面
 4. 看到测试标记按钮
@@ -40,12 +40,12 @@
 
 ### 方式 2:直接URL访问
 ```
-http://localhost:4200/wxwork/E4KpGvTEto/project/{projectId}/delivery?roleName=team-leader
+http://localhost:4200/wxwork/cDL6R1hgSi/project/{projectId}/delivery?roleName=team-leader
 ```
 
 例如:
 ```
-http://localhost:4200/wxwork/E4KpGvTEto/project/iKvYck89zE/delivery?roleName=team-leader
+http://localhost:4200/wxwork/cDL6R1hgSi/project/iKvYck89zE/delivery?roleName=team-leader
 ```
 
 ## 🖼️ 界面展示
@@ -253,7 +253,7 @@ async markDeliveryAsPending(): Promise<void> {
 npm start
 
 # 访问组长看板
-http://localhost:4200/wxwork/E4KpGvTEto/team-leader/dashboard
+http://localhost:4200/wxwork/cDL6R1hgSi/team-leader/dashboard
 ```
 
 ### 2. 选择测试项目
@@ -330,7 +330,7 @@ http://localhost:4200/wxwork/E4KpGvTEto/team-leader/dashboard
 
 ```bash
 1. 打开浏览器访问:
-   http://localhost:4200/wxwork/E4KpGvTEto/team-leader/dashboard
+   http://localhost:4200/wxwork/cDL6R1hgSi/team-leader/dashboard
 
 2. 点击任意项目,确保 URL 包含 ?roleName=team-leader
 

+ 3 - 3
GET-CHAT-URL.js

@@ -11,7 +11,7 @@
 console.log('\n🚀 会话激活页面测试地址获取工具\n');
 console.log('=' .repeat(60));
 console.log('\n📋 您的配置信息:');
-console.log('   公司ID (cid): E4KpGvTEto');
+console.log('   公司ID (cid): cDL6R1hgSi');
 console.log('   用户ID: woAs2qCQAAGQckyg7AQBxhMEoSwnlTvg');
 console.log('\n' + '='.repeat(60));
 
@@ -31,7 +31,7 @@ const script = `
 (async () => {
   try {
     // 配置信息
-    const cid = 'E4KpGvTEto';
+    const cid = 'cDL6R1hgSi';
     const userid = 'woAs2qCQAAGQckyg7AQBxhMEoSwnlTvg';
     
     // 设置localStorage
@@ -134,7 +134,7 @@ console.log('   • 自动复制URL到剪贴板');
 console.log('   • 自动打开测试页面');
 
 console.log('\n📱 URL格式:');
-console.log('   http://localhost:4200/wxwork/E4KpGvTEto/chat-activation/{群聊ID}');
+console.log('   http://localhost:4200/wxwork/cDL6R1hgSi/chat-activation/{群聊ID}');
 
 console.log('\n🎯 测试群聊包含:');
 console.log('   • 3个成员(1个技术员 + 2个客户)');

+ 3 - 3
README.md

@@ -5,7 +5,7 @@ This project was generated using [Angular CLI](https://github.com/angular/angula
 # 项目接入企业微信配置
 
 应用主页 
-https://app.fmode.cn/dev/crm/entry/E4KpGvTEto/crm
+https://app.fmode.cn/dev/crm/entry/cDL6R1hgSi/crm
 
 app.fmode.cn
 
@@ -13,7 +13,7 @@ app.fmode.cn
 映三色企业账套
 ``` 
 
-映三色 E4KpGvTEto
+映三色 cDL6R1hgSi
 Company.wework
 
 {"corpId":"wpAs2qCQAAYofoUhMXBDS8L7z1YCXHYw","agentId":"1000017"}
@@ -28,7 +28,7 @@ HTRqPisbgfVNJq2OJbfWKH1MQtG5fftBG4gebSf9oHe
 
 飞码AI演示账套
 ```
-飞码AI E4KpGvTEto
+飞码AI cDL6R1hgSi
 {"corpId":"wpAs2qCQAAD8AqggSgEG_mUdUacEXMyA","agentId":"1000020"}
 ```
 

+ 2 - 2
TEAM-LEADER-KANBAN-NAVIGATION-FIX.md

@@ -56,7 +56,7 @@ viewProjectDetailsByPhase(projectId: string, corePhaseId: string): void {
   }
   
   // 获取公司ID
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   
   // 🔥 根据看板列ID直接映射到路由路径(与客服板块保持一致)
   // corePhaseId已经是路由路径格式:order, requirements, delivery, aftercare
@@ -117,7 +117,7 @@ navigateToProject(project: ProjectListItem, columnId: 'order' | 'requirements' |
 ### 组长看板 (`dashboard.ts`) - 新增
 ```typescript
 viewProjectDetailsByPhase(projectId: string, corePhaseId: string): void {
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   
   // 直接使用corePhaseId作为路由路径(格式相同)
   const stagePath = corePhaseId;

+ 1 - 1
docs/Database/database-tables-overview.md

@@ -388,7 +388,7 @@ Attachment "n" --> "1" Company : 所属企业
 
 | 字段名 | 类型 | 必填 | 默认值 | 说明 | 示例值 |
 |--------|------|------|--------|------|--------|
-| objectId | String | 是 | 自动生成 | 主键ID | "E4KpGvTEto" |
+| objectId | String | 是 | 自动生成 | 主键ID | "cDL6R1hgSi" |
 | name | String | 是 | - | 企业名称 | "映三色设计" |
 | corpId | String | 否 | - | 企业微信CorpID | "ww1234567890abcdef" |
 | data | Object | 否 | {} | 扩展数据(配置、模块等) | `{ settings: {...}, modules: [...] }` |

+ 12 - 12
docs/activation-redirect-fix.md

@@ -147,19 +147,19 @@ this.redirectToReturnUrl();
 ### 场景1:新用户首次访问项目
 
 ```
-用户访问: /wxwork/E4KpGvTEto/project/abc123
+用户访问: /wxwork/cDL6R1hgSi/project/abc123
 守卫检查: 未激活
-保存原始URL: localStorage.setItem('returnUrl', '/wxwork/E4KpGvTEto/project/abc123')
+保存原始URL: localStorage.setItem('returnUrl', '/wxwork/cDL6R1hgSi/project/abc123')
-跳转到激活页面: /wxwork/E4KpGvTEto/activation
+跳转到激活页面: /wxwork/cDL6R1hgSi/activation
 用户填写信息并确认激活
 激活成功,调用 redirectToReturnUrl()
-读取原始URL: '/wxwork/E4KpGvTEto/project/abc123'
+读取原始URL: '/wxwork/cDL6R1hgSi/project/abc123'
 延迟1秒后跳转
@@ -171,7 +171,7 @@ this.redirectToReturnUrl();
 ### 场景2:已激活但问卷未完成
 
 ```
-用户访问: /wxwork/E4KpGvTEto/project/abc123
+用户访问: /wxwork/cDL6R1hgSi/project/abc123
 守卫检查: 已激活但问卷未完成
@@ -189,7 +189,7 @@ this.redirectToReturnUrl();
 ### 场景3:已激活且问卷已完成
 
 ```
-用户访问: /wxwork/E4KpGvTEto/project/abc123
+用户访问: /wxwork/cDL6R1hgSi/project/abc123
 守卫检查: 已激活且问卷已完成
@@ -227,15 +227,15 @@ this.redirectToReturnUrl();
 ### 成功案例
 
 ```
-🔐 CustomWxworkAuthGuard 执行,当前路由: /wxwork/E4KpGvTEto/project/abc123
+🔐 CustomWxworkAuthGuard 执行,当前路由: /wxwork/cDL6R1hgSi/project/abc123
 ⚠️ 用户未激活,跳转到激活页面
-💾 保存原始URL: /wxwork/E4KpGvTEto/project/abc123
+💾 保存原始URL: /wxwork/cDL6R1hgSi/project/abc123
 
 --- 用户激活 ---
 
 ✅ 激活成功!
-🔄 检测到原始URL,准备跳转: /wxwork/E4KpGvTEto/project/abc123
-🚀 跳转到原始URL: /wxwork/E4KpGvTEto/project/abc123
+🔄 检测到原始URL,准备跳转: /wxwork/cDL6R1hgSi/project/abc123
+🚀 跳转到原始URL: /wxwork/cDL6R1hgSi/project/abc123
 ✅ 用户看到项目详情页
 ```
 
@@ -258,12 +258,12 @@ this.redirectToReturnUrl();
 
 2. **访问项目详情页**
    ```
-   https://app.fmode.cn/dev/yss/wxwork/E4KpGvTEto/project/abc123
+   https://app.fmode.cn/dev/yss/wxwork/cDL6R1hgSi/project/abc123
    ```
 
 3. **应该被重定向到激活页面**
    ```
-   https://app.fmode.cn/dev/yss/wxwork/E4KpGvTEto/activation
+   https://app.fmode.cn/dev/yss/wxwork/cDL6R1hgSi/activation
    ```
 
 4. **填写信息并点击"确认身份"**

+ 1 - 1
docs/delivery-upload-and-message-fix.md

@@ -268,7 +268,7 @@ await deliveryMessageService.createTextMessage(
 }
 
 📤 上传尝试 1/3: test1.jpg
-📦 使用存储桶CID: E4KpGvTEto
+📦 使用存储桶CID: cDL6R1hgSi
 ✅ 文件上传成功
 
 ✅ ProjectFile 创建成功: {

+ 3 - 3
docs/designer-wxwork-real-data-implementation.md

@@ -31,7 +31,7 @@ export class Dashboard implements OnInit {
 
   private initAuth(): void {
     this.wxAuth = new WxworkAuth({
-      cid: 'E4KpGvTEto'  // 公司帐套ID
+      cid: 'cDL6R1hgSi'  // 公司帐套ID
     });
   }
 
@@ -68,7 +68,7 @@ export class Dashboard implements OnInit {
 ### 2.1 优化企微身份识别
 
 #### 当前问题
-- ❌ cid 硬编码在代码中(`'E4KpGvTEto'`)
+- ❌ cid 硬编码在代码中(`'cDL6R1hgSi'`)
 - ❌ 未从URL参数获取cid
 - ❌ 未验证用户的"组员"角色
 - ❌ 未获取当前登录的Profile信息
@@ -1141,7 +1141,7 @@ import { FmodeParse } from 'fmode-ng/parse';
 
 async function initDesignerData() {
   const Parse = FmodeParse.with('nova');
-  const cid = 'E4KpGvTEto'; // 公司ID
+  const cid = 'cDL6R1hgSi'; // 公司ID
 
   // 查询所有组员
   const query = new Parse.Query('Profile');

+ 5 - 5
docs/dynamic-data-integration.md

@@ -66,7 +66,7 @@ import { WxworkAuth, FmodeQuery, FmodeObject, FmodeUser } from 'fmode-ng/core';
 
 private initAuth(): void {
   this.wxAuth = new WxworkAuth({
-    cid: 'E4KpGvTEto'  // 公司帐套ID
+    cid: 'cDL6R1hgSi'  // 公司帐套ID
   });
 }
 
@@ -194,7 +194,7 @@ import { NovaStorage, NovaFile } from 'fmode-ng/core';
 
 // 初始化存储服务
 private async initStorage(): Promise<void> {
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   this.storage = await NovaStorage.withCid(cid);
 }
 
@@ -266,7 +266,7 @@ export class MyComponent {
 ```typescript
 // 初始化 NovaStorage
 private async initStorage(): Promise<void> {
-  const cid = localStorage.getItem('company') || this.cid || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || this.cid || 'cDL6R1hgSi';
   this.storage = await NovaStorage.withCid(cid);
 }
 
@@ -379,7 +379,7 @@ export class NewPageComponent {
 
   private initAuth(): void {
     this.wxAuth = new WxworkAuth({
-      cid: 'E4KpGvTEto'
+      cid: 'cDL6R1hgSi'
     });
   }
 
@@ -488,7 +488,7 @@ try {
 
 ## 注意事项
 
-1. **认证配置**: 确保 `cid: 'E4KpGvTEto'` 在 `WxworkSDK.companyMap` 中有对应配置
+1. **认证配置**: 确保 `cid: 'cDL6R1hgSi'` 在 `WxworkSDK.companyMap` 中有对应配置
 2. **数据表名**: 确保后端数据表名与代码中使用的表名一致
 3. **权限设置**: 确保企业微信用户有相应的数据访问权限
 4. **NovaStorage**: 使用 `NovaStorage.withCid(cid)` 自动初始化,无需手动配置 Provider

+ 1 - 1
docs/employee-activation-troubleshooting.md

@@ -246,7 +246,7 @@
 ✅ 获取用户信息成功: {
   name: "徐福静",
   userid: "XuFuJing",
-  cid: "E4KpGvTEto"
+  cid: "cDL6R1hgSi"
 }
 
 🔎 currentProfile 查询结果: {

+ 1 - 1
docs/feature/组长端待办任务区域重构方案.md

@@ -366,7 +366,7 @@ export class Dashboard implements OnInit {
    * 跳转到项目问题详情
    */
   navigateToIssue(task: TodoTaskFromIssue): void {
-    const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+    const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
     // 跳转到项目详情页,并打开问题板块
     this.router.navigate(
       ['/wxwork', cid, 'project', task.projectId, 'order'],

+ 10 - 10
docs/fix/组长端项目路由修复.md

@@ -74,7 +74,7 @@ viewProjectDetails(projectId: string): void {
   }
   
   // 获取公司ID
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   
   // 跳转到组长端项目详情页(包含审批功能)
   this.router.navigate(['/wxwork', cid, 'team-leader', 'project-detail', projectId]);
@@ -89,7 +89,7 @@ viewProjectDetails(projectId: string): void {
   }
   
   // 获取公司ID
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   
   // 跳转到企微认证项目详情页(正确路由)
   this.router.navigate(['/wxwork', cid, 'project', projectId]);
@@ -120,7 +120,7 @@ selectProject(): void {
 ```typescript
 selectProject(): void {
   if (this.selectedProjectId) {
-    const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+    const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
     this.router.navigate(['/wxwork', cid, 'project', this.selectedProjectId]);
   }
 }
@@ -147,7 +147,7 @@ this.router.navigate(['/team-leader/project-detail', projectId], { queryParams:
 ```typescript
 // 无推荐或用户取消,跳转到详细分配页面
 // 跳转到项目详情页
-const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
 this.router.navigate(['/wxwork', cid, 'project', projectId]);
 ```
 
@@ -179,7 +179,7 @@ openWorkloadEstimator(): void {
 ```typescript
 openWorkloadEstimator(): void {
   // 工具迁移至详情页:引导前往当前选中项目详情
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   if (this.selectedProjectId) {
     this.router.navigate(['/wxwork', cid, 'project', this.selectedProjectId]);
   } else {
@@ -211,7 +211,7 @@ viewProjectDetails(projectId: string): void {
 ```typescript
 viewProjectDetails(projectId: string): void {
   // 跳转到企微认证项目详情页(正确路由)
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   this.router.navigate(['/wxwork', cid, 'project', projectId]);
 }
 ```
@@ -242,7 +242,7 @@ navigateToProject(t: Task, ev?: Event): void {
   if (ev) { ev.stopPropagation(); ev.preventDefault?.(); }
   if (!t || !t.projectId) return;
   // 跳转到企微认证项目详情页(正确路由)
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   this.router.navigate(['/wxwork', cid, 'project', t.projectId]);
 }
 ```
@@ -264,7 +264,7 @@ this.router.navigate(['/team-leader/project-detail', projectId]);
 
 **改为** ✅
 ```typescript
-const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
 this.router.navigate(['/wxwork', cid, 'project', projectId]);
 ```
 
@@ -325,7 +325,7 @@ this.router.navigate(['/wxwork', cid, 'project', projectId]);
 
 所有跳转都应该:
 - ✅ 成功跳转到项目详情页
-- ✅ URL 格式正确:`http://localhost:4200/wxwork/E4KpGvTEto/project/:projectId`
+- ✅ URL 格式正确:`http://localhost:4200/wxwork/cDL6R1hgSi/project/:projectId`
 - ✅ 页面正常显示项目信息
 - ✅ 无 404 或路由错误
 - ✅ 包含企微认证保护
@@ -346,7 +346,7 @@ this.router.navigate(['/wxwork', cid, 'project', projectId]);
 
 ### 正确路由 ✅
 ```
-/wxwork/E4KpGvTEto/project/B2xcbHfFR8
+/wxwork/cDL6R1hgSi/project/B2xcbHfFR8
 ```
 **优势**:
 - ✅ 路由已定义在 `app.routes.ts`

+ 3 - 3
docs/image-storage-and-classification-fix.md

@@ -91,7 +91,7 @@ const storage = await NovaStorage.withCid(cid);
 let cid = localStorage.getItem('company');
 if (!cid) {
   console.warn('⚠️ 未找到公司ID,使用默认存储桶');
-  cid = 'E4KpGvTEto'; // 默认公司ID
+  cid = 'cDL6R1hgSi'; // 默认公司ID
 }
 console.log(`📦 使用存储桶CID: ${cid}`);
 const storage = await NovaStorage.withCid(cid);
@@ -381,7 +381,7 @@ console.log('使用的存储桶CID:', cid);
 ```javascript
 // 检查fmode-ng版本
 import { NovaStorage } from 'fmode-ng/core';
-const storage = await NovaStorage.withCid('E4KpGvTEto');
+const storage = await NovaStorage.withCid('cDL6R1hgSi');
 console.log('存储桶配置:', storage);
 ```
 
@@ -434,7 +434,7 @@ files.forEach(f => {
 
 1. **project-file.service.ts**
    - 添加存储桶fallback
-   - 使用默认CID 'E4KpGvTEto'
+   - 使用默认CID 'cDL6R1hgSi'
 
 2. **stage-delivery.component.ts**
    - confirmDragUpload:保存AI分析结果

+ 8 - 8
docs/implementation-summary-wxwork-project.md

@@ -242,7 +242,7 @@ await this.wxwork.openChat(chatId);
 ### 2. **多租户数据隔离**
 - 所有数据表包含 `company: Pointer<Company>` 字段
 - 查询时自动过滤当前企业数据
-- 基于 `localStorage.setItem("company", "E4KpGvTEto")` 实现
+- 基于 `localStorage.setItem("company", "cDL6R1hgSi")` 实现
 
 ### 3. **灵活的数据扩展**
 - 使用 `data: Object` 字段存储动态数据
@@ -366,12 +366,12 @@ this.isTeamLeader = role === '组长';
 ```
 
 **访问示例**:
-- 项目加载: `/wxwork/E4KpGvTEto/project-loader`
-- 客户画像: `/wxwork/E4KpGvTEto/contact/abc123`
-- 订单分配: `/wxwork/E4KpGvTEto/project/xyz789/order`
-- 确认需求: `/wxwork/E4KpGvTEto/project/xyz789/requirements`
-- 交付执行: `/wxwork/E4KpGvTEto/project/xyz789/delivery`
-- 售后归档: `/wxwork/E4KpGvTEto/project/xyz789/aftercare`
+- 项目加载: `/wxwork/cDL6R1hgSi/project-loader`
+- 客户画像: `/wxwork/cDL6R1hgSi/contact/abc123`
+- 订单分配: `/wxwork/cDL6R1hgSi/project/xyz789/order`
+- 确认需求: `/wxwork/cDL6R1hgSi/project/xyz789/requirements`
+- 交付执行: `/wxwork/cDL6R1hgSi/project/xyz789/delivery`
+- 售后归档: `/wxwork/cDL6R1hgSi/project/xyz789/aftercare`
 
 ---
 
@@ -555,7 +555,7 @@ Company (企业)
 ### 环境变量配置
 ```typescript
 // src/app/app.config.ts
-localStorage.setItem("company", "E4KpGvTEto"); // 当前企业ID
+localStorage.setItem("company", "cDL6R1hgSi"); // 当前企业ID
 ```
 
 ### Parse Server配置

+ 3 - 3
docs/project-loader-fix-summary.md

@@ -378,7 +378,7 @@ chunk-NWSP7TJL.js | project-loader-component | 9.16 MB   | 1.86 MB
 
 在浏览器控制台查看 wxdebug 输出:
 ```
-1. SDK初始化完成 { cid: "E4KpGvTEto", appId: "crm" }
+1. SDK初始化完成 { cid: "cDL6R1hgSi", appId: "crm" }
 2. 获取当前用户成功 { id: "xxx", name: "xxx", ... }
 3. getCurrentChat返回 { type: "chatId", group: {...} }
 4. 检测到群聊场景 { chatId: "xxx", ... }
@@ -389,12 +389,12 @@ chunk-NWSP7TJL.js | project-loader-component | 9.16 MB   | 1.86 MB
 
 **群聊 → 项目详情:**
 ```
-/wxwork/E4KpGvTEto/project/PROJECT_ID?groupId=GROUP_ID&profileId=USER_ID
+/wxwork/cDL6R1hgSi/project/PROJECT_ID?groupId=GROUP_ID&profileId=USER_ID
 ```
 
 **联系人 → 客户画像:**
 ```
-/wxwork/E4KpGvTEto/contact/CONTACT_ID?profileId=USER_ID
+/wxwork/cDL6R1hgSi/contact/CONTACT_ID?profileId=USER_ID
 ```
 
 ---

+ 4 - 4
docs/project.md

@@ -29,7 +29,7 @@
 #### 企微端进入
 
 ```
-/wxwork/E4KpGvTEto/contact/placeholder?externalUserId=wmKkHgAAF1W7xjKUCcPVdG92Mxxxxxxx
+/wxwork/cDL6R1hgSi/contact/placeholder?externalUserId=wmKkHgAAF1W7xjKUCcPVdG92Mxxxxxxx
 ```
 
 **参数说明**:
@@ -50,7 +50,7 @@
 #### 网页端进入
 
 ```
-/wxwork/E4KpGvTEto/contact/abc123xyz?profileId=prof001
+/wxwork/cDL6R1hgSi/contact/abc123xyz?profileId=prof001
 ```
 
 **参数说明**:
@@ -75,7 +75,7 @@
 #### 企微端进入
 
 ```
-/wxwork/E4KpGvTEto/project/placeholder?chatId=wrOtiJDAAAcwMTB7YmDxxxxx
+/wxwork/cDL6R1hgSi/project/placeholder?chatId=wrOtiJDAAAcwMTB7YmDxxxxx
 ```
 
 **参数说明**:
@@ -98,7 +98,7 @@
 #### 网页端进入
 
 ```
-/wxwork/E4KpGvTEto/project/proj001?profileId=prof001
+/wxwork/cDL6R1hgSi/project/proj001?profileId=prof001
 ```
 
 **参数说明**:

+ 3 - 3
docs/route-lazy-loading-summary.md

@@ -177,7 +177,7 @@ if (!isWxwork) {
 ### 2. OAuth回调处理
 企微OAuth授权会重定向回当前URL并附带`code`参数:
 ```
-https://your-domain.com/wxwork/E4KpGvTEto/project/xxx?code=XXXXX
+https://your-domain.com/wxwork/cDL6R1hgSi/project/xxx?code=XXXXX
 ```
 
 Guard会自动检测并处理这个流程。
@@ -186,10 +186,10 @@ Guard会自动检测并处理这个流程。
 确保企微应用配置中的账套ID与路由参数一致:
 ```typescript
 // 映三色账套ID
-const cid = 'E4KpGvTEto';
+const cid = 'cDL6R1hgSi';
 
 // 路由
-/wxwork/E4KpGvTEto/project/xxx
+/wxwork/cDL6R1hgSi/project/xxx
 ```
 
 ### 4. 依赖更新

+ 2 - 2
docs/service-integration-complete.md

@@ -202,7 +202,7 @@ const subscription = this.aiService.streamCompletion(
 ```typescript
 // 映三色配置
 private companyMap: any = {
-  'E4KpGvTEto': { // 映三色账套ID
+  'cDL6R1hgSi': { // 映三色账套ID
     corpResId: 'vsVIWbd1i9' // 企业号资源ID
   }
 };
@@ -623,7 +623,7 @@ ww.openEnterpriseChat({chatId: ...})
 ### 4. 环境变量
 ```typescript
 // src/app/app.config.ts
-localStorage.setItem("company", "E4KpGvTEto"); // 映三色账套ID
+localStorage.setItem("company", "cDL6R1hgSi"); // 映三色账套ID
 ```
 
 ---

+ 4 - 4
docs/task/2025101701-admin-completed.md

@@ -1,7 +1,7 @@
 # 任务完成报告:管理系统数据对接
 
 ## 任务概述
-完成./src/app/pages/admin/所有组件的数据增删查改对接,所有数据指向 E4KpGvTEto 映三色帐套。
+完成./src/app/pages/admin/所有组件的数据增删查改对接,所有数据指向 cDL6R1hgSi 映三色帐套。
 
 ## 已完成的工作
 
@@ -112,7 +112,7 @@
 - ✅ Department → Leader (Pointer<Profile>)
 - ✅ Profile → Department (Pointer<Department>)
 - ✅ GroupChat → Project (Pointer<Project>)
-- ✅ 所有表 → Company (Pointer固定为E4KpGvTEto)
+- ✅ 所有表 → Company (Pointer固定为cDL6R1hgSi)
 
 ### 特殊处理
 1. **企微同步数据**(Profile, GroupChat)
@@ -205,7 +205,7 @@ src/app/
    - 其他页面直接import使用
 
 2. **公司指针**
-   - 所有数据操作都自动关联到E4KpGvTEto
+   - 所有数据操作都自动关联到cDL6R1hgSi
    - 通过AdminDataService.getCompanyPointer()获取
 
 3. **企微同步字段**
@@ -228,7 +228,7 @@ src/app/
 
 ## 总结
 
-所有admin管理页面已完成数据对接,严格按照Parse数据规范实现,所有数据指向映三色帐套(E4KpGvTEto)。核心功能包括:
+所有admin管理页面已完成数据对接,严格按照Parse数据规范实现,所有数据指向映三色帐套(cDL6R1hgSi)。核心功能包括:
 
 - ✅ 统一的数据服务层
 - ✅ 完整的增删查改操作

+ 1 - 1
docs/task/2025101701-admin.md

@@ -1,5 +1,5 @@
 # 任务:管理系统数据对接
-所有数据 .company 指向 E4KpGvTEto 映三色帐套
+所有数据 .company 指向 cDL6R1hgSi 映三色帐套
 
 请您查看./rules/schemas.md数据结构,完成./src/app/pages/admin/所有组件数据的増删查改
 

+ 1 - 1
docs/task/2025102217-wxwork-sdk-init-fix.md

@@ -289,7 +289,7 @@ try {
 
 4. **设置cid后重新测试**
    ```javascript
-   localStorage.setItem("company", "E4KpGvTEto");  // 使用真实的公司ID
+   localStorage.setItem("company", "cDL6R1hgSi");  // 使用真实的公司ID
    ```
    
 5. **刷新页面**

+ 10 - 10
docs/task/2025102219-clean-project-detail-navigation.md

@@ -110,7 +110,7 @@ viewProjectDetails(projectId: string): void {
   }
   
   // 获取公司ID
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   
   // 跳转到wxwork路由的项目详情页(纯净页面,无管理端侧边栏)
   // 路由格式:/wxwork/:cid/project/:projectId/order
@@ -122,9 +122,9 @@ viewProjectDetails(projectId: string): void {
 
 **关键点**:
 1. **获取cid**: 从 `localStorage.getItem('company')` 获取
-2. **默认值**: 如果没有,使用默认的 `E4KpGvTEto`
+2. **默认值**: 如果没有,使用默认的 `cDL6R1hgSi`
 3. **路由参数**: `['/wxwork', cid, 'project', projectId, 'order']`
-4. **URL示例**: `/wxwork/E4KpGvTEto/project/iKvYck89zE/order`
+4. **URL示例**: `/wxwork/cDL6R1hgSi/project/iKvYck89zE/order`
 
 ### 2. HTML模板修改
 
@@ -209,7 +209,7 @@ viewProjectDetails(projectId: string): void {
    ```javascript
    // 在浏览器控制台执行
    // 方式1: 使用真实的公司ID
-   localStorage.setItem("company", "E4KpGvTEto");
+   localStorage.setItem("company", "cDL6R1hgSi");
    
    // 方式2: 清除cid,测试默认值
    localStorage.removeItem("company");
@@ -235,7 +235,7 @@ viewProjectDetails(projectId: string): void {
    
    **预期URL**:
    ```
-   http://localhost:4200/wxwork/E4KpGvTEto/project/iKvYck89zE/order
+   http://localhost:4200/wxwork/cDL6R1hgSi/project/iKvYck89zE/order
    ```
    
    **预期页面表现**:
@@ -250,7 +250,7 @@ viewProjectDetails(projectId: string): void {
 | 测试项 | 操作 | 预期结果 |
 |--------|------|---------|
 | 有cid | localStorage.setItem("company", "abc123") | 跳转到 `/wxwork/abc123/project/...` |
-| 无cid | localStorage.removeItem("company") | 跳转到 `/wxwork/E4KpGvTEto/project/...` (默认值) |
+| 无cid | localStorage.removeItem("company") | 跳转到 `/wxwork/cDL6R1hgSi/project/...` (默认值) |
 | 点击标题 | 点击项目名称 | 跳转到纯净项目详情页 |
 | 点击按钮 | 点击"查看详情" | 跳转到纯净项目详情页 |
 | 点击卡片 | 点击卡片空白处 | 跳转到纯净项目详情页 |
@@ -277,7 +277,7 @@ viewProjectDetails(projectId: string): void {
 
 ```
 格式: /wxwork/:cid/project/:projectId/order
-示例: /wxwork/E4KpGvTEto/project/iKvYck89zE/order
+示例: /wxwork/cDL6R1hgSi/project/iKvYck89zE/order
 
 访问者: 组长、设计师、客服
 特点: 无任何布局,全屏显示
@@ -322,7 +322,7 @@ viewProjectDetails(projectId: string): void {
 ### cid (Company ID) 的作用
 
 ```typescript
-const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
 ```
 
 **用途**:
@@ -332,7 +332,7 @@ const cid = localStorage.getItem('company') || 'E4KpGvTEto';
 
 **存储位置**: `localStorage['company']`
 
-**默认值**: `E4KpGvTEto`
+**默认值**: `cDL6R1hgSi`
 
 ### 路由参数说明
 
@@ -343,7 +343,7 @@ this.router.navigate(['/wxwork', cid, 'project', projectId, 'order']);
 | 参数位置 | 参数名 | 说明 | 示例 |
 |---------|--------|------|------|
 | 参数1 | 'wxwork' | 路由前缀 | 固定值 |
-| 参数2 | cid | 公司ID | 'E4KpGvTEto' |
+| 参数2 | cid | 公司ID | 'cDL6R1hgSi' |
 | 参数3 | 'project' | 项目路由 | 固定值 |
 | 参数4 | projectId | 项目ID | 'iKvYck89zE' |
 | 参数5 | 'order' | 当前阶段 | 'order'/'requirements'/'delivery'/'aftercare' |

+ 2 - 2
docs/task/2025102221-console-migration-script.md

@@ -142,7 +142,7 @@
 
 ```
 🚀 开始批量更新项目负责人...
-✅ 公司ID: E4KpGvTEto
+✅ 公司ID: cDL6R1hgSi
 📊 找到 11 个项目
 ⏭️  [1/11] "未命名案例组三期项目" 已有负责人: 汪奥
 ✅ [2/11] "张家界凤凰城三期项目" 已设置负责人: 汪奥
@@ -271,7 +271,7 @@ const { FmodeParse } = await import('fmode-ng/parse');
 **解决方法**:
 ```javascript
 // 手动设置公司ID
-localStorage.setItem('company', 'E4KpGvTEto'); // 替换为你的公司ID
+localStorage.setItem('company', 'cDL6R1hgSi'); // 替换为你的公司ID
 ```
 
 ### 错误3: 权限错误

+ 3 - 3
docs/task/2025102221-simple-solution.md

@@ -273,7 +273,7 @@ toJSON(project: FmodeObject): any {
   objectId: "APwk78jnrh",
   title: "张家界凤凰城三期项目",
   department: Pointer<Department> { objectId: "xxx" },  // ✅ 只需要这个
-  company: "E4KpGvTEto",
+  company: "cDL6R1hgSi",
   status: "进行中",
   // 不需要 assignee 字段
 }
@@ -287,7 +287,7 @@ toJSON(project: FmodeObject): any {
   name: "汪奥组",
   type: "project",
   leader: Pointer<Profile> { objectId: "yyy" },  // ✅ 组长信息存在这里
-  company: "E4KpGvTEto"
+  company: "cDL6R1hgSi"
 }
 ```
 
@@ -298,7 +298,7 @@ toJSON(project: FmodeObject): any {
   objectId: "yyy",
   name: "汪奥",
   roleName: "组长",
-  company: "E4KpGvTEto"
+  company: "cDL6R1hgSi"
 }
 ```
 

+ 2 - 2
docs/task/20251024-admin-project-data-fix.md

@@ -131,7 +131,7 @@ if (json.contact && typeof json.contact === 'object') {
 
 ### AdminDataService
 - 提供统一的Parse数据访问接口
-- 自动添加公司过滤(E4KpGvTEto
+- 自动添加公司过滤(cDL6R1hgSi
 - 自动添加软删除过滤
 - 位置: `src/app/pages/admin/services/admin-data.service.ts`
 
@@ -153,7 +153,7 @@ if (json.contact && typeof json.contact === 'object') {
    - 减少数据库查询次数
 
 3. **公司隔离**
-   - 所有查询自动过滤到映三色帐套(E4KpGvTEto
+   - 所有查询自动过滤到映三色帐套(cDL6R1hgSi
    - 确保数据安全和隔离
 
 4. **软删除**

+ 4 - 4
docs/task/20251024-customer-service-dashboard-integration-summary.md

@@ -72,7 +72,7 @@ stats = {
 async initializeUserAndCompany(): Promise<void>
 ```
 - 获取当前用户Profile
-- 加载公司信息(映三色帐套 E4KpGvTEto
+- 加载公司信息(映三色帐套 cDL6R1hgSi
 
 **b) 查询辅助方法**
 ```typescript
@@ -225,7 +225,7 @@ HTML模板中已使用注释隐藏以下模块:
 ### 使用的Parse Server数据表
 
 1. **Company** - 企业表
-   - 帐套ID: `E4KpGvTEto` (映三色)
+   - 帐套ID: `cDL6R1hgSi` (映三色)
    - 用于数据隔离
 
 2. **Project** - 项目表
@@ -258,7 +258,7 @@ HTML模板中已使用注释隐藏以下模块:
 ### 1. 公司级数据隔离
 所有查询自动添加公司过滤:
 ```typescript
-query.equalTo('company', { __type: 'Pointer', className: 'Company', objectId: 'E4KpGvTEto' });
+query.equalTo('company', { __type: 'Pointer', className: 'Company', objectId: 'cDL6R1hgSi' });
 query.notEqualTo('isDeleted', true);
 ```
 
@@ -360,7 +360,7 @@ try {
 ## 注意事项
 
 1. ⚠️ **所有查询必须过滤 `isDeleted=false`**
-2. ⚠️ **所有查询必须过滤 `company=E4KpGvTEto`**
+2. ⚠️ **所有查询必须过滤 `company=cDL6R1hgSi`**
 3. ⚠️ **使用 `include` 减少查询次数**
 4. ⚠️ **使用 `count()` 而不是 `find().length` 获取数量**
 5. ⚠️ **日期查询注意时区问题**

+ 1 - 1
docs/task/20251024-customer-service-dashboard-real-data-beautification.md

@@ -187,7 +187,7 @@ transition: all 0.3s cubic-bezier(0.4, 0, 0.2, 1);
 2. initializeUserAndCompany()
    - 获取当前用户Profile
-   - 获取公司信息(映三色: E4KpGvTEto)
+   - 获取公司信息(映三色: cDL6R1hgSi)
 3. loadDashboardData()
    - loadConsultationStats() // 统计数据

+ 1 - 1
docs/task/20251024-customer-service-dashboard-real-data.md

@@ -213,7 +213,7 @@ private getCompanyPointer(): any {
    - `isDeleted`: 是否已删除
 
 4. **Company** - 公司表
-   - `objectId`: 公司ID(固定为 'E4KpGvTEto' - 映三色帐套)
+   - `objectId`: 公司ID(固定为 'cDL6R1hgSi' - 映三色帐套)
 
 ---
 

+ 5 - 5
docs/task/20251025-all-routes-auth-bypass.md

@@ -144,11 +144,11 @@
 - 项目问卷: http://localhost:4200/wxwork/:cid/survey/project/:projectId
 - 项目加载: http://localhost:4200/wxwork/:cid/project-loader
 
-**示例**(假设公司ID为E4KpGvTEto):
-- http://localhost:4200/wxwork/E4KpGvTEto/project/abc123/order
-- http://localhost:4200/wxwork/E4KpGvTEto/project/abc123/requirements
-- http://localhost:4200/wxwork/E4KpGvTEto/project/abc123/delivery
-- http://localhost:4200/wxwork/E4KpGvTEto/project/abc123/aftercare
+**示例**(假设公司ID为cDL6R1hgSi):
+- http://localhost:4200/wxwork/cDL6R1hgSi/project/abc123/order
+- http://localhost:4200/wxwork/cDL6R1hgSi/project/abc123/requirements
+- http://localhost:4200/wxwork/cDL6R1hgSi/project/abc123/delivery
+- http://localhost:4200/wxwork/cDL6R1hgSi/project/abc123/aftercare
 
 ## 💡 使用说明
 

+ 11 - 11
docs/task/20251025-project-list-navigation-unified.md

@@ -84,10 +84,10 @@ this.router.navigate(['/wxwork', cid, 'project', project.id, stagePath]);
 
 #### 示例路由
 ```
-/wxwork/E4KpGvTEto/project/abc123/order
-/wxwork/E4KpGvTEto/project/abc123/requirements
-/wxwork/E4KpGvTEto/project/abc123/delivery
-/wxwork/E4KpGvTEto/project/abc123/aftercare
+/wxwork/cDL6R1hgSi/project/abc123/order
+/wxwork/cDL6R1hgSi/project/abc123/requirements
+/wxwork/cDL6R1hgSi/project/abc123/delivery
+/wxwork/cDL6R1hgSi/project/abc123/aftercare
 ```
 
 ## 📝 修改详情
@@ -148,7 +148,7 @@ navigateToProject(project: ProjectListItem, columnId: 'order' | 'requirements' |
 ```typescript
 // yss-project/src/app/pages/team-leader/dashboard/dashboard.ts
 viewProjectDetails(projectId: string): void {
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   this.router.navigate(['/wxwork', cid, 'project', projectId, 'order']);
 }
 ```
@@ -220,25 +220,25 @@ navigateToProject(project: ProjectListItem, columnId: string) {
 
 1. **点击"订单分配"列的项目**
    ```
-   跳转到: /wxwork/E4KpGvTEto/project/abc123/order
+   跳转到: /wxwork/cDL6R1hgSi/project/abc123/order
    显示: 订单分配阶段的内容
    ```
 
 2. **点击"确认需求"列的项目**
    ```
-   跳转到: /wxwork/E4KpGvTEto/project/abc123/requirements
+   跳转到: /wxwork/cDL6R1hgSi/project/abc123/requirements
    显示: 确认需求阶段的内容
    ```
 
 3. **点击"交付执行"列的项目**
    ```
-   跳转到: /wxwork/E4KpGvTEto/project/abc123/delivery
+   跳转到: /wxwork/cDL6R1hgSi/project/abc123/delivery
    显示: 交付执行阶段的内容
    ```
 
 4. **点击"售后"列的项目**
    ```
-   跳转到: /wxwork/E4KpGvTEto/project/abc123/aftercare
+   跳转到: /wxwork/cDL6R1hgSi/project/abc123/aftercare
    显示: 售后归档阶段的内容
    ```
 
@@ -279,7 +279,7 @@ localStorage.setItem('company', 'your-company-id');
 console.log(window.location.pathname);
 
 // 应该显示类似:
-// /wxwork/E4KpGvTEto/project/abc123/order
+// /wxwork/cDL6R1hgSi/project/abc123/order
 ```
 
 ### 2. 检查公司ID
@@ -292,7 +292,7 @@ console.log('公司ID:', localStorage.getItem('company'));
 
 直接在浏览器地址栏输入:
 ```
-http://localhost:4200/wxwork/E4KpGvTEto/project/your-project-id/order
+http://localhost:4200/wxwork/cDL6R1hgSi/project/your-project-id/order
 ```
 
 ## 📚 相关文档

+ 2 - 2
docs/task/team-leader-order-approval-implementation.md

@@ -1523,9 +1523,9 @@ export class NotificationService {
 ---
 
 **测试验证步骤:**
-1. 访问组长工作台:`http://localhost:4200/wxwork/E4KpGvTEto/team-leader/dashboard`
+1. 访问组长工作台:`http://localhost:4200/wxwork/cDL6R1hgSi/team-leader/dashboard`
 2. 点击待审批项目(红桥新村)
-3. 验证URL:应为 `http://localhost:4200/wxwork/E4KpGvTEto/team-leader/project-detail/B2wtFHIF6k`
+3. 验证URL:应为 `http://localhost:4200/wxwork/cDL6R1hgSi/team-leader/project-detail/B2wtFHIF6k`
 4. 验证页面显示:
    - ✅ 四阶段导航显示
    - ✅ 审批面板显示(橙色横幅)

+ 2 - 2
docs/task/设计师工作台-改造完成说明.md

@@ -208,7 +208,7 @@ npm start
 
 ### 步骤 2: 访问设计师工作台
 ```
-http://localhost:4200/wxwork/E4KpGvTEto/designer/dashboard
+http://localhost:4200/wxwork/cDL6R1hgSi/designer/dashboard
 ```
 
 ### 步骤 3: 检查顶部导航栏
@@ -221,7 +221,7 @@ http://localhost:4200/wxwork/E4KpGvTEto/designer/dashboard
 打开浏览器开发者工具(F12),查看控制台:
 
 ```
-✅ 设计师端企微认证初始化成功,CID: E4KpGvTEto
+✅ 设计师端企微认证初始化成功,CID: cDL6R1hgSi
 ✅ 设计师登录成功: xxx
 ✅ Profile ID: xxx
 ✅ 用户信息映射完成: {userid: 'xxx', name: '王刚', avatar: 'xxx', roleName: '组员'}

+ 1 - 1
docs/task/设计师端导航条修复-最终版.md

@@ -262,7 +262,7 @@ const name = profile.get("name")           // 优先
 
 ### 2. 确保 cid 正确
 ```typescript
-const cid = localStorage.getItem("company") || 'E4KpGvTEto';
+const cid = localStorage.getItem("company") || 'cDL6R1hgSi';
 ```
 
 ### 3. currentProfile() 与 authenticateAndLogin() 的区别

+ 2 - 2
docs/task/设计师端项目加载-修复完成.md

@@ -11,7 +11,7 @@
 根据您提供的控制台日志:
 
 - **Profile ID**: `m9xAo3sPLu`
-- **公司 ID**: `E4KpGvTEto`
+- **公司 ID**: `cDL6R1hgSi`
 - **ProjectTeam 查询结果**: **2 条记录** ✅
 
 ### 📋 找到的项目
@@ -94,7 +94,7 @@ console.log(`📝 创建项目级任务: ${projectName}`);
 #### 成功情况(预期)✅
 ```
 🔍 开始查询设计师任务,Profile ID: m9xAo3sPLu
-📋 当前公司 ID: E4KpGvTEto
+📋 当前公司 ID: cDL6R1hgSi
 🔍 查询 ProjectTeam 表...
 ✅ ProjectTeam 查询结果: 2 条记录
 📋 ProjectTeam 记录详情:

+ 2 - 2
docs/task/设计师端项目加载-关键修复.md

@@ -9,7 +9,7 @@
 
 ### ✅ 成功的部分
 - **Profile ID**: `m9xAo3sPLu` ✅
-- **公司 ID**: `E4KpGvTEto` ✅
+- **公司 ID**: `cDL6R1hgSi` ✅
 - **ProjectTeam 查询**: **2 条记录** ✅
   - 项目1: `B2xcbHfFR8` - 虹标资计
   - 项目2: `cycbba1h2` - 澳兰德9.11
@@ -189,7 +189,7 @@ if (products.length === 0) {
 
 ### 基本信息(应该和之前一样)✅
 - [ ] `✅ Profile ID: m9xAo3sPLu`
-- [ ] `📋 当前公司 ID: E4KpGvTEto`
+- [ ] `📋 当前公司 ID: cDL6R1hgSi`
 - [ ] `✅ ProjectTeam 查询结果: 2 条记录`
 
 ### 新的处理日志(重点)📝

+ 3 - 3
docs/task/设计师端项目加载-错误日志增强.md

@@ -9,7 +9,7 @@
 
 ### ✅ 成功的部分
 - Profile ID: `m9xAo3sPLu` ✅
-- 公司 ID: `E4KpGvTEto` ✅
+- 公司 ID: `cDL6R1hgSi` ✅
 - ProjectTeam 查询: **找到 2 条记录** ✅
   - 项目1: `B2xcbHfFR8` - 卓森岸畔
   - 项目2: `cycbba1h2` - 澳兰德9.11
@@ -61,7 +61,7 @@ if (error.stack) console.error('❌ 错误堆栈:', error.stack);
 #### A. 基本信息(应该和之前一样)
 ```
 ✅ Profile ID: m9xAo3sPLu
-📋 当前公司 ID: E4KpGvTEto
+📋 当前公司 ID: cDL6R1hgSi
 ✅ ProjectTeam 查询结果: 2 条记录
 ```
 
@@ -152,7 +152,7 @@ if (error.stack) console.error('❌ 错误堆栈:', error.stack);
 
 ### 必须有的日志 ✅
 - [ ] `✅ Profile ID: m9xAo3sPLu`
-- [ ] `📋 当前公司 ID: E4KpGvTEto`
+- [ ] `📋 当前公司 ID: cDL6R1hgSi`
 - [ ] `✅ ProjectTeam 查询结果: 2 条记录`
 - [ ] `📋 ProjectTeam 记录详情:` (包含 2 个项目)
 

+ 2 - 2
docs/task/设计师端项目加载问题诊断.md

@@ -80,7 +80,7 @@ console.log('📋 [降级方案] 项目详情:');
 📋 当前 Profile ID: m9xAo3sPLu
 📋 当前 Profile 对象: Parse.Object {...}
 🔍 开始查询设计师任务,Profile ID: m9xAo3sPLu
-📋 当前公司 ID: E4KpGvTEto
+📋 当前公司 ID: cDL6R1hgSi
 🔍 查询 ProjectTeam 表...
 ✅ ProjectTeam 查询结果: 2 条记录  ← 如果是 0,说明 ProjectTeam 表没有数据
 📋 ProjectTeam 记录详情:
@@ -222,7 +222,7 @@ await teamRecord.save();
 | 字段 | 类型 | 说明 | 示例 |
 |------|------|------|------|
 | `assignee` | Pointer | 负责设计师(Profile) | Profile(m9xAo3sPLu) |
-| `company` | String | 公司 ID | "E4KpGvTEto" |
+| `company` | String | 公司 ID | "cDL6R1hgSi" |
 | `status` | String | 项目状态 | "进行中" |
 | `currentStage` | String | 当前阶段 | "建模阶段" |
 

+ 4 - 4
docs/task/设计师端项目路由修复.md

@@ -140,11 +140,11 @@ public cid: string = ''; // 公司ID,用于路由跳转
 1. 点击任意项目的 **"查看详情"** 或 **"立即处理"** 按钮
 2. 检查浏览器地址栏是否变为:
    ```
-   http://localhost:4200/wxwork/E4KpGvTEto/project/B2xcbHfFR8
+   http://localhost:4200/wxwork/cDL6R1hgSi/project/B2xcbHfFR8
    ```
    ```
-   http://localhost:4200/wxwork/E4KpGvTEto/project/cycbba1h2
+   http://localhost:4200/wxwork/cDL6R1hgSi/project/cycbba1h2
    ```
 
 #### 列表视图测试
@@ -170,7 +170,7 @@ public cid: string = ''; // 公司ID,用于路由跳转
 3. 点击"查看详情"
 
 预期结果:
-✅ 跳转到: /wxwork/E4KpGvTEto/project/B2xcbHfFR8
+✅ 跳转到: /wxwork/cDL6R1hgSi/project/B2xcbHfFR8
 ✅ 显示真实项目详情页
 ✅ 页面功能正常
 ✅ 有企微认证的用户信息
@@ -269,7 +269,7 @@ public cid: string = ''; // 公司ID,用于路由跳转
 
 1. **刷新页面**(Ctrl+Shift+R)
 2. **点击任意项目的"查看详情"或"详情"按钮**
-3. **检查地址栏是否变为**: `/wxwork/E4KpGvTEto/project/:projectId`
+3. **检查地址栏是否变为**: `/wxwork/cDL6R1hgSi/project/:projectId`
 4. **验证项目详情页是否正常显示**
 
 如果有任何问题,请告诉我!📸

+ 1 - 1
docs/task/问题修复记录-2025-11-02.md

@@ -117,7 +117,7 @@ catch (error: any) {
 打开浏览器开发者工具(F12),查找以下日志:
 
 ```
-✅ 设计师端企微认证初始化成功,CID: E4KpGvTEto
+✅ 设计师端企微认证初始化成功,CID: cDL6R1hgSi
 ✅ 设计师登录成功: xxx
 ✅ Profile ID: m9xAo3sPLu
 📋 完整 Profile 对象: Parse.Object {_objCount: ...}

+ 1 - 1
docs/upload-631-error-final-fix.md

@@ -215,7 +215,7 @@ const id = projectFileRecord.id;
 
 ```
 📤 上传尝试 1/3: test.jpg
-📦 使用存储桶CID: E4KpGvTEto
+📦 使用存储桶CID: cDL6R1hgSi
 📤 开始上传文件: test.jpg
 ✅ 文件上传成功: test.jpg
 ✅ [拖拽上传] 文件上传并记录创建成功: test.jpg

+ 6 - 6
docs/wxwork-appid-fix.md

@@ -8,7 +8,7 @@
 ```
 ✅ [sendToWxwork] SDK初始化完成
 📧 准备发送消息到企业微信...
-  CID: E4KpGvTEto
+  CID: cDL6R1hgSi
   AppID: project  ← 🔥 关键:这里是project而不是crm
   文本内容: 老师我这里硬装模型做好了...
 🔍 [sendChatMessage] ========== 开始发送消息 ==========
@@ -25,14 +25,14 @@
 
 **当前URL**:
 ```
-https://app.fmode.cn/wxwork/E4KpGvTEto/project/project-detail/iKvYck89zE
+https://app.fmode.cn/wxwork/cDL6R1hgSi/project/project-detail/iKvYck89zE
                            ↑           ↑       ↑
                           CID       AppID   路由路径
 ```
 
 **代码解析逻辑** (`delivery-message.service.ts` line 206-207):
 ```typescript
-const cid = urlParts[wxworkIndex + 1];     // E4KpGvTEto
+const cid = urlParts[wxworkIndex + 1];     // cDL6R1hgSi
 const appId = urlParts[wxworkIndex + 2];   // project ← 🔥 问题在这
 ```
 
@@ -94,7 +94,7 @@ private suiteMap: any = {
 ```
 ✅ [sendToWxwork] SDK初始化完成
 📧 准备发送消息到企业微信...
-  CID: E4KpGvTEto
+  CID: cDL6R1hgSi
   AppID: project
   文本内容: 老师我这里硬装模型做好了...
 🔍 [sendChatMessage] ========== 开始发送消息 ==========
@@ -157,8 +157,8 @@ ng build yss-project --base-href=/dev/yss/
 ### 可能的原因:
 
 1. **URL路径不同**:
-   - 需求阶段可能从 `/wxwork/E4KpGvTEto/crm/...` 访问
-   - 交付阶段从 `/wxwork/E4KpGvTEto/project/...` 访问
+   - 需求阶段可能从 `/wxwork/cDL6R1hgSi/crm/...` 访问
+   - 交付阶段从 `/wxwork/cDL6R1hgSi/project/...` 访问
 
 2. **使用不同的SDK方法**:
    - 需求阶段可能没有直接使用 `WxworkSDKService`

+ 2 - 2
docs/wxwork-message-sending-fix-summary.md

@@ -205,7 +205,7 @@ ng build yss-project --base-href=/dev/yss/
 📸 [发送消息] 图片数量: 3
 🏷️ [发送消息] 阶段: white_model
 📧 准备发送消息到企业微信...
-  CID: E4KpGvTEto
+  CID: cDL6R1hgSi
 ❌ 消息发送失败: {errmsg: 'fail_no permission', ...}
 ❌ 发送消息到企业微信失败: ...
 ❌ [发送消息] 发送失败: ...
@@ -229,7 +229,7 @@ ng build yss-project --base-href=/dev/yss/
 📸 [发送消息] 图片数量: 3
 🏷️ [发送消息] 阶段: white_model
 📧 准备发送消息到企业微信...
-  CID: E4KpGvTEto
+  CID: cDL6R1hgSi
   文本: 老师我这里硬装模型做好了...
   图片数量: 3
 ✅ 文本消息已发送

+ 4 - 4
docs/wxwork-send-survey-link-example.md

@@ -145,7 +145,7 @@ async sendSurveyLinkToChat(): Promise<void> {
         link: surveyUrl,
         title: '📋 项目需求调查问卷',
         desc: '请填写项目需求,我们会根据您的需求进行设计。点击填写问卷 →',
-        imgUrl: 'https://file-cloud.fmode.cn/storage/company/E4KpGvTEto/assets/survey-cover.jpg'
+        imgUrl: 'https://file-cloud.fmode.cn/storage/company/cDL6R1hgSi/assets/survey-cover.jpg'
       }
     });
     
@@ -290,7 +290,7 @@ https://app.fmode.cn/dev/yss/#/wxwork/...
 ### 4. 检查控制台日志
 ```
 📤 准备发送问卷链接...
-  CID: E4KpGvTEto
+  CID: cDL6R1hgSi
   ProjectID: xxx
 🔗 问卷URL: https://...
 🔍 [sendChatMessage] ========== 开始发送消息 ==========
@@ -339,7 +339,7 @@ console.log('ProjectID:', this.projectId);
 **解决**:
 ```typescript
 // 确保使用可公开访问的图片URL
-imgUrl: 'https://file-cloud.fmode.cn/storage/company/E4KpGvTEto/assets/survey-cover.jpg'
+imgUrl: 'https://file-cloud.fmode.cn/storage/company/cDL6R1hgSi/assets/survey-cover.jpg'
 
 // 或者使用项目中的图片
 imgUrl: 'https://app.fmode.cn/dev/yss/assets/survey-cover.png'
@@ -411,7 +411,7 @@ export class StageRequirementsComponent implements OnInit {
           link: surveyUrl,
           title: '📋 项目需求调查问卷',
           desc: '请填写项目需求,我们会根据您的需求进行设计。点击填写问卷 →',
-          imgUrl: 'https://file-cloud.fmode.cn/storage/company/E4KpGvTEto/assets/survey-cover.jpg'
+          imgUrl: 'https://file-cloud.fmode.cn/storage/company/cDL6R1hgSi/assets/survey-cover.jpg'
         }
       });
       

+ 2 - 2
docs/wxwork-sendchatmessage-jssdk-fix.md

@@ -221,7 +221,7 @@ registerCorpWithSuite(['sendChatMessage'])
 **控制台日志**:
 ```
 🚀 StageDeliveryComponent 初始化...
-📋 初始化参数: {cid: "E4KpGvTEto", projectId: "xxx"}
+📋 初始化参数: {cid: "cDL6R1hgSi", projectId: "xxx"}
 🔐 初始化企业微信SDK...
 🔍 [registerCorpWithSuite] 开始注册JSSDK...
 🔍 [registerCorpWithSuite] 平台检测: wxwork
@@ -334,7 +334,7 @@ ww.sendChatMessage({
 **调试日志**:
 ```typescript
 console.log('平台检测:', this.platform()); // 应该是'wxwork'
-console.log('CID:', this.cid);             // 应该是'E4KpGvTEto'
+console.log('CID:', this.cid);             // 应该是'cDL6R1hgSi'
 console.log('AppID:', this.appId);         // 应该是'project'
 console.log('SuiteID:', suiteId);          // 应该是'dk2559ba758f33d8f5'
 ```

+ 4 - 4
docs/wxwork-sendmessage-debug-fix.md

@@ -119,7 +119,7 @@ console.log('🔍 [registerCorpWithSuite] 签名生成完成:', {
 ### 步骤2:检查URL格式
 **正确格式**:
 ```
-https://app.fmode.cn/dev/yss/#/wxwork/E4KpGvTEto/project/project-detail/xxx
+https://app.fmode.cn/dev/yss/#/wxwork/cDL6R1hgSi/project/project-detail/xxx
                                     ↑        ↑         ↑
                                    固定    CID    应用ID
 ```
@@ -127,7 +127,7 @@ https://app.fmode.cn/dev/yss/#/wxwork/E4KpGvTEto/project/project-detail/xxx
 **检查日志**:
 ```javascript
 console.log('🔍 [sendToWxwork] 当前URL:', window.location.href);
-// 应该包含 /wxwork/E4KpGvTEto/project/
+// 应该包含 /wxwork/cDL6R1hgSi/project/
 ```
 
 ### 步骤3:等待超时日志
@@ -181,7 +181,7 @@ console.log('👤 用户姓名:', this.currentUser?.get('name'));
 🔍 [registerCorpWithSuite] 开始注册JSSDK...
 🔍 [registerCorpWithSuite] 平台检测: wxwork
 🔍 [registerCorpWithSuite] API列表: [...]
-🔍 [registerCorpWithSuite] 获取企业配置,CID: E4KpGvTEto
+🔍 [registerCorpWithSuite] 获取企业配置,CID: cDL6R1hgSi
 🔍 [registerCorpWithSuite] 企业配置: {...}
 🔍 [registerCorpWithSuite] 套件ID: dk2559ba758f33d8f5
 🔍 [registerCorpWithSuite] 调用ww.register...
@@ -350,7 +350,7 @@ if (!this.currentUser && this.cid) {
 
 ### 2. URL必须包含wxwork路径
 ```
-https://app.fmode.cn/dev/yss/#/wxwork/E4KpGvTEto/project/...
+https://app.fmode.cn/dev/yss/#/wxwork/cDL6R1hgSi/project/...
                                      ↑必须包含这部分
 ```
 

+ 5 - 5
docs/wxwork-sendmessage-final-deploy-guide.md

@@ -89,14 +89,14 @@ Task id: xxx
 3. 点击右上角"..."
 4. 选择你的应用
 
-**验证**:URL应该包含`/wxwork/E4KpGvTEto/project/`
+**验证**:URL应该包含`/wxwork/cDL6R1hgSi/project/`
 
 ### 测试2:检查SDK初始化日志
 **打开浏览器控制台(F12)**,应该看到:
 
 ```
 🚀 StageDeliveryComponent 初始化...
-📋 初始化参数: {cid: "E4KpGvTEto", projectId: "xxx"}
+📋 初始化参数: {cid: "cDL6R1hgSi", projectId: "xxx"}
 🔐 初始化企业微信SDK...
 🔍 [registerCorpWithSuite] 开始注册JSSDK...
 🔍 [registerCorpWithSuite] 平台检测: wxwork
@@ -185,8 +185,8 @@ if (!this.currentUser && this.cid) {
 
 #### 1.1 确认是否从群聊侧边栏打开
 ```
-检查URL:应该包含 /wxwork/E4KpGvTEto/project/
-✅ 正确:https://app.fmode.cn/dev/yss/#/wxwork/E4KpGvTEto/project/project-detail/xxx
+检查URL:应该包含 /wxwork/cDL6R1hgSi/project/
+✅ 正确:https://app.fmode.cn/dev/yss/#/wxwork/cDL6R1hgSi/project/project-detail/xxx
 ❌ 错误:https://app.fmode.cn/dev/yss/#/admin/project-detail/xxx
 ```
 
@@ -332,7 +332,7 @@ if (!this.wxworkService.cid || this.wxworkService.cid !== cid) {
 
 ### 测试检查
 - [ ] 从群聊侧边栏打开应用(不是工作台)
-- [ ] URL包含`/wxwork/E4KpGvTEto/project/`
+- [ ] URL包含`/wxwork/cDL6R1hgSi/project/`
 - [ ] 控制台显示"AgentConfig注册成功"
 - [ ] 控制台显示用户姓名"脑控徐福静"
 - [ ] 点击发送消息

+ 2 - 2
docs/紧急事件与待办任务组件复用指南.md

@@ -79,7 +79,7 @@ export class Dashboard implements OnInit {
  */
 onUrgentEventViewProject(projectId: string): void {
   console.log('🔍 [紧急事件] 查看项目:', projectId);
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   this.router.navigate(['/wxwork', cid, 'project', projectId, 'order'], {
     queryParams: { roleName: 'customer-service' }
   });
@@ -90,7 +90,7 @@ onUrgentEventViewProject(projectId: string): void {
  */
 onTodoTaskViewDetails(task: TodoTask): void {
   console.log('🔍 [待办任务] 查看详情:', task.title);
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   this.router.navigate(['/wxwork', cid, 'project', task.projectId, 'order'], {
     queryParams: {
       openIssues: 'true',

+ 1 - 1
docs/订单分配审批状态不同步问题修复.md

@@ -5,7 +5,7 @@
 **用户反馈**:订单分配阶段的项目明明已经通过了组长端的审批,但是在订单分配阶段查看时,审批状态仍然显示为"等待组长审批"(待审批状态)。
 
 **问题截图描述**:
-- 当前页面 URL: `localhost:4200/wxwork/E4KpGvTEto/project/iKvYck89zE/order`
+- 当前页面 URL: `localhost:4200/wxwork/cDL6R1hgSi/project/iKvYck89zE/order`
 - 显示状态: "等待组长审批" (⏳)
 - 提示文字: "订单已提交,正在等待组长审核批准"
 - 但实际上组长已经审批通过

+ 1 - 1
docs/订单分配审批状态显示修复-完整版.md

@@ -15,7 +15,7 @@
 ```
 
 **问题截图分析**:
-- URL: `/wxwork/E4KpGvTEto/project/iKvYck89zE/order`
+- URL: `/wxwork/cDL6R1hgSi/project/iKvYck89zE/order`
 - 进度条显示: 当前在"交付执行"阶段(第3步)
 - 页面显示: "等待组长审批" ⏳(错误)
 - 预期显示: "审批已通过" ✅

+ 26 - 8
package-lock.json

@@ -56,7 +56,7 @@
         "echarts": "^6.0.0",
         "esdk-obs-browserjs": "^3.25.6",
         "eventemitter3": "^5.0.1",
-        "fmode-ng": "^0.0.237",
+        "fmode-ng": "latest",
         "highlight.js": "^11.11.1",
         "ionicons": "^8.0.13",
         "jquery": "^3.7.1",
@@ -99,6 +99,7 @@
         "@angular/cli": "^17.3.0",
         "@angular/compiler-cli": "^17.3.0",
         "@types/jasmine": "~5.1.0",
+        "@types/node": "^25.3.5",
         "@types/qrcode": "^1.5.5",
         "@typescript-eslint/eslint-plugin": "^7.18.0",
         "@typescript-eslint/parser": "^7.18.0",
@@ -5795,12 +5796,13 @@
       "license": "MIT"
     },
     "node_modules/@types/node": {
-      "version": "24.8.1",
-      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.8.1.tgz",
-      "integrity": "sha512-alv65KGRadQVfVcG69MuB4IzdYVpRwMG/mq8KWOaoOdyY617P5ivaDiMCGOFDWD2sAn5Q0mR3mRtUOgm99hL9Q==",
+      "version": "25.3.5",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-25.3.5.tgz",
+      "integrity": "sha512-oX8xrhvpiyRCQkG1MFchB09f+cXftgIXb3a7UUa4Y3wpmZPw5tyZGTLWhlESOLq1Rq6oDlc8npVU2/9xiCuXMA==",
+      "dev": true,
       "license": "MIT",
       "dependencies": {
-        "undici-types": "~7.14.0"
+        "undici-types": "~7.18.0"
       }
     },
     "node_modules/@types/node-forge": {
@@ -8337,6 +8339,15 @@
         "node": ">=10"
       }
     },
+    "node_modules/docx/node_modules/@types/node": {
+      "version": "24.12.0",
+      "resolved": "https://registry.npmjs.org/@types/node/-/node-24.12.0.tgz",
+      "integrity": "sha512-GYDxsZi3ChgmckRT9HPU0WEhKLP08ev/Yfcq2AstjrDASOYCSXeyjDsHg4v5t4jOj7cyDX3vmprafKlWIG9MXQ==",
+      "license": "MIT",
+      "dependencies": {
+        "undici-types": "~7.16.0"
+      }
+    },
     "node_modules/docx/node_modules/nanoid": {
       "version": "5.1.6",
       "resolved": "https://registry.npmjs.org/nanoid/-/nanoid-5.1.6.tgz",
@@ -8355,6 +8366,12 @@
         "node": "^18 || >=20"
       }
     },
+    "node_modules/docx/node_modules/undici-types": {
+      "version": "7.16.0",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.16.0.tgz",
+      "integrity": "sha512-Zz+aZWSj8LE6zoxD+xrjh4VfkIG8Ya6LvYkZqtUQGJPZjYl53ypCaUwWqo7eI0x66KBGeRo+mlBEkMSeSZ38Nw==",
+      "license": "MIT"
+    },
     "node_modules/dom-serialize": {
       "version": "2.2.1",
       "resolved": "https://registry.npmjs.org/dom-serialize/-/dom-serialize-2.2.1.tgz",
@@ -16110,9 +16127,10 @@
       "license": "MIT"
     },
     "node_modules/undici-types": {
-      "version": "7.14.0",
-      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.14.0.tgz",
-      "integrity": "sha512-QQiYxHuyZ9gQUIrmPo3IA+hUl4KYk8uSA7cHrcKd/l3p1OTpZcM0Tbp9x7FAtXdAYhlasd60ncPpgu6ihG6TOA==",
+      "version": "7.18.2",
+      "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-7.18.2.tgz",
+      "integrity": "sha512-AsuCzffGHJybSaRrmr5eHr81mwJU3kjw6M+uprWvCXiNeN9SOGwQ3Jn8jb8m3Z6izVgknn1R0FTCEAP2QrLY/w==",
+      "dev": true,
       "license": "MIT"
     },
     "node_modules/unicode-canonical-property-names-ecmascript": {

+ 1 - 0
package.json

@@ -117,6 +117,7 @@
     "@angular/cli": "^17.3.0",
     "@angular/compiler-cli": "^17.3.0",
     "@types/jasmine": "~5.1.0",
+    "@types/node": "^25.3.5",
     "@types/qrcode": "^1.5.5",
     "@typescript-eslint/eslint-plugin": "^7.18.0",
     "@typescript-eslint/parser": "^7.18.0",

+ 2 - 2
public/test-aftercare.html

@@ -167,7 +167,7 @@
     <div class="header">
       <h1>🔧 售后归档数据连接测试</h1>
       <p>测试项目ID: <strong>yjVLy8KxyG</strong></p>
-      <p>测试公司ID: <strong>E4KpGvTEto</strong></p>
+      <p>测试公司ID: <strong>cDL6R1hgSi</strong></p>
     </div>
     
     <!-- 1. ProjectPayment测试 -->
@@ -221,7 +221,7 @@
     const Parse = FmodeParse.with('nova');
     
     const PROJECT_ID = 'yjVLy8KxyG';
-    const COMPANY_ID = 'E4KpGvTEto';
+    const COMPANY_ID = 'cDL6R1hgSi';
     
     // 日志函数
     window.log = function(elementId, message, type = 'info') {

+ 2 - 2
public/test-stage-navigation.html

@@ -223,7 +223,7 @@
       </div>
       <div class="form-group">
         <label>公司 ID (cid)</label>
-        <input type="text" id="cid" value="E4KpGvTEto" placeholder="输入公司ID">
+        <input type="text" id="cid" value="cDL6R1hgSi" placeholder="输入公司ID">
       </div>
       <button class="btn" onclick="loadProjects()">
         <span>🔍</span>
@@ -253,7 +253,7 @@
     Parse.initialize("nova");
     Parse.serverURL = 'https://parse.fmode.cn';
 
-    const cid = 'E4KpGvTEto';
+    const cid = 'cDL6R1hgSi';
 
     function log(message, type = 'info') {
       const logEl = document.getElementById('log');

+ 1 - 1
rules/agents.md

@@ -298,7 +298,7 @@ export class TestFmodeChatPanelLifecycleComponent implements OnInit {
 
  // 处理问诊(新建或恢复)
 async handleConsultation(doctor:FmodeObject, consultation?:FmodeObject) {
-  localStorage.setItem("company", "E4KpGvTEto");
+  localStorage.setItem("company", "cDL6R1hgSi");
   
   // 如果是新建咨询,创建记录
   if (!consultation) {

+ 1 - 1
rules/schemas.md

@@ -314,7 +314,7 @@ GroupChat "n" --> "1" Project : 关联项目(可选)
 
 | 字段名 | 类型 | 必填 | 说明 | 示例值 |
 |--------|------|------|------|--------|
-| objectId | String | 是 | 主键ID | "E4KpGvTEto" |
+| objectId | String | 是 | 主键ID | "cDL6R1hgSi" |
 | name | String | 是 | 企业名称 | "映三色设计" |
 | corpId | String | 否 | 企业微信CorpID | "ww1234567890" |
 | data | Object | 否 | 扩展数据 | { settings: {...}, modules: [...] } |

+ 10 - 10
rules/wxwork/auth.md

@@ -30,7 +30,7 @@ import { WxworkAuth } from 'fmode-ng/core';
 
 // 初始化
 const wxAuth = new WxworkAuth({
-  cid: 'E4KpGvTEto',  // 公司帐套ID
+  cid: 'cDL6R1hgSi',  // 公司帐套ID
   appId: 'crm'        // 应用ID,可选,默认为 'crm'
 });
 ```
@@ -50,7 +50,7 @@ export class MyPageComponent {
   userInfo: any;
 
   constructor() {
-    this.wxAuth = new WxworkAuth({ cid: 'E4KpGvTEto' });
+    this.wxAuth = new WxworkAuth({ cid: 'cDL6R1hgSi' });
 
     // 页面加载后执行用户认证
     await this.initAuth();
@@ -91,7 +91,7 @@ constructor(options: {
 
 **示例**:
 ```typescript
-const wxAuth = new WxworkAuth({ cid: 'E4KpGvTEto' });
+const wxAuth = new WxworkAuth({ cid: 'cDL6R1hgSi' });
 ```
 
 ---
@@ -298,7 +298,7 @@ export class DashboardComponent implements OnInit {
   currentUser: any;
 
   constructor() {
-    this.wxAuth = new WxworkAuth({ cid: 'E4KpGvTEto' });
+    this.wxAuth = new WxworkAuth({ cid: 'cDL6R1hgSi' });
   }
 
   async ngOnInit() {
@@ -328,7 +328,7 @@ export class ProfilePreviewComponent implements OnInit {
   userInfo: any;
 
   constructor() {
-    this.wxAuth = new WxworkAuth({ cid: 'E4KpGvTEto' });
+    this.wxAuth = new WxworkAuth({ cid: 'cDL6R1hgSi' });
   }
 
   async ngOnInit() {
@@ -355,7 +355,7 @@ export class OnboardingComponent {
   profile: any;
 
   constructor() {
-    this.wxAuth = new WxworkAuth({ cid: 'E4KpGvTEto' });
+    this.wxAuth = new WxworkAuth({ cid: 'cDL6R1hgSi' });
   }
 
   async step1_getUserInfo() {
@@ -396,7 +396,7 @@ async function ensureAuthenticated() {
   }
 
   // 未登录,执行认证
-  const wxAuth = new WxworkAuth({ cid: 'E4KpGvTEto' });
+  const wxAuth = new WxworkAuth({ cid: 'cDL6R1hgSi' });
   const { user } = await wxAuth.authenticateAndLogin();
 
   return user;
@@ -448,7 +448,7 @@ const routes: Routes = [
 **使用方式**:
 ```typescript
 // 在组件中直接调用
-const wxAuth = new WxworkAuth({ cid: 'E4KpGvTEto' });
+const wxAuth = new WxworkAuth({ cid: 'cDL6R1hgSi' });
 await wxAuth.authenticateAndLogin();
 ```
 
@@ -472,7 +472,7 @@ export class AuthService {
 
   constructor() {
     // 从环境变量或配置中获取 cid
-    this.wxAuth = new WxworkAuth({ cid: 'E4KpGvTEto' });
+    this.wxAuth = new WxworkAuth({ cid: 'cDL6R1hgSi' });
   }
 
   async authenticate() {
@@ -543,7 +543,7 @@ async initAuth() {
 export const environment = {
   production: false,
   wxwork: {
-    cid: 'E4KpGvTEto',
+    cid: 'cDL6R1hgSi',
     appId: 'crm'
   }
 };

+ 2 - 2
rules/wxwork/group-chat-contact.md

@@ -794,8 +794,8 @@ export class PageChatContextComponent implements OnInit {
 5. **响应式设计**:适配移动端和桌面端
 
 **访问链接示例**:
-- 脑控科技: https://app.fmode.cn/dev/crm/chat/E4KpGvTEto/context
-- 映三色: https://app.fmode.cn/dev/crm/chat/E4KpGvTEto/crm/context
+- 脑控科技: https://app.fmode.cn/dev/crm/chat/cDL6R1hgSi/context
+- 映三色: https://app.fmode.cn/dev/crm/chat/cDL6R1hgSi/crm/context
 
 ## 入口场景识别
 

+ 2 - 2
rules/wxwork/guard-wxwork.md

@@ -74,7 +74,7 @@ export const routes: Routes = [
 }
 
 // 查询参数方式
-// 访问: /some-page?cid=E4KpGvTEto
+// 访问: /some-page?cid=cDL6R1hgSi
 {
   path: "some-page",
   canActivate: [WxworkAuthGuard],
@@ -445,7 +445,7 @@ async checkVerified() {
 { path: ":cid/my-page", canActivate: [WxworkAuthGuard], ... }
 
 // ✅ 正确:查询参数中包含 cid
-// 访问: /my-page?cid=E4KpGvTEto
+// 访问: /my-page?cid=cDL6R1hgSi
 { path: "my-page", canActivate: [WxworkAuthGuard], ... }
 
 // ❌ 错误:缺少 cid 参数

+ 2 - 2
scripts/debug-team-leader-navigation.js

@@ -39,7 +39,7 @@ if (!teamLeaderMode && !enterAsTeamLeader) {
 if (!company) {
   hasIssues = true;
   issues.push('❌ 缺少公司ID(company)');
-  recommendations.push('手动设置:localStorage.setItem("company", "E4KpGvTEto")');
+  recommendations.push('手动设置:localStorage.setItem("company", "cDL6R1hgSi")');
 }
 
 if (enterFromCustomerService === '1' || customerServiceMode === 'true') {
@@ -177,7 +177,7 @@ window.testNavigation = function(projectId) {
   localStorage.setItem('teamLeaderMode', 'true');
   localStorage.setItem('enterAsTeamLeader', '1');
   
-  const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+  const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
   const url = `/wxwork/${cid}/project/${projectId}/delivery`;
   
   console.log(`📍 目标URL: ${url}`);

+ 2 - 2
src/app/app.config.ts

@@ -3,14 +3,14 @@ import { provideRouter } from '@angular/router';
 import { provideHttpClient } from '@angular/common/http';
 import { provideAnimations } from '@angular/platform-browser/animations';
 
-localStorage.setItem("company","E4KpGvTEto")
+localStorage.setItem("company","cDL6R1hgSi")
 
 import { routes } from './app.routes';
 
 import { provideIonicAngular } from '@ionic/angular/standalone';
 import { Diagnostic } from '@awesome-cordova-plugins/diagnostic/ngx';
 
-localStorage.setItem("company","E4KpGvTEto")
+localStorage.setItem("company","cDL6R1hgSi")
 
 export const appConfig: ApplicationConfig = {
   providers: [

+ 6 - 6
src/app/pages/admin/dashboard/dashboard.ts

@@ -160,7 +160,7 @@ export class AdminDashboard implements OnInit, AfterViewInit, OnDestroy {
       
       // 获取公司信息
       const companyQuery = new Parse.Query('Company');
-      companyQuery.equalTo('objectId', 'E4KpGvTEto');
+      companyQuery.equalTo('objectId', 'cDL6R1hgSi');
       this.company = await companyQuery.first();
       
       if (!this.company) {
@@ -221,7 +221,7 @@ export class AdminDashboard implements OnInit, AfterViewInit, OnDestroy {
       const companyPointer = {
         __type: 'Pointer',
         className: 'Company',
-        objectId: this.company?.id || 'E4KpGvTEto'
+        objectId: this.company?.id || 'cDL6R1hgSi'
       };
 
       // 总项目数
@@ -279,7 +279,7 @@ export class AdminDashboard implements OnInit, AfterViewInit, OnDestroy {
     const companyPointer = {
       __type: 'Pointer',
       className: 'Company',
-      objectId: this.company?.id || 'E4KpGvTEto'
+      objectId: this.company?.id || 'cDL6R1hgSi'
     };
     
     try {
@@ -349,7 +349,7 @@ export class AdminDashboard implements OnInit, AfterViewInit, OnDestroy {
       const companyPointer = {
         __type: 'Pointer',
         className: 'Company',
-        objectId: this.company?.id || 'E4KpGvTEto'
+        objectId: this.company?.id || 'cDL6R1hgSi'
       };
 
       // 🔥 修复:从售后归档阶段的项目中获取已支付的尾款
@@ -489,7 +489,7 @@ export class AdminDashboard implements OnInit, AfterViewInit, OnDestroy {
       const companyPointer = {
         __type: 'Pointer',
         className: 'Company',
-        objectId: this.company?.id || 'E4KpGvTEto'
+        objectId: this.company?.id || 'cDL6R1hgSi'
       };
 
       // 查询所有进行中的项目
@@ -652,7 +652,7 @@ export class AdminDashboard implements OnInit, AfterViewInit, OnDestroy {
       const companyPointer = {
         __type: 'Pointer',
         className: 'Company',
-        objectId: this.company?.id || 'E4KpGvTEto'
+        objectId: this.company?.id || 'cDL6R1hgSi'
       };
 
       // 查询最近更新的项目

+ 1 - 1
src/app/pages/admin/groupchats/groupchats.ts

@@ -53,7 +53,7 @@ export class GroupChats implements OnInit {
 
   // 企微Corp(需要配置cid)
   private wecorp: WxworkCorp | null = null;
-  private readonly COMPANY_ID = 'E4KpGvTEto'; // 映三色帐套
+  private readonly COMPANY_ID = 'cDL6R1hgSi'; // 映三色帐套
 
   // 创建项目相关
   showCreateProjectModal = false;

+ 2 - 2
src/app/pages/admin/services/admin-data.service.ts

@@ -3,13 +3,13 @@ import { FmodeObject, FmodeParse, FmodeQuery } from 'fmode-ng/core';
 
 /**
  * 管理系统数据服务基类
- * 提供统一的数据访问接口,所有数据操作都指向 E4KpGvTEto 映三色帐套
+ * 提供统一的数据访问接口,所有数据操作都指向 cDL6R1hgSi 映三色帐套
  */
 @Injectable({
   providedIn: 'root'
 })
 export class AdminDataService {
-  private readonly COMPANY_ID = 'E4KpGvTEto'; // 映三色帐套ID
+  private readonly COMPANY_ID = 'cDL6R1hgSi'; // 映三色帐套ID
   private Parse: any;
 
   constructor() {

+ 1 - 1
src/app/pages/admin/services/employee.service.ts

@@ -205,7 +205,7 @@ export class EmployeeService {
         return { currentProjects: 0, completedProjects: 0, ongoingProjects: [], completedProjectsList: [] };
       }
 
-      const companyId = this.adminData.getCompanyPointer().objectId || 'E4KpGvTEto';
+      const companyId = this.adminData.getCompanyPointer().objectId || 'cDL6R1hgSi';
       const employeePointer = {
         __type: 'Pointer',
         className: 'Profile',

+ 1 - 1
src/app/pages/auth/login/login.html

@@ -52,7 +52,7 @@
     <footer class="footer">
       <span>© {{ currentYear }} 映三色</span>
       <a href="https://app.fmode.cn/dev/yss/">隐私</a>
-      <a href="https://app.fmode.cn/dev/yss/wxwork/E4KpGvTEto/project-loader">条款</a>
+      <a href="https://app.fmode.cn/dev/yss/wxwork/cDL6R1hgSi/project-loader">条款</a>
     </footer>
   </div>
 </div>

+ 8 - 8
src/app/pages/customer-service/dashboard/dashboard.ts

@@ -324,7 +324,7 @@ export class Dashboard implements OnInit, OnDestroy {
       
       // 获取公司信息 - 映三色帐套
       const companyQuery = new Parse.Query('Company');
-      companyQuery.equalTo('objectId', 'E4KpGvTEto');
+      companyQuery.equalTo('objectId', 'cDL6R1hgSi');
       const company = await companyQuery.first();
       
       if (!company) {
@@ -1462,7 +1462,7 @@ onSearchInput(event: Event): void {
       }
 
       // 获取当前公司ID
-      const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+      const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
       
       // 导航到wxwork模块的项目详情页,并定位到售后归档阶段
       this.router.navigate(['/wxwork', cid, 'project', projectId, 'aftercare'], {
@@ -1479,7 +1479,7 @@ onSearchInput(event: Event): void {
     console.log(`📂 查看项目详情: ${projectId}`);
     
     // 获取当前公司ID
-    const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+    const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
     
     // 导航到wxwork模块的项目详情页
     this.router.navigate(['/wxwork', cid, 'project', projectId]);
@@ -1657,7 +1657,7 @@ onSearchInput(event: Event): void {
    */
   async loadProjectTimelineData(): Promise<void> {
     try {
-      const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+      const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
       
       // 查询当前公司的所有项目
       const projectQuery = new Parse.Query('Project');
@@ -2062,7 +2062,7 @@ onSearchInput(event: Event): void {
   onUrgentEventViewProject(projectId: string): void {
     console.log('🔍 [紧急事件] 查看项目:', projectId);
     // 跳转到项目详情页
-    const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+    const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
     this.router.navigate(['/wxwork', cid, 'project', projectId, 'order'], {
       queryParams: { roleName: 'customer-service' }
     });
@@ -2163,7 +2163,7 @@ onSearchInput(event: Event): void {
    */
   viewProjectDetails(projectId: string): void {
     console.log('🔍 [客服] 查看项目:', projectId);
-    const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+    const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
     this.router.navigate(['/wxwork', cid, 'project', projectId, 'order'], {
       queryParams: { roleName: 'customer-service' }
     });
@@ -2225,7 +2225,7 @@ onSearchInput(event: Event): void {
   navigateToIssue(task: TodoTaskFromIssue): void {
     console.log('🔍 [待办任务] 查看详情:', task.title);
     // 跳转到项目详情页,并打开问题板块
-    const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+    const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
     this.router.navigate(['/wxwork', cid, 'project', task.projectId, 'order'], {
       queryParams: {
         openIssues: 'true',
@@ -2241,7 +2241,7 @@ onSearchInput(event: Event): void {
   onTodoTaskViewDetails(task: TodoTaskFromIssue): void {
     console.log('🔍 [待办任务] 查看详情:', task.title);
     // 跳转到项目详情页,并打开问题板块
-    const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+    const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
     this.router.navigate(['/wxwork', cid, 'project', task.projectId, 'order'], {
       queryParams: {
         openIssues: 'true',

+ 2 - 2
src/app/pages/designer/dashboard/dashboard.ts

@@ -125,7 +125,7 @@ export class Dashboard implements OnInit {
       
       if (!this.cid) {
         console.warn('⚠️ 未找到公司ID,尝试使用默认值');
-        this.cid = 'E4KpGvTEto'; // 默认公司ID
+        this.cid = 'cDL6R1hgSi'; // 默认公司ID
       }
       
       // 2. 初始化企微认证
@@ -1214,7 +1214,7 @@ export class Dashboard implements OnInit {
       }
 
       const Parse = await import('fmode-ng/parse').then(m => m.FmodeParse.with('nova'));
-      const cid = this.cid || localStorage.getItem('company') || 'E4KpGvTEto';
+      const cid = this.cid || localStorage.getItem('company') || 'cDL6R1hgSi';
       
       
       // 先查询当前公司的所有项目

+ 1 - 1
src/app/pages/designer/project-detail/services/designer-data.service.ts

@@ -43,7 +43,7 @@ export interface TeamData {
   providedIn: 'root'
 })
 export class DesignerDataService {
-  private readonly COMPANY_ID = 'E4KpGvTEto'; // 映三色帐套
+  private readonly COMPANY_ID = 'cDL6R1hgSi'; // 映三色帐套
 
   constructor() {}
 

+ 2 - 2
src/app/pages/team-leader/dashboard/dashboard.ts

@@ -442,7 +442,7 @@ export class Dashboard implements OnInit, OnDestroy {
       const sourceProjects = await firstValueFrom(this.projectService.getProjects()) as any[];
       
       // 获取项目分配信息(用于修正设计师信息,确保跟甘特图一致)
-      const companyId = localStorage.getItem('company') || 'E4KpGvTEto';
+      const companyId = localStorage.getItem('company') || 'cDL6R1hgSi';
       const assignments = await this.designerWorkloadService.getProjectAssignments(companyId);
       
       // 数据转换与增强,确保符合Dashboard模型要求
@@ -577,7 +577,7 @@ export class Dashboard implements OnInit, OnDestroy {
    */
   async loadDesignerWorkload(): Promise<void> {
     try {
-      const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+      const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
       
       // 使用服务加载工作量
       this.designerWorkloadMap = await this.designerWorkloadService.loadWorkload(cid);

+ 2 - 2
src/app/pages/team-leader/services/dashboard-navigation.helper.ts

@@ -135,7 +135,7 @@ export class DashboardNavigationHelper {
 
     this.markAsTeamLeaderMode();
 
-    const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+    const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
     const stagePath = this.getStagePath(currentStage);
 
     console.log(`🎯 项目跳转: ID=${projectId}, 阶段=${currentStage} -> Path=${stagePath}`);
@@ -158,7 +158,7 @@ export class DashboardNavigationHelper {
 
     this.markAsTeamLeaderMode();
 
-    const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+    const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
     // corePhaseId 已经是路由路径格式
     const stagePath = corePhaseId;
 

+ 1 - 1
src/app/pages/team-leader/team-management/team-management.ts

@@ -391,7 +391,7 @@ export class TeamManagementComponent implements OnInit {
   // 查看项目详情
   viewProjectDetails(projectId: string): void {
     // 跳转到企微认证项目详情页(正确路由)
-    const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+    const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
     this.router.navigate(['/wxwork', cid, 'project', projectId]);
   }
 

+ 1 - 1
src/app/pages/team-leader/workload-calendar/workload-calendar.ts

@@ -218,7 +218,7 @@ export class WorkloadCalendarComponent implements OnInit, OnDestroy {
     if (ev) { ev.stopPropagation(); ev.preventDefault?.(); }
     if (!t || !t.projectId) return;
     // 跳转到企微认证项目详情页(正确路由)
-    const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+    const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
     this.router.navigate(['/wxwork', cid, 'project', t.projectId]);
   }
 

+ 2 - 2
src/app/services/project.service.ts

@@ -614,7 +614,7 @@ export class ProjectService {
    */
   private async getProjectsFromParse(): Promise<Project[]> {
     try {
-      const companyId = localStorage.getItem('company') || 'E4KpGvTEto';
+      const companyId = localStorage.getItem('company') || 'cDL6R1hgSi';
       const query = new Parse.Query('Project');
       query.equalTo('company', companyId);
       query.notEqualTo('isDeleted', true);
@@ -961,7 +961,7 @@ export class ProjectService {
           const project = new Project();
           
           // 获取公司ID
-          const companyId = localStorage.getItem('company') || 'E4KpGvTEto';
+          const companyId = localStorage.getItem('company') || 'cDL6R1hgSi';
           
           // 设置基本信息
           project.set('company', companyId);

+ 1 - 1
src/app/shared/components/upload-component/upload.component.ts

@@ -47,7 +47,7 @@ export class UploadComponent {
   // 初始化 NovaStorage
   private async initStorage(): Promise<void> {
     try {
-      const cid = localStorage.getItem('company') || 'E4KpGvTEto';
+      const cid = localStorage.getItem('company') || 'cDL6R1hgSi';
       this.storage = await NovaStorage.withCid(cid);
       console.log('✅ NovaStorage 初始化成功, cid:', cid);
     } catch (error) {

+ 1 - 1
src/modules/project/scripts/test-aftercare-connection.ts

@@ -9,7 +9,7 @@ const Parse = FmodeParse.with('nova');
 
 // 项目ID
 const TEST_PROJECT_ID = 'yjVLy8KxyG';
-const TEST_COMPANY_ID = 'E4KpGvTEto';
+const TEST_COMPANY_ID = 'cDL6R1hgSi';
 
 /**
  * 测试ProjectPayment表连接

+ 1 - 1
src/modules/project/services/wxwork-sdk.service.ts

@@ -23,7 +23,7 @@ export interface WxworkCurrentChat {
 export class WxworkSDKService {
   // 企业配置映射
   private companyMap: any = {
-    'E4KpGvTEto': { // 映三色
+    'cDL6R1hgSi': { // 映三色
       corpResId: 'vsVIWbd1i9'
     }
   };

+ 2 - 2
test-chat-activation-wxwork.html

@@ -283,8 +283,8 @@
         <input 
           type="text" 
           id="cid" 
-          placeholder="例如: E4KpGvTEto"
-          value="E4KpGvTEto"
+          placeholder="例如: cDL6R1hgSi"
+          value="cDL6R1hgSi"
         />
         <p class="hint">企业微信公司标识符</p>
       </div>

+ 2 - 2
修复完成总结.md

@@ -71,12 +71,12 @@
 
 3. **访问项目详情页**:
    ```
-   http://localhost:4200/wxwork/E4KpGvTEto/project/Wf2f3aFqBI/order
+   http://localhost:4200/wxwork/cDL6R1hgSi/project/Wf2f3aFqBI/order
    ```
 
 4. **检查初始化日志**:
    ```javascript
-   📌 路由参数: { cid: 'E4KpGvTEto', projectId: 'Wf2f3aFqBI' }
+   📌 路由参数: { cid: 'cDL6R1hgSi', projectId: 'Wf2f3aFqBI' }
    📡 [初始化] 注册事件监听器: stage:completed
    ✅ [初始化] 事件监听器注册成功
    ```

+ 1 - 1
修复验证清单.txt

@@ -96,7 +96,7 @@
 ===============================================
 
 初始化:
-📌 路由参数: { cid: 'E4KpGvTEto', projectId: 'Wf2f3aFqBI' }
+📌 路由参数: { cid: 'cDL6R1hgSi', projectId: 'Wf2f3aFqBI' }
 📡 [初始化] 注册事件监听器: stage:completed
 ✅ [初始化] 事件监听器注册成功
 🔄 当前阶段已更新: order

+ 2 - 2
快速开始.md

@@ -16,13 +16,13 @@
 
 ### 第3步: 访问项目详情
 ```
-http://localhost:4200/wxwork/E4KpGvTEto/project/Wf2f3aFqBI/order
+http://localhost:4200/wxwork/cDL6R1hgSi/project/Wf2f3aFqBI/order
 ```
 
 ### 第4步: 检查初始化
 在控制台应该看到:
 ```javascript
-📌 路由参数: { cid: 'E4KpGvTEto', projectId: 'Wf2f3aFqBI' }
+📌 路由参数: { cid: 'cDL6R1hgSi', projectId: 'Wf2f3aFqBI' }
 ✅ [初始化] 事件监听器注册成功
 ```
 

+ 1 - 1
核心代码变更.md

@@ -249,7 +249,7 @@ console.log('📌 路由参数:', {
 在控制台看到:
 
 ```javascript
-📌 路由参数: { cid: 'E4KpGvTEto', projectId: 'Wf2f3aFqBI' }
+📌 路由参数: { cid: 'cDL6R1hgSi', projectId: 'Wf2f3aFqBI' }
 ```
 
 **检查**: cid 不为空字符串

+ 1 - 1
清理日志并重新测试.md

@@ -42,7 +42,7 @@ npm start
 
 ### 步骤 5:刷新浏览器
 
-1. 回到浏览器页面:`http://localhost:4200/wxwork/E4KpGvTEto/project/iKvYck89zE/order`
+1. 回到浏览器页面:`http://localhost:4200/wxwork/cDL6R1hgSi/project/iKvYck89zE/order`
 2. 按 **`Ctrl + Shift + R`** (硬刷新)
 
 ---