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.

666 lines
21 KiB

  1. <template>
  2. <div class="mod-config">
  3. <el-form :inline="true" label-position="top">
  4. <el-form-item :label="'BU'">
  5. <el-select v-model="searchData.buDesc" placeholder="请选择" clearable style="width: 80px">
  6. <el-option
  7. v-for="i in userBuList"
  8. :key="i.buNo"
  9. :label="i.buDesc"
  10. :value="i.buDesc">
  11. </el-option>
  12. </el-select>
  13. </el-form-item>
  14. <el-form-item label="设备编码">
  15. <el-input v-model="searchData.objectID" clearable style="width: 100px"></el-input>
  16. </el-form-item>
  17. <el-form-item label="设备名称">
  18. <el-input v-model="searchData.objectDesc" clearable style="width: 150px"></el-input>
  19. </el-form-item>
  20. <el-form-item label="资产编码">
  21. <el-input v-model="searchData.assetNo" clearable style="width: 100px"></el-input>
  22. </el-form-item>
  23. <el-form-item label="设备分类名称">
  24. <el-input v-model="searchData.familyDesc" clearable style="width: 100px"></el-input>
  25. </el-form-item>
  26. <el-form-item label="设备分组名称">
  27. <el-input v-model="searchData.groupDesc" clearable style="width: 100px"></el-input>
  28. </el-form-item>
  29. </el-form>
  30. <el-form :inline="true" label-position="top" :model="searchData">
  31. <el-form-item label="所属部门名称">
  32. <el-input v-model="searchData.deptName" clearable style="width: 100px"></el-input>
  33. </el-form-item>
  34. <el-form-item label="文件名称">
  35. <el-input v-model="searchData.fileName" clearable style="width: 300px"></el-input>
  36. </el-form-item>
  37. <el-form-item label="文件类型">
  38. <el-select v-model="searchData.orderRef3" clearable style="width: 80px">
  39. <el-option label="SOP-SP" value="SOP-SP"></el-option>
  40. <el-option label="other" value="other"></el-option>
  41. </el-select>
  42. </el-form-item>
  43. <el-form-item :label="' '">
  44. <el-button v-if="!authSearch" @click="getDataList()">查询</el-button>
  45. <download-excel
  46. :fields="fields()"
  47. :data="exportData"
  48. type="xls"
  49. :name="exportName"
  50. :header="exportHeader"
  51. :footer="exportFooter"
  52. :fetch="createExportData"
  53. :before-generate="startDownload"
  54. :before-finish="finishDownload"
  55. worksheet="导出信息"
  56. class="el-button el-button--primary el-button--medium">
  57. {{ "导出" }}
  58. </download-excel>
  59. </el-form-item>
  60. </el-form>
  61. <el-table
  62. :height="height"
  63. :data="dataList"
  64. border
  65. style="width: 100%;">
  66. <el-table-column
  67. v-for="(item,index) in columnList" :key="index"
  68. :sortable="item.columnSortable"
  69. :prop="item.columnProp"
  70. :header-align="item.headerAlign"
  71. :show-overflow-tooltip="item.showOverflowTooltip"
  72. :align="item.align"
  73. :fixed="item.fixed==''?false:item.fixed"
  74. :min-width="item.columnWidth"
  75. :label="item.columnLabel">
  76. <template slot-scope="scope">
  77. <span v-if="!item.columnHidden">{{ scope.row[item.columnProp] }}</span>
  78. <span v-if="item.columnImage"><img :src="scope.row[item.columnProp]" style="width: 100px; height: 80px"/></span>
  79. </template>
  80. </el-table-column>
  81. <el-table-column
  82. fixed="right"
  83. header-align="center"
  84. align="center"
  85. width="130"
  86. label="操作">
  87. <template slot-scope="scope">
  88. <el-link v-if="!authDownload" style="cursor:pointer" @click="downloadFile(scope.row)">下载</el-link>
  89. <el-link v-if="!authPreview" style="cursor:pointer" @click="previewFile(scope.row)">预览</el-link>
  90. <el-link v-if="!authDelete" style="cursor:pointer" @click="deleteFile(scope.row)">删除</el-link>
  91. </template>
  92. </el-table-column>
  93. </el-table>
  94. <el-pagination
  95. @size-change="sizeChangeHandle"
  96. @current-change="currentChangeHandle"
  97. :current-page="pageIndex"
  98. :page-sizes="[20, 50, 100, 200, 500]"
  99. :page-size="pageSize"
  100. :total="totalPage"
  101. layout="total, sizes, prev, pager, next, jumper">
  102. </el-pagination>
  103. </div>
  104. </template>
  105. <script>
  106. import {
  107. eamObjectSopListSearch,
  108. downLoadObjectFile
  109. } from "@/api/eam/eam_object_list.js"
  110. import {
  111. getSiteAndBuByUserName,
  112. deleteObjectFile,
  113. } from "@/api/eam/eam.js"
  114. import {userFavoriteList, saveUserFavorite, removeUserFavorite} from '@/api/userFavorite.js'
  115. import {
  116. getTableDefaultListLanguage,
  117. getTableUserListLanguage,
  118. } from "@/api/table.js"
  119. export default {
  120. watch: {
  121. searchData: {
  122. deep: true,
  123. handler: function (newV, oldV) {
  124. this.searchData.objectID = this.searchData.objectID.toUpperCase()
  125. }
  126. },
  127. },
  128. data () {
  129. return {
  130. // 是否收藏
  131. favorite: false,
  132. // 导出 start
  133. exportData: [],
  134. exportName: "设备SOP清单" + this.dayjs().format('YYYYMMDDHHmmss'),
  135. exportHeader: ["设备SOP清单"],
  136. exportFooter: [],
  137. exportList: [],
  138. // 导出 end
  139. searchData: {
  140. site: '',
  141. buNo: '',
  142. buDesc: '',
  143. userName: this.$store.state.user.name,
  144. objectID: '',
  145. objectDesc: '',
  146. familyDesc: '',
  147. groupDesc: '',
  148. deptName: '',
  149. assetNo: '',
  150. orderRef3: '',
  151. page: 1,
  152. limit: 10
  153. },
  154. height: 200,
  155. pageIndex: 1,
  156. pageSize: 20,
  157. totalPage: 0,
  158. dataList: [],
  159. dataListSelections: [],
  160. // 展示列集
  161. columnList: [
  162. {
  163. userId: this.$store.state.user.name,
  164. functionId: 101001012,
  165. serialNumber: '101001012Table1Bu',
  166. tableId: "101001012Table1",
  167. tableName: "设备SOP清单",
  168. columnProp: 'buDesc',
  169. headerAlign: "center",
  170. align: 'left',
  171. columnLabel: 'BU',
  172. columnHidden: false,
  173. columnImage: false,
  174. columnSortable: false,
  175. sortLv: 0,
  176. status: true,
  177. fixed: '',
  178. columnWidth: 80,
  179. },
  180. {
  181. userId: this.$store.state.user.name,
  182. functionId: 101001012,
  183. serialNumber: '101001012Table1ObjectID',
  184. tableId: "101001012Table1",
  185. tableName: "设备SOP清单",
  186. columnProp: 'objectID',
  187. headerAlign: "center",
  188. align: 'left',
  189. columnLabel: '设备编码',
  190. columnHidden: false,
  191. columnImage: false,
  192. columnSortable: false,
  193. sortLv: 0,
  194. status: true,
  195. fixed: '',
  196. columnWidth: 100,
  197. },
  198. {
  199. userId: this.$store.state.user.name,
  200. functionId: 101001012,
  201. serialNumber: '101001012Table1ObjectDesc',
  202. tableId: "101001012Table1",
  203. tableName: "设备SOP清单",
  204. columnProp: 'objectDesc',
  205. headerAlign: "center",
  206. align: "left",
  207. columnLabel: '设备名称',
  208. columnHidden: false,
  209. columnImage: false,
  210. columnSortable: false,
  211. sortLv: 0,
  212. status: true,
  213. fixed: '',
  214. columnWidth: 150,
  215. },
  216. {
  217. userId: this.$store.state.user.name,
  218. functionId: 101001012,
  219. serialNumber: '101001012Table1AssetNo',
  220. tableId: "101001012Table1",
  221. tableName: "设备SOP清单",
  222. columnProp: 'assetNo',
  223. headerAlign: "center",
  224. align: "left",
  225. columnLabel: '资产编码',
  226. columnHidden: false,
  227. columnImage: false,
  228. columnSortable: false,
  229. sortLv: 0,
  230. status: true,
  231. fixed: '',
  232. columnWidth: 100,
  233. },
  234. {
  235. userId: this.$store.state.user.name,
  236. functionId: 101001012,
  237. serialNumber: '101001012Table1FamilyDesc',
  238. tableId: "101001012Table1",
  239. tableName: "设备SOP清单",
  240. columnProp: 'familyDesc',
  241. headerAlign: "center",
  242. align: "left",
  243. columnLabel: '设备分类',
  244. columnHidden: false,
  245. columnImage: false,
  246. columnSortable: false,
  247. sortLv: 0,
  248. status: true,
  249. fixed: '',
  250. columnWidth: 120
  251. },
  252. {
  253. userId: this.$store.state.user.name,
  254. functionId: 101001012,
  255. serialNumber: '101001012Table1GroupDesc',
  256. tableId: "101001012Table1",
  257. tableName: "设备SOP清单",
  258. columnProp: 'groupDesc',
  259. headerAlign: "center",
  260. align: 'left',
  261. columnLabel: '设备分组',
  262. columnHidden: false,
  263. columnImage: false,
  264. columnSortable: false,
  265. sortLv: 0,
  266. status: true,
  267. fixed: '',
  268. columnWidth: 120,
  269. },
  270. {
  271. userId: this.$store.state.user.name,
  272. functionId: 101001012,
  273. serialNumber: '101001012Table1LocationName',
  274. tableId: "101001012Table1",
  275. tableName: "设备SOP清单",
  276. columnProp: 'locationName',
  277. headerAlign: "center",
  278. align: "left",
  279. columnLabel: '设备区域',
  280. columnHidden: false,
  281. columnImage: false,
  282. columnSortable: false,
  283. sortLv: 0,
  284. status: true,
  285. fixed: '',
  286. columnWidth: 120,
  287. },
  288. {
  289. userId: this.$store.state.user.name,
  290. functionId: 101001012,
  291. serialNumber: '101001012Table1DeptName',
  292. tableId: "101001012Table1",
  293. tableName: "设备SOP清单",
  294. columnProp: 'deptName',
  295. headerAlign: "center",
  296. align: 'left',
  297. columnLabel: '所属部门',
  298. columnHidden: false,
  299. columnImage: false,
  300. columnSortable: false,
  301. sortLv: 0,
  302. status: true,
  303. fixed: '',
  304. columnWidth: 150,
  305. },
  306. {
  307. userId: this.$store.state.user.name,
  308. functionId: 101001012,
  309. serialNumber: '101001012Table1FileName',
  310. tableId: "101001012Table1",
  311. tableName: "设备SOP清单",
  312. columnProp: 'fileName',
  313. headerAlign: "center",
  314. align: 'left',
  315. columnLabel: '文件名称',
  316. columnHidden: false,
  317. columnImage: false,
  318. columnSortable: false,
  319. sortLv: 0,
  320. status: true,
  321. fixed: '',
  322. columnWidth: 300,
  323. },
  324. {
  325. userId: this.$store.state.user.name,
  326. functionId: 101001012,
  327. serialNumber: '101001012Table1CreatedBy',
  328. tableId: "101001012Table1",
  329. tableName: "设备SOP清单",
  330. columnProp: 'createdBy',
  331. headerAlign: "center",
  332. align: 'left',
  333. columnLabel: '上传人',
  334. columnHidden: false,
  335. columnImage: false,
  336. columnSortable: false,
  337. sortLv: 0,
  338. status: true,
  339. fixed: '',
  340. columnWidth: 100,
  341. },
  342. {
  343. userId: this.$store.state.user.name,
  344. functionId: 101001012,
  345. serialNumber: '101001012Table1CreateDate',
  346. tableId: "101001012Table1",
  347. tableName: "设备SOP清单",
  348. columnProp: 'createDate',
  349. headerAlign: "center",
  350. align: 'center',
  351. columnLabel: '上传时间',
  352. columnHidden: false,
  353. columnImage: false,
  354. columnSortable: false,
  355. sortLv: 0,
  356. status: true,
  357. fixed: '',
  358. columnWidth: 150,
  359. },
  360. {
  361. userId: this.$store.state.user.name,
  362. functionId: 101001012,
  363. serialNumber: '101001012Table1OrderRef3',
  364. tableId: "101001012Table1",
  365. tableName: "设备SOP清单",
  366. columnProp: 'orderRef3',
  367. headerAlign: "center",
  368. align: 'left',
  369. columnLabel: '文件类型',
  370. columnHidden: false,
  371. columnImage: false,
  372. columnSortable: false,
  373. sortLv: 0,
  374. status: true,
  375. fixed: '',
  376. columnWidth: 100,
  377. },
  378. ],
  379. userBuList: [],
  380. authSearch: false,
  381. authDownload: false,
  382. authPreview: false,
  383. authDelete: false,
  384. menuId: this.$route.meta.menuId,
  385. }
  386. },
  387. mounted () {
  388. this.$nextTick(() => {
  389. this.height = window.innerHeight - 210
  390. })
  391. },
  392. created () {
  393. // 按钮控制
  394. this.getButtonAuthData()
  395. // 获取用户的 site 和 bu
  396. this.getSiteAndBuByUserName()
  397. // 校验用户是否收藏
  398. this.favoriteIsOk()
  399. // 动态列
  400. this.getTableUserColumn(this.$route.meta.menuId + 'table1',1)
  401. if (!this.authSearch) {
  402. // 获取数据列表
  403. this.getDataList()
  404. }
  405. },
  406. methods: {
  407. // 获取用户的bu
  408. getSiteAndBuByUserName () {
  409. let tempData = {
  410. username: this.$store.state.user.name,
  411. }
  412. getSiteAndBuByUserName(tempData).then(({data}) => {
  413. if (data.code === 0) {
  414. this.userBuList = data.rows
  415. }
  416. })
  417. },
  418. // 获取数据列表
  419. getDataList () {
  420. this.searchData.limit = this.pageSize
  421. this.searchData.page = this.pageIndex
  422. eamObjectSopListSearch(this.searchData).then(({data}) => {
  423. if (data.code === 0) {
  424. this.dataList = data.page.list
  425. this.pageIndex = data.page.currPage
  426. this.pageSize = data.page.pageSize
  427. this.totalPage = data.page.totalCount
  428. }
  429. })
  430. },
  431. // 每页数
  432. sizeChangeHandle (val) {
  433. this.pageSize = val
  434. this.pageIndex = 1
  435. this.getDataList()
  436. },
  437. // 当前页
  438. currentChangeHandle (val) {
  439. this.pageIndex = val
  440. this.getDataList()
  441. },
  442. // 多选
  443. selectionChangeHandle (val) {
  444. this.dataListSelections = val
  445. },
  446. // 预览
  447. previewFile (row) {
  448. // 预览文件
  449. let image = ['jpg', 'jpeg', 'png', 'gif', 'bmp']
  450. let type = ''
  451. if (image.includes(row.fileType.toLowerCase())) {
  452. type = 'image/' + row.fileType
  453. }
  454. let video = ['mp4', 'avi', 'mov', 'wmv', 'flv']
  455. if (video.includes(row.fileType.toLowerCase())) {
  456. type = 'video/' + row.fileType
  457. }
  458. let txt = ['txt']
  459. if (txt.includes(row.fileType.toLowerCase())) {
  460. type = 'text/plain'
  461. }
  462. let office = ['doc', 'docx', 'ppt', 'pptx', 'xls', 'xlsx']
  463. if (office.includes(row.fileType.toLowerCase())) {
  464. if (row.fileType.toLowerCase() === 'doc' || row.fileType.toLowerCase() === 'docx') {
  465. type = 'application/vnd.openxmlformats-officedocument.wordprocessingml.document'
  466. } else if (row.fileType.toLowerCase() === 'ppt' || row.fileType.toLowerCase() === 'pptx') {
  467. type = 'application/vnd.openxmlformats-officedocument.presentationml.presentation'
  468. } else {
  469. type = 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet'
  470. }
  471. }
  472. let pdf = ['pdf']
  473. if (pdf.includes(row.fileType.toLowerCase())) {
  474. type = 'application/pdf'
  475. }
  476. downLoadObjectFile(row).then(({data}) => {
  477. const blob = new Blob([data], { type: type });
  478. // 创建URL来生成预览
  479. const fileURL = URL.createObjectURL(blob);
  480. // 在新标签页中打开文件预览
  481. const newTab = window.open(fileURL, '_blank')
  482. })
  483. },
  484. // 下载
  485. downloadFile (row) {
  486. downLoadObjectFile(row)
  487. .then(({data}) => {
  488. // 不限制文件下载类型
  489. const blob = new Blob([data], {type:'application/octet-stream;charset=utf-8'})
  490. // 下载文件名称
  491. const fileName = row.fileName
  492. // a标签下载
  493. const linkNode = document.createElement('a')
  494. linkNode.download = fileName // a标签的download属性规定下载文件的名称
  495. linkNode.style.display = 'none'
  496. linkNode.href = URL.createObjectURL(blob) // 生成一个Blob URL
  497. document.body.appendChild(linkNode)
  498. linkNode.click() // 模拟在按钮上的一次鼠标单击
  499. URL.revokeObjectURL(linkNode.href) // 释放URL 对象
  500. document.body.removeChild(linkNode)
  501. })
  502. },
  503. deleteFile (row) {
  504. let tempData = {
  505. id: row.id
  506. }
  507. this.$confirm('确定要删除此文件?', '提示', {
  508. confirmButtonText: '确定',
  509. cancelButtonText: '取消',
  510. type: 'warning'
  511. }).then(() => {
  512. deleteObjectFile(tempData).then(({data}) => {
  513. if (data && data.code === 0) {
  514. this.getDataList()
  515. this.$message({
  516. message: '操作成功',
  517. type: 'success',
  518. duration: 1500,
  519. onClose: () => {
  520. }
  521. })
  522. } else {
  523. this.$alert(data.msg, '错误', {
  524. confirmButtonText: '确定'
  525. })
  526. }
  527. })
  528. })
  529. },
  530. // 校验用户是否收藏
  531. favoriteIsOk () {
  532. let userFavorite = {
  533. userId: this.$store.state.user.id,
  534. languageCode: this.$i18n.locale
  535. }
  536. userFavoriteList(userFavorite).then(({data}) => {
  537. for (let i = 0; i < data.list.length; i++) {
  538. if(this.$route.meta.menuId === data.list[i].menuId){
  539. this.favorite = true
  540. }
  541. }
  542. })
  543. },
  544. // 收藏 OR 取消收藏
  545. favoriteFunction () {
  546. let userFavorite = {
  547. userId: this.$store.state.user.id,
  548. functionId: this.$route.meta.menuId,
  549. }
  550. if (this.favorite) {
  551. removeUserFavorite(userFavorite).then(({data}) => {
  552. this.$message.success(data.msg)
  553. this.favorite = false
  554. })
  555. } else {
  556. // 收藏
  557. saveUserFavorite(userFavorite).then(({data}) => {
  558. this.$message.success(data.msg)
  559. this.favorite = true
  560. })
  561. }
  562. },
  563. //导出excel
  564. async createExportData () {
  565. this.searchData.limit = -1
  566. this.searchData.page = 1
  567. await eamObjectSopListSearch(this.searchData).then(({data}) => {
  568. this.exportList = data.page.list
  569. })
  570. return this.exportList
  571. },
  572. startDownload () {},
  573. finishDownload () {},
  574. fields () {
  575. let json = "{"
  576. this.columnList.forEach((item, index) => {
  577. if (index == this.columnList.length - 1) {
  578. json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\""
  579. } else {
  580. json += "\"" + item.columnLabel + "\"" + ":" + "\"" + item.columnProp + "\"" + ","
  581. }
  582. })
  583. json += "}"
  584. let s = eval("(" + json + ")")
  585. return s
  586. },
  587. // 动态列开始 获取 用户保存的 格式列
  588. async getTableUserColumn (tableId, columnId) {
  589. let queryTableUser = {
  590. userId: this.$store.state.user.name,
  591. functionId: this.$route.meta.menuId,
  592. tableId: tableId,
  593. status: true,
  594. languageCode: this.$i18n.locale
  595. }
  596. await getTableUserListLanguage(queryTableUser).then(({data}) => {
  597. if (data.rows.length > 0) {
  598. //this.columnList1 = []
  599. switch (columnId) {
  600. case 1:
  601. this.columnList = data.rows
  602. break;
  603. }
  604. } else {
  605. this.getColumnList(tableId, columnId)
  606. }
  607. })
  608. },
  609. // 获取 tableDefault 列
  610. async getColumnList (tableId, columnId) {
  611. let queryTable = {
  612. functionId: this.$route.meta.menuId,
  613. tableId: tableId,
  614. languageCode: this.$i18n.locale
  615. }
  616. await getTableDefaultListLanguage(queryTable).then(({data}) => {
  617. if (!data.rows.length == 0) {
  618. switch (columnId) {
  619. case 1:
  620. this.columnList = data.rows
  621. break;
  622. }
  623. }
  624. })
  625. },
  626. //获取按钮的权限数据
  627. getButtonAuthData () {
  628. let searchFlag = this.isAuth(this.menuId + ":search")
  629. let downloadFlag = this.isAuth(this.menuId + ":download")
  630. let previewFlag = this.isAuth(this.menuId + ":preview")
  631. let deleteFlag = this.isAuth(this.menuId + ":delete")
  632. //处理页面的权限数据
  633. this.authSearch = !searchFlag
  634. this.authDownload = !downloadFlag
  635. this.authPreview = !previewFlag
  636. this.authDelete = !deleteFlag
  637. },
  638. }
  639. }
  640. </script>
  641. <style scoped>
  642. .el-table /deep/ .cell{
  643. height: auto;
  644. line-height: 1.5;
  645. }
  646. </style>