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.

222 lines
7.2 KiB

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