hookehuyr

fix(plan): 修复计划书文件预览功能,恢复 useFileOperation 依赖

修复消息详情页点击"查计划书"后 PDF/Office 文件无法打开的问题。

问题根因:
- 2026-02-14 重构时删除了 useFileOperation 依赖
- 所有文件都错误地使用 Taro.previewImage(仅支持图片)

修复内容:
- 恢复 useFileOperation composable 的依赖
- handleFileView 使用 viewFile 方法支持多种文件类型
- 图片、PDF、Office 文档现在都能正确预览

经验教训:
- 重构时必须验证代码等价性
- 删除依赖前需理解其完整作用
- 已将此案例记录到全局规则 refactor-traps.md

Co-Authored-By: Claude Opus 4.6 <noreply@anthropic.com>
......@@ -5,16 +5,16 @@
* @module composables/usePlanView
* @author Claude Code
* @created 2026-02-14
* @version 1.1.0 - 增强错误处理,添加完整日志
* @version 1.2.0 - 修复文件预览功能,恢复 useFileOperation 依赖
* @example
* const { viewProposal } = usePlanView()
* await viewProposal({ id: 123, proposal_files: [...] })
*/
import { ref } from 'vue'
import Taro from '@tarojs/taro'
import { mapOrderStatus, getStatusText } from '@/config/constants/orderStatus'
import { viewAPI } from '@/api/plan'
import { useFileOperation } from './useFileOperation'
export const viewProposal = async (proposal, callbacks = {}) => {
const { beforeView, onViewSuccess, onViewError, onError } = callbacks
......@@ -134,39 +134,14 @@ const handleFileView = async (file, emitError) => {
return false
}
const hasShownOfficeTip = ref(false)
const isOffice = ['doc', 'docx', 'xls', 'xlsx', 'ppt', 'pptx']
try {
if (file.file_type && isOffice.includes(file.file_type)) {
if (!hasShownOfficeTip.value) {
const res = await Taro.showModal({
title: '提示',
content: 'Office 文档建议使用电脑端查看',
confirmText: '继续',
cancelText: '取消'
})
if (res.confirm) {
hasShownOfficeTip.value = true
} else {
console.log('[usePlanView] 用户取消 Office 文档预览')
return false
}
}
}
const previewImage = Taro.previewImage
if (typeof previewImage !== 'function') {
return true
}
await previewImage({
current: file.file_url,
urls: [file.file_url]
// 使用 useFileOperation 的 viewFile 方法,支持多种文件类型
const { viewFile } = useFileOperation()
const result = await viewFile({
downloadUrl: file.file_url,
fileName: file.file_name
})
return true
return result
} catch (error) {
console.error('[usePlanView] 文件预览失败:', error)
......