src/views/equipmentManagement/inspectionManagement/components/formDia.vue
@@ -6,7 +6,7 @@ <el-row> <el-col :span="12"> <el-form-item label="设备名称" prop="taskId"> <el-select v-model="form.taskId" @change="setDeviceModel" filterable> <el-select v-model="form.taskId" @change="setDeviceModel"> <el-option v-for="(item, index) in deviceOptions" :key="index" @@ -18,9 +18,7 @@ </el-col> <el-col :span="12"> <el-form-item label="巡检人" prop="inspector"> <el-select v-model="form.inspector" filterable default-first-option :reserve-keyword="false" placeholder="请选择" multiple clearable> <el-select v-model="form.inspector" placeholder="请选择" multiple clearable> <el-option v-for="item in userList" :label="item.nickName" :value="item.userId" :key="item.userId"/> </el-select> </el-form-item> @@ -30,18 +28,6 @@ <el-col :span="12"> <el-form-item label="备注" prop="remarks"> <el-input v-model="form.remarks" placeholder="请输入备注" type="textarea" /> </el-form-item> </el-col> <el-col :span="12"> <el-form-item label="登记时间" prop="dateStr"> <el-date-picker v-model="form.dateStr" type="date" placeholder="选择登记日期" format="YYYY-MM-DD" value-format="YYYY-MM-DD" style="width: 100%" /> </el-form-item> </el-col> </el-row> @@ -136,8 +122,7 @@ frequencyType: '', frequencyDetail: '', week: '', time: '', dateStr: '' time: '' }, rules: { taskId: [{ required: true, message: "请选择设备", trigger: "change" },], src/views/equipmentManagement/inspectionManagement/components/viewFiles.vue
@@ -32,7 +32,7 @@ <!-- 生产后 --> <div class="form-container"> <div class="title">生产中</div> <div class="title">生产后</div> <!-- 图片列表 --> <div style="display: flex; flex-wrap: wrap;"> @@ -59,7 +59,7 @@ <!-- 生产问题 --> <div class="form-container"> <div class="title">生产后</div> <div class="title">生产问题</div> <!-- 图片列表 --> <div style="display: flex; flex-wrap: wrap;"> @@ -100,7 +100,7 @@ <!-- 视频 --> <div v-else-if="mediaType === 'video'" style="position: relative;"> <Video <video :src="mediaList[currentMediaIndex]" autoplay controls @@ -114,6 +114,7 @@ <script setup> import { ref } from 'vue'; import VueEasyLightbox from 'vue-easy-lightbox'; const { proxy } = getCurrentInstance(); // 控制弹窗显示 const dialogVisitable = ref(false); @@ -133,26 +134,83 @@ const currentMediaIndex = ref(0); const mediaList = ref([]); // 存储当前要查看的媒体列表(含图片和视频对象) const mediaType = ref('image'); // image | video const javaApi = proxy.javaApi; // 处理 URL:将 Windows 路径转换为可访问的 URL function processFileUrl(fileUrl) { if (!fileUrl) return ''; // 如果 URL 是 Windows 路径格式(包含反斜杠),需要转换 if (fileUrl && fileUrl.indexOf('\\') > -1) { // 查找 uploads 关键字的位置,从那里开始提取相对路径 const uploadsIndex = fileUrl.toLowerCase().indexOf('uploads'); if (uploadsIndex > -1) { // 从 uploads 开始提取路径,并将反斜杠替换为正斜杠 const relativePath = fileUrl.substring(uploadsIndex).replace(/\\/g, '/'); fileUrl = '/' + relativePath; } else { // 如果没有找到 uploads,提取最后一个目录和文件名 const parts = fileUrl.split('\\'); const fileName = parts[parts.length - 1]; fileUrl = '/uploads/' + fileName; } } // 确保所有非 http 开头的 URL 都拼接 baseUrl if (fileUrl && !fileUrl.startsWith('http')) { // 确保路径以 / 开头 if (!fileUrl.startsWith('/')) { fileUrl = '/' + fileUrl; } // 拼接 baseUrl fileUrl = javaApi + fileUrl; } return fileUrl; } // 处理每一类数据:分离图片和视频 function processItems(items) { const images = []; const videos = []; // 检查 items 是否存在且为数组 if (!items || !Array.isArray(items)) { return { images, videos }; } items.forEach(item => { if (item.contentType?.startsWith('image/')) { images.push(item.url); } else if (item.contentType?.startsWith('video/')) { videos.push(item.url); if (!item || !item.url) return; // 处理文件 URL const fileUrl = processFileUrl(item.url); // 根据文件扩展名判断是图片还是视频 const urlLower = fileUrl.toLowerCase(); if (urlLower.match(/\.(jpg|jpeg|png|gif|bmp|webp)$/)) { images.push(fileUrl); } else if (urlLower.match(/\.(mp4|avi|mov|wmv|flv|mkv|webm)$/)) { videos.push(fileUrl); } else if (item.contentType) { // 如果有 contentType,使用 contentType 判断 if (item.contentType.startsWith('image/')) { images.push(fileUrl); } else if (item.contentType.startsWith('video/')) { videos.push(fileUrl); } } }); return { images, videos }; } // 打开弹窗并加载数据 const openDialog = async (row) => { const { images: beforeImgs, videos: beforeVids } = processItems(row.beforeProduction); const { images: afterImgs, videos: afterVids } = processItems(row.afterProduction); const { images: issueImgs, videos: issueVids } = processItems(row.productionIssues); // 使用正确的字段名:commonFileListBefore, commonFileListAfter // productionIssues 可能不存在,使用空数组 const { images: beforeImgs, videos: beforeVids } = processItems(row.commonFileListBefore || []); const { images: afterImgs, videos: afterVids } = processItems(row.commonFileListAfter || []); const { images: issueImgs, videos: issueVids } = processItems(row.productionIssues || []); beforeProductionImgs.value = beforeImgs; beforeProductionVideos.value = beforeVids; src/views/equipmentManagement/inspectionManagement/index.vue
@@ -6,7 +6,7 @@ v-model="queryParams.taskName" placeholder="请输入巡检任务名称" clearable :style="{ width: '100%' }" style="width: 200px " /> </el-form-item> <el-form-item> @@ -33,20 +33,20 @@ </el-space> </div> <div> <div> <PIMTable :table-loading="tableLoading" :table-data="tableData" :column="tableColumns" @selection-change="handleSelectionChange" @pagination="handlePagination" :is-selection="true" :border="true" :table-style="{ width: '100%', height: 'calc(100vh - 23em)' }" :page="{ current: pageNum, size: pageSize, total: total, layout: 'total, sizes, prev, pager, next, jumper' }" @pagination="pagination" :table-style="{ width: '100%', height: 'calc(100vh - 23em)' }" > <template #inspector="{ row }"> <div class="person-tags"> @@ -68,7 +68,6 @@ </template> </PIMTable> </div> </div> </el-card> <form-dia ref="formDia" @closeDia="handleQuery"></form-dia> <view-files ref="viewFiles"></view-files> @@ -81,7 +80,6 @@ import { ElMessageBox } from "element-plus"; // 组件引入 import Pagination from "@/components/Pagination/index.vue"; import PIMTable from "@/components/PIMTable/PIMTable.vue"; import FormDia from "@/views/equipmentManagement/inspectionManagement/components/formDia.vue"; import ViewFiles from "@/views/equipmentManagement/inspectionManagement/components/viewFiles.vue"; @@ -129,12 +127,12 @@ prop: "frequencyType", label: "频次", minWidth: 150, formatData: (cell) => ({ formatter: (_, __, val) => ({ DAILY: "每日", WEEKLY: "每周", MONTHLY: "每月", QUARTERLY: "季度" }[cell] || "") }[val] || "") }, { prop: "frequencyDetail", @@ -158,7 +156,7 @@ } }, { prop: "registrant", label: "登记人", minWidth: 100 }, { prop: "dateStr", label: "登记日期", minWidth: 100 }, { prop: "createTime", label: "登记日期", minWidth: 100 }, ]); // 操作列配置 @@ -219,9 +217,10 @@ pageSize.value = 10; getList(); }; const pagination = (obj) => { pageNum.value = obj.page; pageSize.value = obj.limit; // 分页处理 const handlePagination = (val) => { pageNum.value = val.page; pageSize.value = val.limit; getList(); }; // 获取列表数据