Browse Source

2026-01-08

QC工作文件增加SOP文件
master
fengyuan_yang 4 days ago
parent
commit
8774a0e5ed
  1. 2
      src/api/qc/qc.js
  2. 81
      src/views/modules/qc/FQCResultEntry.vue
  3. 121
      src/views/modules/qc/IPQCResultEntry.vue
  4. 107
      src/views/modules/qc/IQCResultEntry.vue
  5. 128
      src/views/modules/qc/OQCResultEntry.vue
  6. 80
      src/views/modules/yieldReport/com_process_inspection.vue

2
src/api/qc/qc.js

@ -244,6 +244,8 @@ export const getCustomerList = data => createAPI(`/pms/qc/getCustomerList`,'post
// ===================================== SOP清单 ===================================== // ===================================== SOP清单 =====================================
export const sopListSearch = data => createAPI(`/pms/qc/sopListSearch`,'post',data) export const sopListSearch = data => createAPI(`/pms/qc/sopListSearch`,'post',data)
export const sopAvailableFiles = data => createAPI(`/pms/qc/sopAvailableFiles`,'post',data) export const sopAvailableFiles = data => createAPI(`/pms/qc/sopAvailableFiles`,'post',data)
// 查询检验页面的SOP文件列表(IPQC/IQC/FQC/OQC/过程检验)
export const searchQcSopFileList = data => createAPI(`/pms/qc/searchQcSopFileList`,'post',data)
export const sopFileUploadSave = data => createAPI(`/pms/qc/sopFileUploadSave`,'post',data) export const sopFileUploadSave = data => createAPI(`/pms/qc/sopFileUploadSave`,'post',data)
export const sopRecordDelete = data => createAPI(`/pms/qc/sopList/delete`,'post',data) export const sopRecordDelete = data => createAPI(`/pms/qc/sopList/delete`,'post',data)
export const downloadSopFile = sopUrl => createAPI(`/pms/qc/downloadSopFile?sopUrl=${encodeURIComponent(sopUrl)}`,'post', 777) export const downloadSopFile = sopUrl => createAPI(`/pms/qc/downloadSopFile?sopUrl=${encodeURIComponent(sopUrl)}`,'post', 777)

81
src/views/modules/qc/FQCResultEntry.vue

@ -919,13 +919,31 @@
</el-dialog> </el-dialog>
<!-- 文件清单 --> <!-- 文件清单 -->
<el-dialog title="文件清单" :close-on-click-modal="false" v-drag :visible.sync="fileFlag" width="800px">
<el-form :inline="true" label-position="top">
<el-form-item v-if="detailInformationFlag">
<el-button type="primary" @click="addUploadFileModal">上传文件</el-button>
</el-form-item>
</el-form>
<iqc-file-table :columns="fileColumnList" :data-list="fileContentList" :query-loading="fileLoading"></iqc-file-table>
<el-dialog title="文件清单" :close-on-click-modal="false" v-drag :visible.sync="fileFlag" width="900px">
<el-tabs v-model="fileActiveTab" type="border-card">
<el-tab-pane label="QC检验文件" name="qcFile">
<el-form :inline="true" label-position="top" style="margin-bottom: 10px;">
<el-form-item v-if="detailInformationFlag">
<el-button type="primary" size="small" @click="addUploadFileModal">上传文件</el-button>
</el-form-item>
</el-form>
<iqc-file-table :columns="fileColumnList" :data-list="fileContentList" :query-loading="fileLoading"></iqc-file-table>
</el-tab-pane>
<el-tab-pane label="SOP文件" name="sopFile">
<el-table :data="sopFileList" border v-loading="sopFileLoading" height="350" style="width: 100%;">
<el-table-column prop="sopName" header-align="center" align="left" label="文件名称" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column prop="fileType" header-align="center" align="center" label="文件类型" width="100"></el-table-column>
<el-table-column prop="version" header-align="center" align="center" label="版本号" width="80"></el-table-column>
<el-table-column prop="createdBy" header-align="center" align="center" label="上传人" width="100"></el-table-column>
<el-table-column prop="creationDate" header-align="center" align="center" label="上传时间" width="150"></el-table-column>
<el-table-column fixed="right" header-align="center" align="center" width="80" label="操作">
<template slot-scope="scope">
<el-link type="primary" @click="previewSopFile(scope.row)">预览</el-link>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<el-footer style="height:35px;margin-top: 10px;text-align:center"> <el-footer style="height:35px;margin-top: 10px;text-align:center">
<el-button type="primary" @click="fileFlag = false">关闭</el-button> <el-button type="primary" @click="fileFlag = false">关闭</el-button>
</el-footer> </el-footer>
@ -1258,6 +1276,7 @@
import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js" import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js"
import Chooselist from '@/views/modules/common/Chooselist_eam' import Chooselist from '@/views/modules/common/Chooselist_eam'
import {getInspectionFile} from '@/api/eam/eam_object_list.js' import {getInspectionFile} from '@/api/eam/eam_object_list.js'
import { searchQcSopFileList, downloadSopFile } from '@/api/qc/qc.js'
import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js' import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js'
import {qcPrint} from '@/api/qc/qcPrint.js' import {qcPrint} from '@/api/qc/qcPrint.js'
import excel from "@/utils/excel-util.js" import excel from "@/utils/excel-util.js"
@ -1325,6 +1344,10 @@
inspectionNo: '', inspectionNo: '',
fileFlag: false, fileFlag: false,
fileContentList: [], fileContentList: [],
fileActiveTab: 'qcFile',
sopFileList: [],
sopFileLoading: false,
currentFileRow: null,
// //
favorite: false, favorite: false,
// start // start
@ -3526,6 +3549,8 @@
// //
getFileContentData (row) { getFileContentData (row) {
this.currentFileRow = row
this.fileActiveTab = 'qcFile'
let currentData = { let currentData = {
orderRef1: row.site, orderRef1: row.site,
orderRef2: row.inspectionNo, orderRef2: row.inspectionNo,
@ -3534,7 +3559,6 @@
} }
this.fileLoading = true this.fileLoading = true
getInspectionFile(currentData).then(({data}) => { getInspectionFile(currentData).then(({data}) => {
//
if (data && data.code === 0) { if (data && data.code === 0) {
this.fileContentList = data.rows this.fileContentList = data.rows
} else { } else {
@ -3544,9 +3568,50 @@
}).catch(()=>{ }).catch(()=>{
this.fileLoading = false this.fileLoading = false
}) })
this.getSopFileList(row)
this.fileFlag = true this.fileFlag = true
}, },
// SOPFQCsite, partNo, operationDesc, workcenterNo, orderNo
getSopFileList(row) {
this.sopFileLoading = true
this.sopFileList = []
searchQcSopFileList({
site: row.site,
partNo: row.partNo || '',
operationDesc: row.operationDesc || '',
workcenterNo: row.workCenterNo || '',
orderNo: row.orderNo || ''
}).then(({data}) => {
if (data && data.code === 0) {
this.sopFileList = data.rows || []
} else {
this.sopFileList = []
}
this.sopFileLoading = false
}).catch(() => {
this.sopFileList = []
this.sopFileLoading = false
})
},
previewSopFile(row) {
if (!row.sopUrl) { this.$message.warning('该文件暂无预览路径'); return }
const fileName = row.sopName || row.sopUrl
let fileSuffix = fileName.includes('.') ? fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase() : ''
const officeTypes = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx']
if (officeTypes.includes(fileSuffix)) { this.$message.warning(`暂不支持在线预览${fileSuffix.toUpperCase()}文件`); return }
let mimeType = 'application/octet-stream'
if (['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(fileSuffix)) { mimeType = 'image/' + fileSuffix }
else if (['mp4', 'avi', 'mov', 'wmv', 'flv'].includes(fileSuffix)) { mimeType = 'video/' + fileSuffix }
else if (fileSuffix === 'pdf') { mimeType = 'application/pdf' }
else if (fileSuffix === 'txt') { mimeType = 'text/plain' }
downloadSopFile(row.sopUrl).then(({ data }) => {
const blob = new Blob([data], { type: mimeType })
window.open(URL.createObjectURL(blob), '_blank')
}).catch(() => { this.$message.error('文件预览失败,请稍后重试') })
},
// modal // modal
addUploadFileModal () { addUploadFileModal () {
let currentData = { let currentData = {

121
src/views/modules/qc/IPQCResultEntry.vue

@ -1011,13 +1011,38 @@
</el-dialog> </el-dialog>
<!-- 文件清单 --> <!-- 文件清单 -->
<el-dialog title="文件清单" :close-on-click-modal="false" v-drag :visible.sync="fileFlag" width="800px">
<el-form :inline="true" label-position="top">
<el-form-item v-if="detailInformationFlag">
<el-button type="primary" @click="addUploadFileModal">上传文件</el-button>
</el-form-item>
</el-form>
<iqc-file-table :columns="fileColumnList" :data-list="fileContentList" :query-loading="fileLoading"></iqc-file-table>
<el-dialog title="文件清单" :close-on-click-modal="false" v-drag :visible.sync="fileFlag" width="900px">
<el-tabs v-model="fileActiveTab" type="border-card">
<!-- QC检验文件标签页 -->
<el-tab-pane label="QC检验文件" name="qcFile">
<el-form :inline="true" label-position="top">
<el-form-item v-if="detailInformationFlag">
<el-button type="primary" size="small" @click="addUploadFileModal">上传文件</el-button>
</el-form-item>
</el-form>
<iqc-file-table :columns="fileColumnList" :data-list="fileContentList" :query-loading="fileLoading"></iqc-file-table>
</el-tab-pane>
<!-- SOP文件标签页 -->
<el-tab-pane label="SOP文件" name="sopFile">
<el-table
:data="sopFileList"
border
v-loading="sopFileLoading"
height="350"
style="width: 100%;">
<el-table-column prop="sopName" header-align="center" align="left" label="文件名称" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column prop="fileType" header-align="center" align="center" label="文件类型" width="100"></el-table-column>
<el-table-column prop="version" header-align="center" align="center" label="版本号" width="80"></el-table-column>
<el-table-column prop="createdBy" header-align="center" align="center" label="上传人" width="100"></el-table-column>
<el-table-column prop="creationDate" header-align="center" align="center" label="上传时间" width="150"></el-table-column>
<el-table-column fixed="right" header-align="center" align="center" width="80" label="操作">
<template slot-scope="scope">
<el-link type="primary" @click="previewSopFile(scope.row)">预览</el-link>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<el-footer style="height:35px;margin-top: 10px;text-align:center"> <el-footer style="height:35px;margin-top: 10px;text-align:center">
<el-button type="primary" @click="fileFlag = false">关闭</el-button> <el-button type="primary" @click="fileFlag = false">关闭</el-button>
</el-footer> </el-footer>
@ -1453,6 +1478,7 @@
import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js" import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js"
import Chooselist from '@/views/modules/common/Chooselist_eam' import Chooselist from '@/views/modules/common/Chooselist_eam'
import {getInspectionFile} from '@/api/eam/eam_object_list.js' import {getInspectionFile} from '@/api/eam/eam_object_list.js'
import { searchQcSopFileList, downloadSopFile } from '@/api/qc/qc.js'
import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js' import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js'
import {qcPrint} from '@/api/qc/qcPrint.js' import {qcPrint} from '@/api/qc/qcPrint.js'
import excel from "@/utils/excel-util.js" import excel from "@/utils/excel-util.js"
@ -1521,6 +1547,11 @@
inspectionNo: '', inspectionNo: '',
fileFlag: false, fileFlag: false,
fileContentList: [], fileContentList: [],
fileActiveTab: 'qcFile',
// SOP
sopFileList: [],
sopFileLoading: false,
currentFileRow: null,
// //
favorite: false, favorite: false,
// start // start
@ -3429,6 +3460,8 @@
// //
getFileContentData (row) { getFileContentData (row) {
this.currentFileRow = row
this.fileActiveTab = 'qcFile'
let currentData = { let currentData = {
orderRef1: row.site, orderRef1: row.site,
orderRef2: row.inspectionNo, orderRef2: row.inspectionNo,
@ -3447,9 +3480,83 @@
}).catch(()=>{ }).catch(()=>{
this.fileLoading = false this.fileLoading = false
}) })
// SOP
this.getSopFileList(row)
this.fileFlag = true this.fileFlag = true
}, },
// SOPIPQCsite, partNo, operationDesc, workcenterNo, orderNo
getSopFileList(row) {
this.sopFileLoading = true
this.sopFileList = []
searchQcSopFileList({
site: row.site,
partNo: row.partNo || '',
operationDesc: row.operationDesc || '',
workcenterNo: row.workCenterNo || '',
orderNo: row.orderNo || ''
}).then(({data}) => {
if (data && data.code === 0) {
this.sopFileList = data.rows || []
} else {
this.sopFileList = []
}
this.sopFileLoading = false
}).catch(() => {
this.sopFileList = []
this.sopFileLoading = false
})
},
// SOP
previewSopFile(row) {
if (!row.sopUrl) {
this.$message.warning('该文件暂无预览路径')
return
}
//
const fileName = row.sopName || row.sopUrl
let fileSuffix = ''
if (fileName.includes('.')) {
fileSuffix = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase()
}
//
const imageTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp']
const videoTypes = ['mp4', 'avi', 'mov', 'wmv', 'flv']
const pdfTypes = ['pdf']
const txtTypes = ['txt']
const officeTypes = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx']
//
if (officeTypes.includes(fileSuffix)) {
this.$message.warning(`暂不支持在线预览${fileSuffix.toUpperCase()}文件`)
return
}
// MIME
let mimeType = 'application/octet-stream'
if (imageTypes.includes(fileSuffix)) {
mimeType = 'image/' + fileSuffix
} else if (videoTypes.includes(fileSuffix)) {
mimeType = 'video/' + fileSuffix
} else if (pdfTypes.includes(fileSuffix)) {
mimeType = 'application/pdf'
} else if (txtTypes.includes(fileSuffix)) {
mimeType = 'text/plain'
}
// APIBlob
downloadSopFile(row.sopUrl).then(({ data }) => {
const blob = new Blob([data], { type: mimeType })
const fileURL = URL.createObjectURL(blob)
window.open(fileURL, '_blank')
}).catch(() => {
this.$message.error('文件预览失败,请稍后重试')
})
},
/*新增文件的modal*/ /*新增文件的modal*/
addUploadFileModal () { addUploadFileModal () {
let currentData = { let currentData = {

107
src/views/modules/qc/IQCResultEntry.vue

@ -653,13 +653,38 @@
</el-dialog> </el-dialog>
<!-- 文件清单 --> <!-- 文件清单 -->
<el-dialog title="文件清单" :close-on-click-modal="false" v-drag :visible.sync="fileFlag" width="800px">
<el-form :inline="true" label-position="top">
<el-form-item v-if="detailInformationFlag">
<el-button type="primary" @click="addUploadFileModal">上传文件</el-button>
</el-form-item>
</el-form>
<iqc-file-table :columns="fileColumnList" :data-list="fileContentList" :query-loading="fileLoading"></iqc-file-table>
<el-dialog title="文件清单" :close-on-click-modal="false" v-drag :visible.sync="fileFlag" width="900px">
<el-tabs v-model="fileActiveTab" type="border-card">
<!-- QC检验文件标签页 -->
<el-tab-pane label="QC检验文件" name="qcFile">
<el-form :inline="true" label-position="top" style="margin-bottom: 10px;">
<el-form-item v-if="detailInformationFlag">
<el-button type="primary" size="small" @click="addUploadFileModal">上传文件</el-button>
</el-form-item>
</el-form>
<iqc-file-table :columns="fileColumnList" :data-list="fileContentList" :query-loading="fileLoading"></iqc-file-table>
</el-tab-pane>
<!-- SOP文件标签页 -->
<el-tab-pane label="SOP文件" name="sopFile">
<el-table
:data="sopFileList"
border
v-loading="sopFileLoading"
height="350"
style="width: 100%;">
<el-table-column prop="sopName" header-align="center" align="left" label="文件名称" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column prop="fileType" header-align="center" align="center" label="文件类型" width="100"></el-table-column>
<el-table-column prop="version" header-align="center" align="center" label="版本号" width="80"></el-table-column>
<el-table-column prop="createdBy" header-align="center" align="center" label="上传人" width="100"></el-table-column>
<el-table-column prop="creationDate" header-align="center" align="center" label="上传时间" width="150"></el-table-column>
<el-table-column fixed="right" header-align="center" align="center" width="80" label="操作">
<template slot-scope="scope">
<el-link type="primary" @click="previewSopFile(scope.row)">预览</el-link>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<el-footer style="height:35px;margin-top: 10px;text-align:center"> <el-footer style="height:35px;margin-top: 10px;text-align:center">
<el-button type="primary" @click="fileFlag = false">关闭</el-button> <el-button type="primary" @click="fileFlag = false">关闭</el-button>
</el-footer> </el-footer>
@ -1099,6 +1124,7 @@
import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js" import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js"
import Chooselist from '@/views/modules/common/Chooselist_eam' import Chooselist from '@/views/modules/common/Chooselist_eam'
import {getInspectionFile} from '@/api/eam/eam_object_list.js' import {getInspectionFile} from '@/api/eam/eam_object_list.js'
import { searchQcSopFileList, downloadSopFile } from '@/api/qc/qc.js'
import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js' import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js'
import {qcPrint} from '@/api/qc/qcPrint.js' import {qcPrint} from '@/api/qc/qcPrint.js'
import excel from "@/utils/excel-util.js" import excel from "@/utils/excel-util.js"
@ -2141,6 +2167,10 @@
options: [], options: [],
fileFlag: false, fileFlag: false,
fileContentList: [], fileContentList: [],
fileActiveTab: 'qcFile',
sopFileList: [],
sopFileLoading: false,
currentFileRow: null,
IQCSelections: [], IQCSelections: [],
batchHandleAddModalFlag: false, batchHandleAddModalFlag: false,
batchAddData: { batchAddData: {
@ -2657,6 +2687,8 @@
// //
getFileContentData (row) { getFileContentData (row) {
this.currentFileRow = row
this.fileActiveTab = 'qcFile'
let currentData = { let currentData = {
orderRef1: row.site, orderRef1: row.site,
orderRef2: row.inspectionNo, orderRef2: row.inspectionNo,
@ -2675,9 +2707,70 @@
}).catch(()=>{ }).catch(()=>{
this.fileLoading = false this.fileLoading = false
}) })
// SOP
this.getSopFileList(row)
this.fileFlag = true this.fileFlag = true
}, },
// SOPIQCsitepartNo
getSopFileList(row) {
this.sopFileLoading = true
this.sopFileList = []
searchQcSopFileList({
site: row.site,
partNo: row.partNo || ''
}).then(({data}) => {
if (data && data.code === 0) {
this.sopFileList = data.rows || []
} else {
this.sopFileList = []
}
this.sopFileLoading = false
}).catch(() => {
this.sopFileList = []
this.sopFileLoading = false
})
},
// SOP
previewSopFile(row) {
if (!row.sopUrl) {
this.$message.warning('该文件暂无预览路径')
return
}
const fileName = row.sopName || row.sopUrl
let fileSuffix = ''
if (fileName.includes('.')) {
fileSuffix = fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase()
}
const imageTypes = ['jpg', 'jpeg', 'png', 'gif', 'bmp']
const videoTypes = ['mp4', 'avi', 'mov', 'wmv', 'flv']
const pdfTypes = ['pdf']
const txtTypes = ['txt']
const officeTypes = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx']
if (officeTypes.includes(fileSuffix)) {
this.$message.warning(`暂不支持在线预览${fileSuffix.toUpperCase()}文件`)
return
}
let mimeType = 'application/octet-stream'
if (imageTypes.includes(fileSuffix)) {
mimeType = 'image/' + fileSuffix
} else if (videoTypes.includes(fileSuffix)) {
mimeType = 'video/' + fileSuffix
} else if (pdfTypes.includes(fileSuffix)) {
mimeType = 'application/pdf'
} else if (txtTypes.includes(fileSuffix)) {
mimeType = 'text/plain'
}
downloadSopFile(row.sopUrl).then(({ data }) => {
const blob = new Blob([data], { type: mimeType })
const fileURL = URL.createObjectURL(blob)
window.open(fileURL, '_blank')
}).catch(() => {
this.$message.error('文件预览失败,请稍后重试')
})
},
// modal // modal
addUploadFileModal () { addUploadFileModal () {
let currentData = { let currentData = {

128
src/views/modules/qc/OQCResultEntry.vue

@ -617,45 +617,45 @@
</el-dialog> </el-dialog>
<!-- 文件清单 --> <!-- 文件清单 -->
<el-dialog title="文件清单" :close-on-click-modal="false" v-drag :visible.sync="fileFlag" width="800px">
<el-form :inline="true" label-position="top">
<el-form-item v-if="detailInformationFlag">
<el-button type="primary" @click="addUploadFileModal">上传文件</el-button>
</el-form-item>
</el-form>
<el-table
:height="350"
:data="fileContentList"
border
style="width: 100%; ">
<el-table-column
v-for="(item,index) in fileColumnList" :key="index"
:sortable="item.columnSortable"
:prop="item.columnProp"
:header-align="item.headerAlign"
:show-overflow-tooltip="item.showOverflowTooltip"
:align="item.align"
:fixed="item.fixed===''?false:item.fixed"
:min-width="item.columnWidth"
:label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
<el-table-column
fixed="right"
header-align="center"
align="center"
width="100"
label="操作">
<template slot-scope="scope">
<el-link style="cursor: pointer" @click="downloadFile(scope.row)">下载</el-link>
<el-link style="cursor:pointer" @click="previewFile(scope.row)">预览</el-link>
<el-link v-if="scope.row.fileType2 !== 'sop'" style="cursor: pointer" @click="deleteFile(scope.row)">删除</el-link>
</template>
</el-table-column>
</el-table>
<el-dialog title="文件清单" :close-on-click-modal="false" v-drag :visible.sync="fileFlag" width="900px">
<el-tabs v-model="fileActiveTab" type="border-card">
<el-tab-pane label="QC检验文件" name="qcFile">
<el-form :inline="true" label-position="top" style="margin-bottom: 10px;">
<el-form-item v-if="detailInformationFlag">
<el-button type="primary" size="small" @click="addUploadFileModal">上传文件</el-button>
</el-form-item>
</el-form>
<el-table :height="350" :data="fileContentList" border style="width: 100%;">
<el-table-column v-for="(item,index) in fileColumnList" :key="index" :sortable="item.columnSortable" :prop="item.columnProp" :header-align="item.headerAlign" :show-overflow-tooltip="item.showOverflowTooltip" :align="item.align" :fixed="item.fixed===''?false:item.fixed" :min-width="item.columnWidth" :label="item.columnLabel">
<template slot-scope="scope">
<span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
<span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
</template>
</el-table-column>
<el-table-column fixed="right" header-align="center" align="center" width="100" label="操作">
<template slot-scope="scope">
<el-link style="cursor: pointer" @click="downloadFile(scope.row)">下载</el-link>
<el-link style="cursor:pointer" @click="previewFile(scope.row)">预览</el-link>
<el-link v-if="scope.row.fileType2 !== 'sop'" style="cursor: pointer" @click="deleteFile(scope.row)">删除</el-link>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="SOP文件" name="sopFile">
<el-table :data="sopFileList" border v-loading="sopFileLoading" height="350" style="width: 100%;">
<el-table-column prop="sopName" header-align="center" align="left" label="文件名称" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column prop="fileType" header-align="center" align="center" label="文件类型" width="100"></el-table-column>
<el-table-column prop="version" header-align="center" align="center" label="版本号" width="80"></el-table-column>
<el-table-column prop="createdBy" header-align="center" align="center" label="上传人" width="100"></el-table-column>
<el-table-column prop="creationDate" header-align="center" align="center" label="上传时间" width="150"></el-table-column>
<el-table-column fixed="right" header-align="center" align="center" width="80" label="操作">
<template slot-scope="scope">
<el-link type="primary" @click="previewSopFile(scope.row)">预览</el-link>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<el-footer style="height:35px;margin-top: 10px;text-align:center"> <el-footer style="height:35px;margin-top: 10px;text-align:center">
<el-button type="primary" @click="fileFlag=false">关闭</el-button> <el-button type="primary" @click="fileFlag=false">关闭</el-button>
</el-footer> </el-footer>
@ -984,7 +984,9 @@
addOQCItemDetails, addOQCItemDetails,
deleteOQCItemDetails, deleteOQCItemDetails,
getOQCTemplateList, getOQCTemplateList,
importOQCTemplateItems
importOQCTemplateItems,
searchQcSopFileList,
downloadSopFile
} from "@/api/qc/qc.js" } from "@/api/qc/qc.js"
import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js" import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js"
import Chooselist from '@/views/modules/common/Chooselist_eam' import Chooselist from '@/views/modules/common/Chooselist_eam'
@ -1918,6 +1920,10 @@
options: [], options: [],
fileFlag: false, fileFlag: false,
fileContentList: [], fileContentList: [],
fileActiveTab: 'qcFile',
sopFileList: [],
sopFileLoading: false,
currentFileRow: null,
FQASSelections: [], FQASSelections: [],
batchHandleAddModalFlag: false, batchHandleAddModalFlag: false,
batchAddData: { batchAddData: {
@ -2442,6 +2448,8 @@
// //
getFileContentData (row) { getFileContentData (row) {
this.currentFileRow = row
this.fileActiveTab = 'qcFile'
this.fileData = { this.fileData = {
site: row.site, site: row.site,
buNo: row.buNo, buNo: row.buNo,
@ -2450,16 +2458,54 @@
inspectionTypeNo: '109' inspectionTypeNo: '109'
} }
getFileContentList2(this.fileData).then(({data}) => { getFileContentList2(this.fileData).then(({data}) => {
//
if (data && data.code == 200) { if (data && data.code == 200) {
this.fileContentList = data.rows this.fileContentList = data.rows
} else { } else {
this.fileContentList = [] this.fileContentList = []
} }
}) })
this.getSopFileList(row)
this.fileFlag = true this.fileFlag = true
}, },
// SOPOQCsitepartNoorderNo
getSopFileList(row) {
this.sopFileLoading = true
this.sopFileList = []
searchQcSopFileList({
site: row.site,
partNo: row.partNo || '',
orderNo: row.orderNo || ''
}).then(({data}) => {
if (data && data.code === 0) {
this.sopFileList = data.rows || []
} else {
this.sopFileList = []
}
this.sopFileLoading = false
}).catch(() => {
this.sopFileList = []
this.sopFileLoading = false
})
},
previewSopFile(row) {
if (!row.sopUrl) { this.$message.warning('该文件暂无预览路径'); return }
const fileName = row.sopName || row.sopUrl
let fileSuffix = fileName.includes('.') ? fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase() : ''
const officeTypes = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx']
if (officeTypes.includes(fileSuffix)) { this.$message.warning(`暂不支持在线预览${fileSuffix.toUpperCase()}文件`); return }
let mimeType = 'application/octet-stream'
if (['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(fileSuffix)) { mimeType = 'image/' + fileSuffix }
else if (['mp4', 'avi', 'mov', 'wmv', 'flv'].includes(fileSuffix)) { mimeType = 'video/' + fileSuffix }
else if (fileSuffix === 'pdf') { mimeType = 'application/pdf' }
else if (fileSuffix === 'txt') { mimeType = 'text/plain' }
downloadSopFile(row.sopUrl).then(({ data }) => {
const blob = new Blob([data], { type: mimeType })
window.open(URL.createObjectURL(blob), '_blank')
}).catch(() => { this.$message.error('文件预览失败,请稍后重试') })
},
// modal // modal
addUploadFileModal () { addUploadFileModal () {
let currentData = { let currentData = {

80
src/views/modules/yieldReport/com_process_inspection.vue

@ -913,6 +913,37 @@
</el-dialog> </el-dialog>
</el-dialog> </el-dialog>
<!-- 文件清单对话框 -->
<el-dialog title="文件清单" :close-on-click-modal="false" :visible.sync="fileFlag" width="900px" append-to-body>
<el-tabs v-model="fileActiveTab" type="border-card">
<el-tab-pane label="QC检验文件" name="qcFile">
<el-table :height="350" :data="fileContentList" border v-loading="fileLoading" style="width: 100%;">
<el-table-column prop="fileName" header-align="center" align="left" label="文件名称" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column prop="createdBy" header-align="center" align="center" label="上传人" width="120"></el-table-column>
<el-table-column prop="createDate" header-align="center" align="center" label="上传时间" width="160"></el-table-column>
</el-table>
</el-tab-pane>
<el-tab-pane label="SOP文件" name="sopFile">
<el-table :data="sopFileList" border v-loading="sopFileLoading" height="350" style="width: 100%;">
<el-table-column prop="sopName" header-align="center" align="left" label="文件名称" min-width="200" show-overflow-tooltip></el-table-column>
<el-table-column prop="fileType" header-align="center" align="center" label="文件类型" width="100"></el-table-column>
<el-table-column prop="version" header-align="center" align="center" label="版本号" width="80"></el-table-column>
<el-table-column prop="createdBy" header-align="center" align="center" label="上传人" width="100"></el-table-column>
<el-table-column prop="creationDate" header-align="center" align="center" label="上传时间" width="150"></el-table-column>
<el-table-column fixed="right" header-align="center" align="center" width="80" label="操作">
<template slot-scope="scope">
<el-link type="primary" @click="previewSopFile(scope.row)">预览</el-link>
</template>
</el-table-column>
</el-table>
</el-tab-pane>
</el-tabs>
<el-footer style="height:35px;margin-top: 10px;text-align:center">
<el-button type="primary" @click="fileFlag = false">关闭</el-button>
</el-footer>
</el-dialog>
</div> </div>
</template> </template>
@ -951,6 +982,7 @@ import {
} from "@/api/qc/qc.js" } from "@/api/qc/qc.js"
import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js" import {getTableDefaultListLanguage, getTableUserListLanguage} from "@/api/table.js"
import { getInspectionFile } from '@/api/eam/eam_object_list.js' import { getInspectionFile } from '@/api/eam/eam_object_list.js'
import { searchQcSopFileList, downloadSopFile } from '@/api/qc/qc.js'
export default { export default {
name: 'ComProcessInspection', name: 'ComProcessInspection',
@ -1380,6 +1412,10 @@ export default {
fileFlag: false, fileFlag: false,
fileContentList: [], fileContentList: [],
fileLoading: false, fileLoading: false,
fileActiveTab: 'qcFile',
sopFileList: [],
sopFileLoading: false,
currentFileRow: null,
// //
seqDetailFlag: false, seqDetailFlag: false,
seqInfoList: [], seqInfoList: [],
@ -2182,6 +2218,8 @@ export default {
// //
getFileContentData(row) { getFileContentData(row) {
this.currentFileRow = row
this.fileActiveTab = 'qcFile'
let currentData = { let currentData = {
orderRef1: row.site, orderRef1: row.site,
orderRef2: row.inspectionNo, orderRef2: row.inspectionNo,
@ -2190,7 +2228,6 @@ export default {
} }
this.fileLoading = true this.fileLoading = true
getInspectionFile(currentData).then(({data}) => { getInspectionFile(currentData).then(({data}) => {
//
if (data && data.code === 0) { if (data && data.code === 0) {
this.fileContentList = data.rows this.fileContentList = data.rows
} else { } else {
@ -2200,9 +2237,50 @@ export default {
}).catch(()=>{ }).catch(()=>{
this.fileLoading = false this.fileLoading = false
}) })
this.getSopFileList(row)
this.fileFlag = true this.fileFlag = true
}, },
// SOPsite, partNo, operationDesc, workcenterNo, orderNo
getSopFileList(row) {
this.sopFileLoading = true
this.sopFileList = []
searchQcSopFileList({
site: row.site,
partNo: row.partNo || '',
operationDesc: row.operationDesc || '',
workcenterNo: row.workCenterNo || '',
orderNo: row.orderNo || ''
}).then(({data}) => {
if (data && data.code === 0) {
this.sopFileList = data.rows || []
} else {
this.sopFileList = []
}
this.sopFileLoading = false
}).catch(() => {
this.sopFileList = []
this.sopFileLoading = false
})
},
previewSopFile(row) {
if (!row.sopUrl) { this.$message.warning('该文件暂无预览路径'); return }
const fileName = row.sopName || row.sopUrl
let fileSuffix = fileName.includes('.') ? fileName.substring(fileName.lastIndexOf('.') + 1).toLowerCase() : ''
const officeTypes = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx']
if (officeTypes.includes(fileSuffix)) { this.$message.warning(`暂不支持在线预览${fileSuffix.toUpperCase()}文件`); return }
let mimeType = 'application/octet-stream'
if (['jpg', 'jpeg', 'png', 'gif', 'bmp'].includes(fileSuffix)) { mimeType = 'image/' + fileSuffix }
else if (['mp4', 'avi', 'mov', 'wmv', 'flv'].includes(fileSuffix)) { mimeType = 'video/' + fileSuffix }
else if (fileSuffix === 'pdf') { mimeType = 'application/pdf' }
else if (fileSuffix === 'txt') { mimeType = 'text/plain' }
downloadSopFile(row.sopUrl).then(({ data }) => {
const blob = new Blob([data], { type: mimeType })
window.open(URL.createObjectURL(blob), '_blank')
}).catch(() => { this.$message.error('文件预览失败,请稍后重试') })
},
// / // /
Transfer(type) { Transfer(type) {
// //

Loading…
Cancel
Save