You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

231 lines
7.4 KiB

6 days ago
6 days ago
6 days ago
  1. <script>
  2. import {downLoadObjectFile, downLoadObjectFileMes} from '@/api/eam/eam_object_list.js'
  3. import {deleteObjectFile} from '@/api/eam/eam.js'
  4. export default {
  5. name: "iqcFileTable",
  6. props:{
  7. dataList:{
  8. type:Array,
  9. required:true
  10. },
  11. queryLoading:{
  12. type:Boolean,
  13. default:false,
  14. },
  15. columns:{
  16. type:Array,
  17. required: true,
  18. }
  19. },
  20. methods: {
  21. emitFilePreviewed (row) {
  22. this.$emit('file-previewed', row)
  23. },
  24. // 预览
  25. previewFile (row) {
  26. // 预览文件
  27. let image = ['jpg', 'jpeg', 'png', 'gif', 'bmp']
  28. let type = ''
  29. if (image.includes(row.fileType.toLowerCase())) {
  30. type = 'image/' + row.fileType
  31. }
  32. let video = ['mp4', 'avi', 'mov', 'wmv', 'flv']
  33. if (video.includes(row.fileType.toLowerCase())) {
  34. type = 'video/' + row.fileType
  35. }
  36. let txt = ['txt']
  37. if (txt.includes(row.fileType.toLowerCase())) {
  38. type = 'text/plain'
  39. }
  40. let office = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx']
  41. if (office.includes(row.fileType.toLowerCase())) {
  42. this.$message.warning(`暂不支持预览${row.fileType.toLowerCase()}文件`)
  43. return
  44. }
  45. let pdf = ['pdf']
  46. if (pdf.includes(row.fileType.toLowerCase())) {
  47. type = 'application/pdf'
  48. }
  49. if (type === ''){
  50. this.$message.warning(`暂不支持预览${row.fileType.toLowerCase()}文件`)
  51. return;
  52. }
  53. downLoadObjectFile(row).then(({data}) => {
  54. const blob = new Blob([data], { type: type });
  55. // 创建URL来生成预览
  56. const fileURL = URL.createObjectURL(blob);
  57. // 在新标签页中打开文件预览
  58. window.open(fileURL, '_blank')
  59. this.emitFilePreviewed(row)
  60. })
  61. },
  62. // 预览
  63. previewFileMes (row) {
  64. // 预览文件
  65. let image = ['jpg', 'jpeg', 'png', 'gif', 'bmp']
  66. let type = ''
  67. if (image.includes(row.fileType.toLowerCase())) {
  68. type = 'image/' + row.fileType
  69. }
  70. let video = ['mp4', 'avi', 'mov', 'wmv', 'flv']
  71. if (video.includes(row.fileType.toLowerCase())) {
  72. type = 'video/' + row.fileType
  73. }
  74. let txt = ['txt']
  75. if (txt.includes(row.fileType.toLowerCase())) {
  76. type = 'text/plain'
  77. }
  78. let office = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx']
  79. if (office.includes(row.fileType.toLowerCase())) {
  80. this.$message.warning(`暂不支持预览${row.fileType.toLowerCase()}文件`)
  81. return
  82. }
  83. let pdf = ['pdf']
  84. if (pdf.includes(row.fileType.toLowerCase())) {
  85. type = 'application/pdf'
  86. }
  87. if (type === ''){
  88. this.$message.warning(`暂不支持预览${row.fileType.toLowerCase()}文件`)
  89. return;
  90. }
  91. downLoadObjectFileMes(row).then(({data}) => {
  92. const blob = new Blob([data], { type: type });
  93. // 创建URL来生成预览
  94. const fileURL = URL.createObjectURL(blob);
  95. // 在新标签页中打开文件预览
  96. window.open(fileURL, '_blank')
  97. this.emitFilePreviewed(row)
  98. })
  99. },
  100. // 文件下载
  101. downloadFile (row) {
  102. downLoadObjectFile(row)
  103. .then(({data}) => {
  104. // 不限制文件下载类型
  105. const blob = new Blob([data], {type: "application/octet-stream"})
  106. // 下载文件名称
  107. const fileName = row.fileName
  108. // a标签下载
  109. const linkNode = document.createElement('a')
  110. // a标签的download属性规定下载文件的名称
  111. linkNode.download = fileName
  112. linkNode.style.display = 'none'
  113. // 生成一个Blob URL
  114. linkNode.href = URL.createObjectURL(blob)
  115. document.body.appendChild(linkNode)
  116. // 模拟在按钮上的一次鼠标单击
  117. linkNode.click()
  118. // 释放URL 对象
  119. URL.revokeObjectURL(linkNode.href)
  120. document.body.removeChild(linkNode)
  121. })
  122. },
  123. // 文件下载
  124. downloadFileMes (row) {
  125. downLoadObjectFileMes(row)
  126. .then(({data}) => {
  127. // 不限制文件下载类型
  128. const blob = new Blob([data], {type: "application/octet-stream"})
  129. // 下载文件名称
  130. const fileName = row.fileName
  131. // a标签下载
  132. const linkNode = document.createElement('a')
  133. // a标签的download属性规定下载文件的名称
  134. linkNode.download = fileName
  135. linkNode.style.display = 'none'
  136. // 生成一个Blob URL
  137. linkNode.href = URL.createObjectURL(blob)
  138. document.body.appendChild(linkNode)
  139. // 模拟在按钮上的一次鼠标单击
  140. linkNode.click()
  141. // 释放URL 对象
  142. URL.revokeObjectURL(linkNode.href)
  143. document.body.removeChild(linkNode)
  144. })
  145. },
  146. // 删除文件
  147. deleteFile (row) {
  148. let tempData = {
  149. site: row.orderRef1,
  150. inspectionNo: row.orderRef2,
  151. buNo: row.orderRef4
  152. }
  153. this.$confirm('确定要删除此文件?', '提示', {
  154. confirmButtonText: '确定',
  155. cancelButtonText: '取消',
  156. type: 'warning'
  157. }).then(() => {
  158. deleteObjectFile(row).then(({data}) => {
  159. if (data && data.code == 0) {
  160. this.getFileContentData(tempData)
  161. this.$message({
  162. message: '操作成功',
  163. type: 'success',
  164. duration: 1500,
  165. onClose: () => {}
  166. })
  167. } else {
  168. this.$alert(data.msg, '错误', {
  169. confirmButtonText: '确定'
  170. })
  171. }
  172. })
  173. }).catch(() => {
  174. })
  175. },
  176. }
  177. }
  178. </script>
  179. <template>
  180. <el-table
  181. :height="350"
  182. :data="dataList"
  183. border
  184. v-loading="queryLoading"
  185. element-loading-text="拼命加载中"
  186. style="width: 100%; ">
  187. <el-table-column
  188. v-for="(item,index) in columns" :key="index"
  189. :sortable="item.columnSortable"
  190. :prop="item.columnProp"
  191. :header-align="item.headerAlign"
  192. :show-overflow-tooltip="item.showOverflowTooltip"
  193. :align="item.align"
  194. :fixed="item.fixed===''?false:item.fixed"
  195. :min-width="item.columnWidth"
  196. :label="item.columnLabel">
  197. <template slot-scope="scope">
  198. <span v-if="!item.columnHidden">{{scope.row[item.columnProp]}}</span>
  199. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  200. </template>
  201. </el-table-column>
  202. <el-table-column
  203. header-align="center"
  204. align="center"
  205. width="100"
  206. label="操作">
  207. <template slot-scope="scope">
  208. <!-- <el-link v-if="scope.row.orderReftype !== 'mes'" style="cursor: pointer" @click="previewFile(scope.row)">预览</el-link>-->
  209. <el-link v-if="scope.row.orderReftype !== 'mes'" style="cursor: pointer" @click="downloadFile(scope.row)">下载</el-link>
  210. <el-link
  211. v-if="scope.row.orderReftype !== 'mes' && scope.row.orderReftype !== 'PartSop' && scope.row.orderReftype !== 'PartFamilySop'"
  212. style="cursor: pointer"
  213. @click="deleteFile(scope.row)">删除</el-link>
  214. <!-- <el-link v-if="scope.row.orderReftype === 'mes'" style="cursor: pointer" @click="previewFileMes(scope.row)">预览</el-link>-->
  215. <el-link v-if="scope.row.orderReftype === 'mes'" style="cursor: pointer" @click="downloadFileMes(scope.row)">下载</el-link>
  216. </template>
  217. </el-table-column>
  218. </el-table>
  219. </template>
  220. <style scoped>
  221. </style>