From e72543cb2b5c8cc0cdfbf724b14a2ac9e9cd1e75 Mon Sep 17 00:00:00 2001 From: hebo Date: Sun, 14 Sep 2025 17:28:02 +0800 Subject: [PATCH] =?UTF-8?q?=E9=80=89=E8=AF=BE=E8=B0=83=E6=95=B4?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- src/components/BasicNjBjSelect/demo.vue | 2 + .../quantitativeSummary.vue | 78 +- src/pages/view/routine/gwlz/gwFlow.vue | 782 ++++++++++++++---- src/pages/view/routine/gwlz/index.vue | 41 +- .../view/routine/kefuxuncha/kyRecord.vue | 3 + .../view/routine/kefuxuncha/kyXkList.vue | 1 + .../view/routine/kefuxuncha/kyXkkcDetail.vue | 1 + src/static/base/view/excel.png | Bin 0 -> 6798 bytes src/static/base/view/pdf.png | Bin 0 -> 4937 bytes src/static/base/view/ppt.png | Bin 0 -> 5984 bytes src/static/base/view/word.png | Bin 0 -> 6827 bytes src/static/base/view/zip.png | Bin 0 -> 4974 bytes 12 files changed, 722 insertions(+), 186 deletions(-) create mode 100644 src/static/base/view/excel.png create mode 100644 src/static/base/view/pdf.png create mode 100644 src/static/base/view/ppt.png create mode 100644 src/static/base/view/word.png create mode 100644 src/static/base/view/zip.png diff --git a/src/components/BasicNjBjSelect/demo.vue b/src/components/BasicNjBjSelect/demo.vue index b7af54c..f18c646 100644 --- a/src/components/BasicNjBjSelect/demo.vue +++ b/src/components/BasicNjBjSelect/demo.vue @@ -155,3 +155,5 @@ const setDefaultValue = () => { + + diff --git a/src/pages/view/quantitativeAssessment/quantitativeSummary/quantitativeSummary.vue b/src/pages/view/quantitativeAssessment/quantitativeSummary/quantitativeSummary.vue index a29bac6..237867d 100644 --- a/src/pages/view/quantitativeAssessment/quantitativeSummary/quantitativeSummary.vue +++ b/src/pages/view/quantitativeAssessment/quantitativeSummary/quantitativeSummary.vue @@ -13,7 +13,7 @@ @@ -65,9 +65,56 @@ onMounted(() => { height.value = getWindowHeight() }) -const head = ref([]) +const head = ref([]) const dataLiat = ref([]) +// 获取检查项基础分:baseScore * 5 +function getBaseScore(ditem: any) { + const inspectItem = head.value.find(item => item.id === ditem.id); + if (inspectItem && inspectItem.baseScore) { + return inspectItem.baseScore * 5; + } + return 0; +} + +// 计算单个检查项得分:baseScore * 5 - 扣分项 +function calculateItemScore(bitem: any, ditem: any) { + if (bitem.itemScoreMap && bitem.itemScoreMap[ditem.id]) { + // 找到对应的检查项获取baseScore + const inspectItem = head.value.find(item => item.id === ditem.id); + if (inspectItem && inspectItem.baseScore) { + const baseScore = inspectItem.baseScore * 5; // 基础分 + const deduction = bitem.itemScoreMap[ditem.id]; // 扣分项(负数) + // 得分 = baseScore * 5 - 扣分项 + return baseScore + deduction; // deduction是负数,所以用加法 + } + } + return 0; +} + +// 计算总分:所有检查项汇总 +function calculateTotalScore(bitem: any) { + let totalScore = 0; + + // 遍历所有检查项(从head中获取) + head.value.forEach(item => { + if (item.id && item.baseScore) { + const baseScore = item.baseScore * 5; // 基础分 + let deduction = 0; // 扣分项 + + // 如果有扣分记录,获取扣分 + if (bitem.itemScoreMap && bitem.itemScoreMap[item.id]) { + deduction = bitem.itemScoreMap[item.id]; + } + + // 得分 = baseScore * 5 - 扣分项 + totalScore += baseScore + deduction; // deduction是负数,所以用加法 + } + }); + + return totalScore; +} + async function getWeekData() { let res = await inspectItemFindAllApi(); let arr: any = [{name: "班级,得分"}]; @@ -79,8 +126,25 @@ async function getWeekData() { // arr.push(); head.value = arr let res1 = await evaluationGetWeekReportApi(); - const grouped = groupBy(res1.result, 'gradeNum'); - dataLiat.value = values(grouped); + + // 按年级分组,但保持排序 + // 提取年级名称进行分组 + const grouped = groupBy(res1.result, (item) => { + // 从"一年级1班"中提取"一年级" + const match = item.gradeFullName.match(/^(.+?)(\d+班)$/); + return match ? match[1] : item.gradeFullName; + }); + + // 获取所有年级并排序(按年级名称排序) + const gradeNames = Object.keys(grouped).sort((a, b) => { + // 提取年级数字进行排序 + const numA = parseInt(a.replace(/[^\d]/g, '')) || 0; + const numB = parseInt(b.replace(/[^\d]/g, '')) || 0; + return numA - numB; + }); + + // 按排序后的年级顺序重新组织数据 + dataLiat.value = gradeNames.map(gradeName => grouped[gradeName]); // forEach(result, (data) => { // let rowDatas: any = []; // if (data && data.length > 0) { diff --git a/src/pages/view/routine/gwlz/gwFlow.vue b/src/pages/view/routine/gwlz/gwFlow.vue index 675b9a1..1df893a 100644 --- a/src/pages/view/routine/gwlz/gwFlow.vue +++ b/src/pages/view/routine/gwlz/gwFlow.vue @@ -30,70 +30,21 @@ 附件 - + - 🖼️ - 🎥 - 📄 - 📎 - - - {{ gwInfo.fileName || '未知文件' }} - {{ (gwInfo.fileFormat || 'unknown').toUpperCase() }} - - - - - - - - - - - - - 🖼️ - 🎥 - 📄 - 📎 {{ getFileName(file) }} - {{ formatFileSize(file.size) }} - {{ getFileSuffix(file).toUpperCase() }} @@ -208,7 +159,6 @@ {{ formatTime(log.operationTime) }} - {{ log.operationType }} {{ log.operationContent }} @@ -265,7 +215,7 @@ - + 操作详情 @@ -287,6 +237,48 @@ + + + + + + 文件下载 + + + + 文件名: + {{ downloadFileName }} + + + 下载路径: + 将下载到默认下载目录 + + + 点击确认后将开始下载文件 + + + + + 正在下载文件,请稍候... + + + + + + + + @@ -305,7 +297,8 @@ import { canPreview, previewFile as previewFileUtil, previewVideo as previewVideoUtil, - previewImage as previewImageUtil + previewImage as previewImageUtil, + downloadFile } from "@/utils/filePreview"; // 类型定义 @@ -332,6 +325,7 @@ interface GwInfo { } interface FileInfo { + id?: string; // 文件ID name: string; size: number; url: string; @@ -379,6 +373,10 @@ const gwId = ref(""); // 弹窗控制 const showLogDetailModal = ref(false); +const showDownloadModal = ref(false); +const downloadUrl = ref(''); +const downloadFileName = ref(''); +const isDownloading = ref(false); // 用户store const { getUser, getJs } = useUserStore(); @@ -396,9 +394,54 @@ const ccExpanded = ref(false); // 操作记录展开状态 const logExpanded = ref(false); +// 计算属性:解析后的附件列表 +const parsedAttachments = computed(() => { + const attachments = []; + + // 处理files数组 + if (gwInfo.value.files && gwInfo.value.files.length > 0) { + attachments.push(...gwInfo.value.files); + } + // 处理逗号分隔的fileUrl字符串 + else if (gwInfo.value.fileUrl) { + const fileUrls = gwInfo.value.fileUrl.split(',').map(url => url.trim()).filter(url => url); + + // 解析fileName字符串(如果存在) + let fileNames: string[] = []; + if (gwInfo.value.fileName) { + fileNames = gwInfo.value.fileName.split(',').map(name => name.trim()).filter(name => name); + } + + // 将URL字符串转换为文件对象 + fileUrls.forEach((url, index) => { + // 优先使用解析出的文件名,如果没有则从URL提取 + let displayName = fileNames[index] || url.split('/').pop() || `文件${index + 1}`; + const fileFormat = url.split('.').pop() || 'unknown'; + + // 如果文件名包含扩展名,去掉扩展名(保持resourName不包含扩展名) + let resourName = displayName; + if (displayName.includes('.' + fileFormat)) { + resourName = displayName.replace('.' + fileFormat, ''); + } + + attachments.push({ + id: `file_${index}`, + name: displayName, // 保持原始文件名(可能包含扩展名) + url: url, + resourUrl: url, + resourName: resourName, // 不包含扩展名的文件名 + resSuf: fileFormat, + size: 0 // 无法从URL获取大小 + }); + }); + } + + return attachments; +}); + // 计算属性:是否有附件 const hasAttachments = computed(() => { - return gwInfo.value.fileUrl || (gwInfo.value.files && gwInfo.value.files.length > 0); + return parsedAttachments.value.length > 0; }); // 计算属性:显示的抄送人列表 @@ -683,7 +726,13 @@ const getCurrentUserApproverId = (currentUserId: string) => { }; // 预览单个附件(从gwInfo直接获取) -const previewSingleFile = () => { +const previewSingleFile = (event?: Event) => { + // 手动阻止事件冒泡 + if (event) { + event.stopPropagation(); + event.preventDefault(); + } + if (!gwInfo.value.fileUrl) { return; } @@ -706,69 +755,34 @@ const previewSingleFile = () => { }; // 下载单个附件 -const downloadSingleFile = () => { +const downloadSingleFile = (event?: Event) => { + // 手动阻止事件冒泡 + if (event) { + event.stopPropagation(); + event.preventDefault(); + } + if (!gwInfo.value.fileUrl) { return; } - const fileUrl = imagUrl(gwInfo.value.fileUrl); + const finalUrl = imagUrl(gwInfo.value.fileUrl); const fileName = gwInfo.value.fileName || '未知文件'; const fileFormat = gwInfo.value.fileFormat || ''; const fullFileName = fileFormat ? `${fileName}.${fileFormat}` : fileName; - // 方法1: 使用 fetch 和 blob 方式强制下载 - fetch(fileUrl) - .then(response => { - if (!response.ok) { - throw new Error('网络请求失败'); - } - return response.blob(); - }) - .then(blob => { - const downloadUrl = window.URL.createObjectURL(blob); - const link = document.createElement('a'); - link.href = downloadUrl; - link.download = fullFileName; // 使用 download 属性强制下载 - link.style.display = 'none'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - window.URL.revokeObjectURL(downloadUrl); - - uni.showToast({ - title: '开始下载', - icon: 'success' - }); - }) - .catch(error => { - console.error('fetch下载失败:', error); - // 方法2: 如果fetch失败,尝试直接打开链接 - try { - const link = document.createElement('a'); - link.href = fileUrl; - link.download = fullFileName; - link.target = '_blank'; - link.style.display = 'none'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - - uni.showToast({ - title: '开始下载', - icon: 'success' - }); - } catch (fallbackError) { - console.error('备用下载也失败:', fallbackError); - uni.showToast({ - title: '下载失败', - icon: 'error' - }); - } - }); + // 显示下载路径选择弹窗 + showDownloadPathModal(finalUrl, fullFileName); }; // 文件预览 -const previewFile = (file: FileInfo) => { +const previewFile = (file: FileInfo, event?: Event) => { + // 手动阻止事件冒泡 + if (event) { + event.stopPropagation(); + event.preventDefault(); + } + // 确定文件URL和名称 const fileUrl = file.resourUrl ? imagUrl(file.resourUrl) : file.url; const fileName = file.resourName ? `${file.resourName}.${file.resSuf}` : file.name; @@ -848,65 +862,22 @@ const handlePreviewImageSingle = (imageUrl: string) => { }); }; -// 文件下载 -const downloadFile = (file: FileInfo) => { - downloadFileAction(file); -}; - -// 文件下载实现 -const downloadFileAction = (file: FileInfo) => { - const fileUrl = file.resourUrl ? imagUrl(file.resourUrl) : file.url; - const fileName = file.resourName ? `${file.resourName}.${file.resSuf}` : file.name; +// 文件下载 - 支持选择下载路径 +const downloadFileAction = (file: FileInfo, event?: Event) => { + // 手动阻止事件冒泡 + if (event) { + event.stopPropagation(); + event.preventDefault(); + } - // 方法1: 使用 fetch 和 blob 方式强制下载 - fetch(fileUrl) - .then(response => { - if (!response.ok) { - throw new Error('网络请求失败'); - } - return response.blob(); - }) - .then(blob => { - const downloadUrl = window.URL.createObjectURL(blob); - const link = document.createElement('a'); - link.href = downloadUrl; - link.download = fileName; // 使用 download 属性强制下载 - link.style.display = 'none'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - window.URL.revokeObjectURL(downloadUrl); - - uni.showToast({ - title: '开始下载', - icon: 'success' - }); - }) - .catch(error => { - console.error('fetch下载失败:', error); - // 方法2: 如果fetch失败,尝试直接打开链接 - try { - const link = document.createElement('a'); - link.href = fileUrl; - link.download = fileName; - link.target = '_blank'; - link.style.display = 'none'; - document.body.appendChild(link); - link.click(); - document.body.removeChild(link); - - uni.showToast({ - title: '开始下载', - icon: 'success' - }); - } catch (fallbackError) { - console.error('备用下载也失败:', fallbackError); - uni.showToast({ - title: '下载失败', - icon: 'error' - }); - } - }); + const finalUrl = file.resourUrl ? imagUrl(file.resourUrl) : imagUrl(file.url); + // 获取原始文件名 + const originalFileName = getOriginalFileName(file); + + console.log('下载文件:', { finalUrl, originalFileName, file }); + + // 显示下载路径选择弹窗 + showDownloadPathModal(finalUrl, originalFileName); }; // 格式化时间 @@ -952,6 +923,31 @@ const getFileSuffix = (file: FileInfo) => { return 'unknown'; }; +// 获取文件图标 +const getFileIcon = (fileType: string) => { + const type = fileType.toLowerCase(); + + switch (type) { + case 'pdf': + return '/static/base/view/pdf.png'; + case 'doc': + case 'docx': + return '/static/base/view/word.png'; + case 'xls': + case 'xlsx': + return '/static/base/view/excel.png'; + case 'ppt': + case 'pptx': + return '/static/base/view/ppt.png'; + case 'zip': + case 'rar': + case '7z': + return '/static/base/view/zip.png'; + default: + return '/static/base/view/more.png'; + } +}; + // 获取状态样式类 const getStatusClass = (status: any) => { const statusMap: Record = { @@ -1040,6 +1036,314 @@ const getUrgencyText = (level: string) => { return levelMap[level] || "未知"; }; +// 获取原始文件名 +const getOriginalFileName = (file: FileInfo) => { + // 优先使用resourName,如果没有则使用name,确保文件名正确 + let fileName = ''; + if (file.resourName) { + // 如果resourName已经包含扩展名,直接使用 + if (file.resSuf && !file.resourName.includes('.' + file.resSuf)) { + fileName = `${file.resourName}.${file.resSuf}`; + } else { + fileName = file.resourName; + } + } else if (file.name) { + // 如果name已经包含扩展名,直接使用 + if (file.resSuf && !file.name.includes('.' + file.resSuf)) { + fileName = `${file.name}.${file.resSuf}`; + } else { + fileName = file.name; + } + } else { + // 最后备用方案,从URL提取文件名 + const urlFileName = file.url.split('/').pop() || '未知文件'; + fileName = urlFileName; + } + + return fileName; +}; + +// 显示下载路径选择弹窗 +const showDownloadPathModal = (url: string, fileName: string) => { + downloadUrl.value = url; + downloadFileName.value = fileName; + showDownloadModal.value = true; +}; + +// 确认下载 +const confirmDownload = () => { + // 设置下载状态 + isDownloading.value = true; + + // 检查当前平台 + const systemInfo = uni.getSystemInfoSync(); + const { platform } = systemInfo; + + // 备用检测方法 + const isH5 = platform === 'web' || typeof window !== 'undefined'; + + console.log('平台检测:', { platform, systemInfo, isH5 }); + + if (isH5) { + console.log('使用H5下载方式'); + // H5环境下使用直接链接下载,避免跨域问题 + downloadForH5(downloadUrl.value, downloadFileName.value); + } else { + console.log('使用原生下载方式'); + // 原生环境下使用原有下载方式 + downloadFile(downloadUrl.value, downloadFileName.value) + .then(() => { + // 下载成功后关闭弹窗 + isDownloading.value = false; + showDownloadModal.value = false; + uni.showToast({ + title: "下载成功", + icon: "success", + }); + }) + .catch((error) => { + console.error('下载失败:', error); + // 下载失败后也关闭弹窗 + isDownloading.value = false; + showDownloadModal.value = false; + uni.showToast({ + title: "下载失败", + icon: "error", + }); + }); + } +}; + +// H5环境下的下载方法 +const downloadForH5 = (url: string, fileName: string) => { + try { + console.log('H5下载开始:', { url, fileName }); + + // 直接使用强制下载方式,避免打开文件 + forceDownload(url, fileName); + + } catch (error) { + console.error('H5下载失败:', error); + // 如果整个方法失败,回退到直接链接方式 + fallbackDownload(url, fileName); + } +}; + +// 强制下载方法 +const forceDownload = (url: string, fileName: string) => { + try { + console.log('尝试强制下载:', { url, fileName }); + + // 方法1: 使用fetch下载文件内容,然后创建blob下载 + fetch(url, { + method: 'GET', + mode: 'cors', + cache: 'no-cache' + }) + .then(response => { + if (!response.ok) { + throw new Error(`HTTP error! status: ${response.status}`); + } + return response.blob(); + }) + .then(blob => { + console.log('文件下载成功,创建blob下载'); + + // 创建blob URL + const blobUrl = window.URL.createObjectURL(blob); + + // 创建下载链接 + const link = document.createElement('a'); + link.href = blobUrl; + link.download = fileName; + link.style.display = 'none'; + + // 添加到DOM并触发点击 + document.body.appendChild(link); + link.click(); + + // 清理DOM和blob URL + document.body.removeChild(link); + window.URL.revokeObjectURL(blobUrl); + + // 下载成功后关闭弹窗 + isDownloading.value = false; + showDownloadModal.value = false; + uni.showToast({ + title: "下载成功", + icon: "success", + }); + }) + .catch(error => { + console.error('Fetch下载失败,尝试其他方法:', error); + // 如果fetch失败,尝试其他方法 + tryAlternativeDownload(url, fileName); + }); + + } catch (error) { + console.error('强制下载失败,尝试其他方法:', error); + tryAlternativeDownload(url, fileName); + } +}; + +// 尝试替代下载方法 +const tryAlternativeDownload = (url: string, fileName: string) => { + console.log('尝试替代下载方法'); + + // 方法1: 使用XMLHttpRequest下载 + try { + const xhr = new XMLHttpRequest(); + xhr.open('GET', url, true); + xhr.responseType = 'blob'; + + xhr.onload = function() { + if (xhr.status === 200) { + const blob = xhr.response; + const blobUrl = window.URL.createObjectURL(blob); + + const link = document.createElement('a'); + link.href = blobUrl; + link.download = fileName; + link.style.display = 'none'; + + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + + window.URL.revokeObjectURL(blobUrl); + + // 下载成功后关闭弹窗 + isDownloading.value = false; + showDownloadModal.value = false; + uni.showToast({ + title: "下载成功", + icon: "success", + }); + + console.log('XMLHttpRequest下载成功'); + } else { + throw new Error(`HTTP error! status: ${xhr.status}`); + } + }; + + xhr.onerror = function() { + console.error('XMLHttpRequest下载失败'); + console.log('调用手动下载提示'); + showManualDownloadModal(url, fileName); + }; + + xhr.send(); + + } catch (error) { + console.error('XMLHttpRequest失败:', error); + console.log('调用手动下载提示(catch)'); + showManualDownloadModal(url, fileName); + } +}; + +// 显示手动下载提示 +const showManualDownloadModal = (url: string, fileName: string) => { + console.log('尝试原生下载'); + + // 尝试使用浏览器原生下载 + try { + const link = document.createElement('a'); + link.href = url; + link.download = fileName; + link.target = '_blank'; + link.style.display = 'none'; + + document.body.appendChild(link); + link.click(); + document.body.removeChild(link); + + console.log('原生下载已触发'); + + // 延迟关闭弹窗,给用户时间看到下载开始 + setTimeout(() => { + isDownloading.value = false; + showDownloadModal.value = false; + }, 1000); + + uni.showToast({ + title: "开始下载", + icon: "success", + }); + } catch (error) { + console.error('原生下载失败:', error); + // 下载失败也关闭弹窗 + isDownloading.value = false; + showDownloadModal.value = false; + uni.showToast({ + title: "下载失败", + icon: "error", + }); + } +}; + +// 直接下载方法 +const directDownload = (url: string, fileName: string) => { + try { + // 修改URL添加下载参数 + const downloadUrl = url.includes('?') + ? `${url}&download=1&attachment=1` + : `${url}?download=1&attachment=1`; + + const link = document.createElement('a'); + link.href = downloadUrl; + link.download = fileName; + link.target = '_self'; // 使用_self而不是_blank + link.style.display = 'none'; + + // 添加到DOM并触发点击 + document.body.appendChild(link); + link.click(); + + // 清理DOM + document.body.removeChild(link); + + uni.showToast({ + title: "开始下载", + icon: "success", + }); + + } catch (error) { + console.error('直接下载失败:', error); + // 最后的方法:提示用户手动下载 + uni.showModal({ + title: '下载提示', + content: `由于浏览器限制,无法自动下载文件。请长按链接手动保存:\n${url}`, + showCancel: false, + confirmText: '知道了' + }); + } +}; + +// 备用下载方法 +const fallbackDownload = (url: string, fileName: string) => { + try { + console.log('使用备用下载方法'); + + // 使用直接下载方法 + directDownload(url, fileName); + + } catch (error) { + console.error('备用下载也失败:', error); + // 最后的方法:提示用户手动下载 + uni.showModal({ + title: '下载提示', + content: `由于浏览器限制,无法自动下载文件。请长按链接手动保存:\n${url}`, + showCancel: false, + confirmText: '知道了' + }); + } +}; + +// 取消下载 +const cancelDownload = () => { + showDownloadModal.value = false; +}; + // 获取创建人名称 const getCreatorName = (tjrId: string) => { if (!tjrId) return "未知"; @@ -1232,9 +1536,16 @@ onMounted(() => { .file-icon { margin-right: 12px; - font-size: 24px; width: 32px; - text-align: center; + height: 32px; + display: flex; + align-items: center; + justify-content: center; + + .icon-image { + width: 28px; + height: 28px; + } } .file-info { @@ -1524,4 +1835,121 @@ onMounted(() => { } } } + +.download-modal { + width: 85vw; + max-width: 450px; + padding: 20px; + background: #fff; + border-radius: 12px; + + .download-header { + text-align: center; + margin-bottom: 20px; + padding-bottom: 15px; + border-bottom: 1px solid #eee; + + .download-title { + font-size: 18px; + font-weight: bold; + color: #333; + } + } + + .download-content { + margin-bottom: 25px; + + .file-info-section { + display: flex; + align-items: flex-start; + margin-bottom: 15px; + + .file-label { + font-weight: 500; + color: #666; + margin-right: 10px; + flex-shrink: 0; + width: 60px; + } + + .file-name { + color: #333; + font-size: 14px; + word-break: break-all; + flex: 1; + background: #f8f9fa; + padding: 8px 12px; + border-radius: 6px; + border: 1px solid #e9ecef; + } + } + + .path-info-section { + display: flex; + align-items: center; + margin-bottom: 15px; + + .path-label { + font-weight: 500; + color: #666; + margin-right: 10px; + flex-shrink: 0; + width: 60px; + } + + .path-text { + color: #007aff; + font-size: 14px; + flex: 1; + } + } + + .download-tips { + text-align: center; + + .tips-text { + color: #999; + font-size: 12px; + } + } + } + + .download-actions { + display: flex; + justify-content: center; + gap: 10px; + + .u-button { + flex: 1; + max-width: 120px; + } + } + + .download-progress { + display: flex; + flex-direction: column; + align-items: center; + padding: 20px 0; + + .progress-spinner { + width: 24px; + height: 24px; + border: 2px solid #f3f3f3; + border-top: 2px solid #007aff; + border-radius: 50%; + animation: spin 1s linear infinite; + margin-bottom: 10px; + } + + .progress-text { + color: #666; + font-size: 14px; + } + } +} + +@keyframes spin { + 0% { transform: rotate(0deg); } + 100% { transform: rotate(360deg); } +} diff --git a/src/pages/view/routine/gwlz/index.vue b/src/pages/view/routine/gwlz/index.vue index f5d6f9a..ccaa049 100644 --- a/src/pages/view/routine/gwlz/index.vue +++ b/src/pages/view/routine/gwlz/index.vue @@ -79,7 +79,11 @@ @click="previewAttachmentFile(file)" > - 📄 + {{ getFileName(file) }} @@ -529,6 +533,30 @@ const getFileSuffix = (file: FileInfo) => { return 'unknown'; }; +// 获取文件图标 +const getFileIcon = (fileType: string) => { + const type = fileType.toLowerCase(); + switch (type) { + case 'pdf': + return '/static/base/view/pdf.png'; + case 'doc': + case 'docx': + return '/static/base/view/word.png'; + case 'xls': + case 'xlsx': + return '/static/base/view/excel.png'; + case 'ppt': + case 'pptx': + return '/static/base/view/ppt.png'; + case 'zip': + case 'rar': + case '7z': + return '/static/base/view/zip.png'; + default: + return '/static/base/view/more.png'; + } +}; + // 监听数据变化 watch(dataList, (val) => { // 数据变化监听 @@ -810,8 +838,17 @@ onUnmounted(() => { .attachment-icon { margin-right: 6px; - font-size: 16px; + width: 20px; + height: 20px; + display: flex; + align-items: center; + justify-content: center; flex-shrink: 0; + + .icon-image { + width: 18px; + height: 18px; + } } .attachment-name { diff --git a/src/pages/view/routine/kefuxuncha/kyRecord.vue b/src/pages/view/routine/kefuxuncha/kyRecord.vue index 3e5fd0a..799ffec 100644 --- a/src/pages/view/routine/kefuxuncha/kyRecord.vue +++ b/src/pages/view/routine/kefuxuncha/kyRecord.vue @@ -174,6 +174,9 @@ let inspectionParams = ref({ rows: 10, kyXcId: xkkc.value.id, jsId: js.value.id, + njId: xkkc.value.njId, + bjId: xkkc.value.bjId, + njmcId: xkkc.value.njmcId, }); // 巡查记录列表 diff --git a/src/pages/view/routine/kefuxuncha/kyXkList.vue b/src/pages/view/routine/kefuxuncha/kyXkList.vue index 33f442c..8232ca2 100644 --- a/src/pages/view/routine/kefuxuncha/kyXkList.vue +++ b/src/pages/view/routine/kefuxuncha/kyXkList.vue @@ -269,6 +269,7 @@ const goXc = (xkkc: any) => { ...xkkc, id: xkkc.id, // 课程记录ID pbId: pbData.id, // 排班ID - 确保使用正确的排班ID + pbJsId: xkkc.id, // 将课程记录ID作为pbJsId传递 xclx: pbData.xclx, xcbt: pbData.xcbt, xqmc: pbData.xqmc, diff --git a/src/pages/view/routine/kefuxuncha/kyXkkcDetail.vue b/src/pages/view/routine/kefuxuncha/kyXkkcDetail.vue index a42043e..58e0270 100644 --- a/src/pages/view/routine/kefuxuncha/kyXkkcDetail.vue +++ b/src/pages/view/routine/kefuxuncha/kyXkkcDetail.vue @@ -521,6 +521,7 @@ const submit = async () => { njId: xkkc.value.njId || '', // 确保年级ID不为空 njmcId: xkkc.value.njmcId || '', // 确保年级名称ID不为空 bjId: xkkc.value.bjId || '', // 确保班级ID不为空 + pbJsId: xkkc.value.pbJsId || xkkc.value.id, // 使用传递的pbJsId或课程记录ID xctime: now.format("YYYY-MM-DD HH:mm:ss"), zp: getImageUrls(), sp: getVideoUrls(), diff --git a/src/static/base/view/excel.png b/src/static/base/view/excel.png new file mode 100644 index 0000000000000000000000000000000000000000..697849ae99fc8b36892512e878f011c080862e9e GIT binary patch literal 6798 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 z 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 Ba*+T4 literal 0 HcmV?d00001 diff --git a/src/static/base/view/pdf.png b/src/static/base/view/pdf.png new file mode 100644 index 0000000000000000000000000000000000000000..3254950437fc782197fc2a41a5b183909fdbc08d GIT binary patch literal 4937 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