mobile-and-wxwork-fixes-complete.md 12 KB

移动端适配与企业微信功能完整修复

🎯 问题描述

根据用户反馈和截图,需要修复以下问题:

  1. 企业微信端图片不显示:拖拽上传弹窗中显示红色占位符而非真实图片
  2. AI分类不准确:白模图片被误判为其他阶段
  3. 图片链接无法访问:点击图片后无法查看
  4. 移动端显示不全:表格、弹窗在手机企业微信端显示不完整
  5. 消息未真正发送:只保存到数据库,未发送到企业微信聊天窗口

✅ 修复内容

1️⃣ AI分类逻辑修复

问题根源

默认值设置错误导致判断逻辑反转:

// ❌ 错误:默认有色彩/纹理
const hasColor = content.hasColor !== false;  // undefined时为true
const hasTexture = content.hasTexture !== false;  // undefined时为true

修复方案

// ✅ 正确:只有明确检测到才为true
const hasColor = content.hasColor === true;  // undefined时为false
const hasTexture = content.hasTexture === true;  // undefined时为false

白模判断条件(放宽)

if (!content.hasFurniture &&  // 无家具
    !content.hasLighting &&   // 无灯光
    qualityScore < 65 &&      // 低质量(放宽到65)
    !hasColor) {              // 无色彩
  return 'white_model';
}

// 额外兜底:极低质量 + 无装饰
if (qualityScore < 50 && !content.hasFurniture && !content.hasLighting) {
  return 'white_model';
}

文件: e:\yinsanse\yss-project\src\modules\project\services\image-analysis.service.ts


2️⃣ 图片显示和URL访问修复

修复内容

  1. 添加fileUrl字段到UploadFile接口
  2. 优先使用fileUrl而非preview
  3. 错误处理:图片加载失败时显示占位符
  4. 添加referrerpolicy:防止跨域问题

HTML修改

<!-- 优先使用上传后的URL,fallback到preview -->
<img 
  [src]="file.fileUrl || file.preview" 
  [alt]="file.name" 
  class="file-thumbnail" 
  (click)="viewFullImage(file)"
  (error)="onImageError($event, file)"
  loading="eager" 
  referrerpolicy="no-referrer" />

TypeScript修改

export interface UploadFile {
  // ... 其他字段
  fileUrl?: string;  // 🔥 新增:上传后的文件URL
}

onImageError(event: Event, file: UploadFile): void {
  const imgElement = event.target as HTMLImageElement;
  imgElement.style.display = 'none';  // 隐藏失败的图片
  // 尝试重新生成preview
}

文件:

  • drag-upload-modal.component.html
  • drag-upload-modal.component.ts

3️⃣ 移动端和企业微信适配

响应式CSS

// 🔥 移动端适配(≤768px)
@media (max-width: 768px) {
  .drag-upload-modal-overlay {
    padding: 10px;
    align-items: flex-start;
    padding-top: 20px;
  }
  
  .drag-upload-modal-container {
    width: 95%;
    max-height: 90vh;
    border-radius: 8px;
  }
  
  .analysis-table {
    font-size: 11px;
    
    thead th {
      padding: 8px 4px;
      font-size: 11px;
    }
    
    .file-thumbnail {
      width: 40px;
      height: 40px;
    }
    
    .file-name {
      font-size: 12px;
      max-width: 120px;
    }
  }
  
  .modal-footer {
    flex-direction: column;
    gap: 8px;
    
    button {
      flex: 1;
      width: 100%;
    }
  }
}

表格显示修复

.files-analysis-table {
  overflow-x: auto;
  -webkit-overflow-scrolling: touch;  // iOS平滑滚动
  
  .analysis-table {
    width: 100%;
    min-width: 100%;  // 移除最小宽度限制
    display: table;  // 确保表格正常显示
    
    thead {
      display: table-header-group;  // 确保表头显示
    }
    
    tbody {
      display: table-row-group;  // 确保表体显示
    }
    
    td, th {
      display: table-cell;  // 确保单元格显示
    }
  }
}

Loading状态

<div class="file-icon-placeholder" [class.loading]="file.status === 'analyzing'">
  @if (file.status === 'analyzing') {
    <div class="loading-spinner"></div>
  } @else {
    <!-- 默认图标 -->
  }
</div>
.loading-spinner {
  width: 20px;
  height: 20px;
  border: 2px solid rgba(255, 255, 255, 0.3);
  border-top-color: white;
  border-radius: 50%;
  animation: spin 0.8s linear infinite;
}

@keyframes spin {
  to { transform: rotate(360deg); }
}

文件: drag-upload-modal.component.scss


4️⃣ 企业微信消息发送

问题

DeliveryMessageService只保存消息到数据库,未真正发送到企业微信。

修复方案

添加sendToWxwork()方法,使用企业微信JSSDK的sendChatMessage API:

/**
 * 🔥 发送消息到企业微信当前窗口
 */
private async sendToWxwork(text: string, imageUrls: string[] = []): Promise<void> {
  try {
    // 1️⃣ 检查是否在企业微信环境中
    const isWxwork = window.location.href.includes('/wxwork/');
    if (!isWxwork) {
      console.log('⚠️ 非企业微信环境,跳过发送');
      return;
    }

    // 2️⃣ 动态导入企业微信 JSSDK
    const ww = await import('@wecom/jssdk');
    
    // 3️⃣ 发送文本消息
    if (text) {
      await ww.sendChatMessage({
        msgtype: 'text',
        text: {
          content: text
        }
      });
      console.log('✅ 文本消息已发送');
    }
    
    // 4️⃣ 发送图片消息(逐个发送)
    for (let i = 0; i < imageUrls.length; i++) {
      const imageUrl = imageUrls[i];
      await ww.sendChatMessage({
        msgtype: 'image',
        image: {
          imgUrl: imageUrl
        }
      });
      console.log(`✅ 图片 ${i + 1}/${imageUrls.length} 已发送`);
      
      // 避免发送过快
      if (i < imageUrls.length - 1) {
        await new Promise(resolve => setTimeout(resolve, 300));
      }
    }
    
    console.log('✅ 所有消息已发送到企业微信');
  } catch (error) {
    console.error('❌ 发送消息到企业微信失败:', error);
    // 发送失败不影响主流程
  }
}

调用位置

async createTextMessage(...): Promise<DeliveryMessage> {
  // 保存到数据库
  await this.saveMessageToProject(projectId, message);
  
  // 🔥 发送到企业微信
  await this.sendToWxwork(content, []);
  
  return message;
}

async createImageMessage(...): Promise<DeliveryMessage> {
  // 保存到数据库
  await this.saveMessageToProject(projectId, message);
  
  // 🔥 发送到企业微信
  await this.sendToWxwork(content, imageUrls);
  
  return message;
}

文件: e:\yinsanse\yss-project\src\app\pages\services\delivery-message.service.ts


📊 数据流程

完整上传流程

用户拖拽上传图片
    ↓
生成preview (base64)
    ↓
AI分析图片内容
  - 检测色彩、纹理、家具、灯光
  - 判断阶段:white_model/soft_decor/rendering/post_process
    ↓
用户点击"确认交付清单"
    ↓
批量上传到OBS
  - 返回fileUrl (https://.../xxx.jpg)
    ↓
创建ProjectFile记录
  - fileType: delivery_${stageType}
  - data.spaceId: spaceId
  - data.deliveryType: stageType
  - fileUrl: https://.../xxx.jpg
    ↓
刷新文件列表
  - 按fileType和spaceId查询
  - 显示在对应阶段tab
    ↓
自动弹出消息窗口
    ↓
用户选择话术或输入自定义消息
    ↓
点击发送
    ↓
1️⃣ 保存到Project.data.deliveryMessages
2️⃣ 调用企业微信SDK发送到当前窗口
    ↓
✅ 消息显示在企业微信聊天中

🔍 调试日志

AI分类日志

🎯 阶段判断依据: {
  像素密度: "high",
  精细程度: "basic",
  质量分数: 58,
  纹理质量: 45,
  有家具: false,
  有灯光: false,
  有色彩: false,  ← 关键:修复后正确识别
  有纹理: false
}
✅ 判定为白模阶段:无装饰 + 无灯光 + 无色彩 + 低质量

图片加载日志

🖼️ 开始为 test.jpg 生成预览
✅ 图片预览生成成功: test.jpg
📤 准备上传文件: test.jpg, 大小: 2.5MB
✅ 文件上传成功: https://obs.com/test.jpg
✅ ProjectFile 创建成功: {
  fileUrl: "https://obs.com/test.jpg",  ← 真实URL
  data.deliveryType: "white_model"
}

消息发送日志

📧 准备发送消息到企业微信...
  文本: 老师我这里硬装模型做好了,看下是否有问题
  图片数量: 3
✅ 文本消息已发送
✅ 图片 1/3 已发送: https://obs.com/test1.jpg
✅ 图片 2/3 已发送: https://obs.com/test2.jpg
✅ 图片 3/3 已发送: https://obs.com/test3.jpg
✅ 所有消息已发送到企业微信

🧪 测试步骤

1. 测试AI分类

白模图片

  • 上传纯白色/灰色、无渲染、无家具的图片
  • 查看控制台:✅ 判定为白模阶段
  • 确认显示在"白模"tab

软装图片

  • 上传有家具、无灯光的图片
  • 查看控制台:✅ 判定为软装阶段
  • 确认显示在"软装"tab

渲染图片

  • 上传有灯光效果的图片
  • 查看控制台:✅ 判定为渲染阶段
  • 确认显示在"渲染"tab

2. 测试图片显示

企业微信端

  • 打开拖拽上传弹窗
  • 检查图片是否正常显示(非红色占位符)
  • 点击图片能否正常查看大图

移动端

  • 在手机企业微信中打开
  • 检查表格是否正常显示
  • 检查空间选项是否显示完整
  • 检查按钮是否可点击

3. 测试消息发送

步骤

  1. 上传图片并确认交付清单
  2. 等待自动弹出消息窗口
  3. 选择话术或输入自定义消息
  4. 点击"发送"
  5. 查看企业微信聊天窗口

预期结果

  • ✅ 文本消息显示在聊天中
  • ✅ 图片逐个显示在聊天中
  • ✅ 控制台显示成功日志

📋 修改文件清单

文件 修改内容 说明
image-analysis.service.ts 修复白模判断逻辑 默认值修复,放宽判断条件
drag-upload-modal.component.html 修复图片显示 使用fileUrl,添加错误处理
drag-upload-modal.component.ts 添加fileUrl字段 支持上传后URL显示
drag-upload-modal.component.scss 移动端适配CSS 响应式布局、表格显示修复
delivery-message.service.ts 企业微信消息发送 调用sendChatMessage API
stage-delivery.component.ts 详细调试日志 输出AI分析、上传、查询全过程

⚠️ 注意事项

企业微信环境

  • 只在URL包含/wxwork/时发送消息
  • 非企业微信环境会跳过发送(不报错)
  • 需要正确配置企业微信JSSDK权限

图片URL

  • 必须是公开可访问的HTTP/HTTPS URL
  • 建议使用CDN加速
  • 避免使用blob:或data:URL

移动端性能

  • 图片尽量<5MB
  • 使用loading="eager"预加载
  • 添加-webkit-overflow-scrolling: touch提升滚动体验

AI分类调优

  • 如需进一步调整,修改qualityScore阈值
  • 白模阈值:< 65
  • 软装阈值:60 ~ 80
  • 渲染阈值:70 ~ 90
  • 后期阈值:≥ 85

🚀 部署步骤

  1. 构建项目

    ng build yss-project --base-href=/dev/yss/
    
  2. 部署

    .\deploy.ps1
    
  3. 清除缓存

    • 企业微信端:清除应用缓存
    • 移动端:强制刷新页面
  4. 验证

    • 测试AI分类
    • 测试图片显示
    • 测试消息发送
    • 测试移动端显示

✅ 完成状态

功能 状态 说明
AI白模分类修复 默认值修复,放宽判断条件
图片显示修复 支持fileUrl,添加错误处理
移动端适配 响应式CSS,表格正常显示
企业微信消息发送 调用sendChatMessage API
详细调试日志 全流程日志输出

创建时间:2025-11-28 最后更新:2025-11-28
状态:✅ 所有修复已完成,待部署测试