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.

321 lines
8.4 KiB

9 months ago
9 months ago
7 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
7 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
9 months ago
7 months ago
9 months ago
7 months ago
9 months ago
7 months ago
9 months ago
9 months ago
  1. <template>
  2. <div class="sop-list-component" style="padding: 2px !important">
  3. <el-form :inline="true" :model="dataForm" @keyup.enter.native="getDataList()">
  4. <el-form-item>
  5. <el-button @click="fileLibraryHandle()">从文件库添加</el-button>
  6. <el-button type="danger" @click="batchDeleteHandle()" :disabled="dataListSelections.length === 0" :loading="deleteLoading">删除</el-button>
  7. <a class="sop-external-link" href="#" @click.prevent="openExternalLink">外部链接</a>
  8. </el-form-item>
  9. </el-form>
  10. <el-table
  11. :data="dataList"
  12. border
  13. v-loading="dataListLoading"
  14. @selection-change="selectionChangeHandle"
  15. :height="tableHeight"
  16. style="width: 100%;">
  17. <el-table-column
  18. type="selection"
  19. header-align="center"
  20. align="center"
  21. width="50">
  22. </el-table-column>
  23. <el-table-column
  24. prop="sopNo"
  25. header-align="center"
  26. align="center"
  27. label="文件编码"
  28. min-width="120">
  29. </el-table-column>
  30. <el-table-column
  31. prop="sopName"
  32. header-align="center"
  33. align="left"
  34. label="文件名称"
  35. min-width="200">
  36. </el-table-column>
  37. <el-table-column
  38. prop="sopType"
  39. header-align="center"
  40. align="center"
  41. label="文件类型"
  42. min-width="100">
  43. </el-table-column>
  44. <el-table-column
  45. prop="fileSuffix"
  46. header-align="center"
  47. align="center"
  48. label="文件后缀"
  49. mib-width="100">
  50. </el-table-column>
  51. <el-table-column
  52. prop="version"
  53. header-align="center"
  54. align="center"
  55. label="版本号"
  56. min-width="100">
  57. </el-table-column>
  58. <el-table-column
  59. prop="operationDesc"
  60. header-align="center"
  61. align="left"
  62. label="工序"
  63. min-width="120">
  64. </el-table-column>
  65. <el-table-column
  66. prop="phaseInDate"
  67. header-align="center"
  68. align="center"
  69. label="生效日期"
  70. min-width="120">
  71. </el-table-column>
  72. <el-table-column
  73. prop="phaseOutDate"
  74. header-align="center"
  75. align="center"
  76. label="失效日期"
  77. min-width="120">
  78. </el-table-column>
  79. <el-table-column
  80. prop="sourceSystem"
  81. header-align="center"
  82. align="center"
  83. label="来源系统"
  84. min-width="100">
  85. </el-table-column>
  86. <!-- <el-table-column-->
  87. <!-- prop="standardFields"-->
  88. <!-- header-align="center"-->
  89. <!-- align="center"-->
  90. <!-- label="4个标准字段"-->
  91. <!-- min-width="120">-->
  92. <!-- </el-table-column>-->
  93. <el-table-column
  94. fixed="right"
  95. header-align="center"
  96. align="center"
  97. width="100"
  98. label="操作">
  99. <template slot-scope="scope">
  100. <a type="text" size="small" @click="previewHandle(scope.row)">预览</a>
  101. </template>
  102. </el-table-column>
  103. </el-table>
  104. <el-pagination
  105. @size-change="sizeChangeHandle"
  106. @current-change="currentChangeHandle"
  107. :current-page="pageIndex"
  108. :page-sizes="[10, 20, 50, 100]"
  109. :page-size="pageSize"
  110. :total="totalPage"
  111. layout="total, sizes, prev, pager, next, jumper"
  112. style="margin-top: 0px;">
  113. </el-pagination>
  114. <!-- 文件上传弹窗 -->
  115. <sop-file-upload
  116. v-if="sopFileUploadVisible"
  117. ref="sopFileUpload"
  118. @refreshDataList="getDataList">
  119. </sop-file-upload>
  120. </div>
  121. </template>
  122. <script>
  123. import SopFileUpload from './sopFileUpload'
  124. import { sopListSearch, sopRecordDelete, downloadSopFile } from '@/api/qc/qc.js'
  125. export default {
  126. name: 'SopListComponent',
  127. components: {
  128. SopFileUpload
  129. },
  130. props: {
  131. partNo: {
  132. type: String,
  133. default: ''
  134. },
  135. site: {
  136. type: [String, Number],
  137. default: ''
  138. },
  139. buNo: {
  140. type: String,
  141. default: ''
  142. },
  143. tableHeight: {
  144. type: Number,
  145. default: 200
  146. }
  147. },
  148. data () {
  149. return {
  150. dataForm: {},
  151. dataList: [],
  152. pageIndex: 1,
  153. pageSize: 20,
  154. totalPage: 0,
  155. dataListLoading: false,
  156. dataListSelections: [],
  157. sopFileUploadVisible: false,
  158. deleteLoading: false
  159. }
  160. },
  161. watch: {
  162. partNo: {
  163. handler (newVal) {
  164. if (newVal) {
  165. this.getDataList()
  166. }
  167. },
  168. immediate: true
  169. }
  170. },
  171. methods: {
  172. // 获取数据列表
  173. getDataList () {
  174. if (!this.partNo) {
  175. this.dataList = []
  176. this.totalPage = 0
  177. return
  178. }
  179. this.dataListLoading = true
  180. sopListSearch({
  181. page: this.pageIndex,
  182. limit: this.pageSize,
  183. partNo: this.partNo,
  184. site: this.site || this.$store.state.user.site
  185. }).then(({data}) => {
  186. if (data && data.code === 0) {
  187. this.dataList = data.page.list || []
  188. this.totalPage = data.page.totalCount || 0
  189. } else {
  190. this.dataList = []
  191. this.totalPage = 0
  192. }
  193. this.dataListLoading = false
  194. }).catch(() => {
  195. this.dataList = []
  196. this.totalPage = 0
  197. this.dataListLoading = false
  198. })
  199. },
  200. // 每页数
  201. sizeChangeHandle (val) {
  202. this.pageSize = val
  203. this.pageIndex = 1
  204. this.getDataList()
  205. },
  206. // 当前页
  207. currentChangeHandle (val) {
  208. this.pageIndex = val
  209. this.getDataList()
  210. },
  211. // 多选
  212. selectionChangeHandle (val) {
  213. this.dataListSelections = val
  214. },
  215. // 从文件库查询并关联到物料
  216. fileLibraryHandle () {
  217. if (!this.partNo) {
  218. this.$message.warning('请先选择物料')
  219. return
  220. }
  221. this.sopFileUploadVisible = true
  222. this.$nextTick(() => {
  223. this.$refs.sopFileUpload.init(this.partNo, this.site, this.buNo)
  224. })
  225. },
  226. // 打开外部链接(按物料编码)
  227. openExternalLink () {
  228. if (!this.partNo) {
  229. this.$message.warning('请先选择物料')
  230. return false
  231. }
  232. const baseUrl = window.SITE_CONFIG['processDataUrl'] || 'http://pdm.bt.in/#/public/processData'
  233. const targetUrl = `${baseUrl}/${this.partNo}`
  234. window.open(targetUrl, '_blank')
  235. },
  236. // 预览
  237. previewHandle (row) {
  238. if (!row.sopUrl) {
  239. this.$message.warning('该文件暂无预览路径')
  240. return
  241. }
  242. const fileName = row.sopName || row.sopUrl
  243. downloadSopFile(row.sopUrl).then(({ data }) => {
  244. this.$filePreview.previewFile(data, fileName).then(result => {
  245. if (result.message) {
  246. this.$message.success(result.message)
  247. }
  248. }).catch(error => {
  249. this.$message.error('文件预览失败:' + (error.message || '未知错误'))
  250. })
  251. }).catch(() => {
  252. this.$message.error('文件下载失败,请稍后重试')
  253. })
  254. },
  255. // 批量删除
  256. batchDeleteHandle () {
  257. if (this.dataListSelections.length === 0) {
  258. this.$message.warning('请先选择要删除的记录')
  259. return
  260. }
  261. this.$confirm(`确定要删除选中的${this.dataListSelections.length}条SOP记录吗?`, '提示', {
  262. confirmButtonText: '确定',
  263. cancelButtonText: '取消',
  264. type: 'warning'
  265. }).then(() => {
  266. this.deleteLoading = true
  267. const deletePromises = this.dataListSelections.map(row => {
  268. return sopRecordDelete({
  269. site: row.site,
  270. buNo: row.buNo,
  271. partNo: row.partNo,
  272. sopNo: row.sopNo
  273. })
  274. })
  275. Promise.all(deletePromises).then((responses) => {
  276. const successCount = responses.filter(({data}) => data && data.code === 0).length
  277. if (successCount === this.dataListSelections.length) {
  278. this.$message.success(`成功删除${successCount}条记录`)
  279. } else {
  280. this.$message.warning(`删除了${successCount}条记录,${this.dataListSelections.length - successCount}条删除失败`)
  281. }
  282. this.getDataList()
  283. this.deleteLoading = false
  284. }).catch(() => {
  285. this.$message.error('删除失败')
  286. this.deleteLoading = false
  287. })
  288. }).catch(() => {})
  289. }
  290. }
  291. }
  292. </script>
  293. <style scoped>
  294. .sop-list-component {
  295. padding: 10px;
  296. }
  297. .sop-external-link {
  298. margin-left: 10px;
  299. color: #17b3a3;
  300. text-decoration: underline;
  301. font-size: 13px;
  302. cursor: pointer;
  303. }
  304. .sop-external-link:visited,
  305. .sop-external-link:active,
  306. .sop-external-link:hover {
  307. color: #17b3a3;
  308. }
  309. </style>