From cf907e2df0a06f55540113b59f5b9d340f72104d Mon Sep 17 00:00:00 2001 From: longyvfengyun <496960745@qq.com> Date: 星期五, 08 十二月 2023 15:40:52 +0800 Subject: [PATCH] 产品中心查看SOP信息 --- src/pages/resourceManage/sopFile/list.vue | 81 +++ package.json | 1 src/assets/js/tools/getFileTypeAndName.js | 16 src/pages/resourceManage/product/details/details.vue | 18 src/pages/resourceManage/sopFile/sopList.vue | 974 +++++++++++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 1,074 insertions(+), 16 deletions(-) diff --git a/package.json b/package.json index c422e82..ded0911 100644 --- a/package.json +++ b/package.json @@ -79,6 +79,7 @@ "rules": { "no-debugger": "off", "no-unused-vars": "off", + "no-mixed-spaces-and-tabs": "off", "vue/no-unused-components": "off" } }, diff --git a/src/assets/js/tools/getFileTypeAndName.js b/src/assets/js/tools/getFileTypeAndName.js new file mode 100644 index 0000000..60a406c --- /dev/null +++ b/src/assets/js/tools/getFileTypeAndName.js @@ -0,0 +1,16 @@ +/** + * 鑾峰彇璺緞涓枃浠剁殑鍚嶇О鍜屽悗缂� + * @param path 璺緞鍚嶇О + * @return {{name: *, type: (string|string)}} + */ +function getFileTypeAndName(path) { + let reg = /(.*\\+)*(.*)$/; + let fileName = path.match(reg)[2]; + let arr = fileName.split("."); + return { + type: arr.length ? arr[arr.length - 1].toLowerCase() : "", + name: fileName, + }; +} + +export default getFileTypeAndName; diff --git a/src/pages/resourceManage/product/details/details.vue b/src/pages/resourceManage/product/details/details.vue index e3677d1..a379983 100644 --- a/src/pages/resourceManage/product/details/details.vue +++ b/src/pages/resourceManage/product/details/details.vue @@ -248,6 +248,7 @@ @click="changeStatus" >閿佸畾鐗堟湰</a-button > + <a-button type="primary" @click="viewSopFile">SOP鏌ョ湅</a-button> </template> </a-card> </a-layout-footer> @@ -428,6 +429,17 @@ <a-empty v-else /> </div> </a-modal> + <a-modal + :visible="showSop" + :footer="null" + :width="1366" + title="SOP鏌ョ湅" + :destroyOnClose="true" + @cancel="showSop = false"> + <div style="height: 600px"> + <sop-list :parentCode="parentCode"></sop-list> + </div> + </a-modal> </div> </template> @@ -443,6 +455,7 @@ import DownloadReason from "@/pages/components/downloadReason"; import DownloadLogs from "@/pages/components/downloadLogs"; +import SopList from "@/pages/resourceManage/sopFile/sopList.vue"; import List from "./list"; import getWebUrl from "@/assets/js/tools/getWebUrl"; import { @@ -472,6 +485,7 @@ mixins: [WSMixin], data() { return { + showSop: false, fileTreeVisible: false, fileTree: [], userListAll: [], @@ -725,6 +739,7 @@ Pop, DownloadReason, DownloadLogs, + SopList, }, computed: { ...mapGetters("setting", ["affixed"]), @@ -785,6 +800,9 @@ }, }, methods: { + viewSopFile() { + this.showSop = true; + }, getRoleUser() { getRoleUser(1) .then((res) => { diff --git a/src/pages/resourceManage/sopFile/list.vue b/src/pages/resourceManage/sopFile/list.vue index 13ea10c..023725d 100644 --- a/src/pages/resourceManage/sopFile/list.vue +++ b/src/pages/resourceManage/sopFile/list.vue @@ -60,9 +60,8 @@ <a-tag v-else class="tag-all" color="#f50"> 閫傜敤鍏ㄩ儴 </a-tag> <template v-if="canDownload"> <a-divider type="vertical"></a-divider> - <a :disabled="!record.status" @click="downloadFile(record)" - >涓嬭浇</a - > + <a v-if="record.isCanPreview" :disabled="!record.status" @click="downloadFile(record)">棰勮</a> + <a v-else :disabled="!record.status" @click="downloadFile(record)">涓嬭浇</a> </template> <a-divider type="vertical"></a-divider> <a-popover title="" trigger="hover"> @@ -221,6 +220,20 @@ <a-empty v-else /> </div> </a-modal> + + <!-- 鏃ュ織 --> + <a-modal + :visible="pdfInfo.visible" + :footer="null" + :width="960" + title="鏂囦欢棰勮" + :destroyOnClose="true" + @cancel="pdfCancel"> + <div style="height:600px; overflow-y: auto"> + <iframe :src="pdfInfo.src"></iframe> + </div> + + </a-modal> </div> </template> @@ -245,6 +258,9 @@ import offset from "@/assets/js/tools/offset"; import Pop from "./pop"; import DescRes from "./descRes"; +import getFileTypeAndName from "@/assets/js/tools/getFileTypeAndName"; +import VuePdf from "vue-pdf"; + export default { components: { @@ -252,10 +268,19 @@ Pop, DescRes, EmailCard, + VuePdf, }, name: "list", data() { return { + pdfInfo: { + visible: false, + src: "", + loadedRatio: 0, + page: 1, + numPages: 0, + rotate: 0, + }, rowFileName: '', logList: [], logVisible: false, @@ -408,6 +433,15 @@ width: 260, customCell: this.customCell, }, + { + title: "鏄惁閿佸畾", + dataIndex: "status", + dataType: "boolean", + align: "center", + searchAble: true, + width: 100, + scopedSlots: { customRender: "status" }, + }, { title: "鎿嶄綔", dataIndex: "operation", @@ -556,6 +590,7 @@ let name2 = fileName + fileVersion; if (name1.toLowerCase() != name2.toLowerCase()) { + console.log(name1.toLowerCase()+"&&&&&&"+ name2.toLowerCase()); this.$message.error("sop涓庤鏄庢枃浠跺彲鑳戒笉鍖归厤"); return false; } @@ -806,6 +841,9 @@ case "model": params[v] = conditions[v]; break; + case "status": + params[v] = conditions[v]?1:0; + break; case "parentType": case "chileType": data[v] = conditions[v]; @@ -823,7 +861,11 @@ list = data2.list; total = data2.total; } - this.dataSource = list; + this.dataSource = list.map(item=>{ + const fileInfo = getFileTypeAndName(item.fileUrl); + item.isCanPreview = fileInfo.type === "pdf"; + return item; + }); this.total = total; this.getSopType1(); if (-1 == this.update) { @@ -835,18 +877,22 @@ }); }, downloadFile(record) { - // console.log(record); - let loading = this.$layer.loading(); - let link = document.createElement("a"); - link.style.display = "none"; - let url = this.webUrl + record.fileUrl; - let fileName = record.fileUrl.split("/").pop(); - link.href = url; - link.download = fileName; - document.body.appendChild(link); - link.click(); - this.$layer.close(loading); - document.body.removeChild(link); + const fileInfo = getFileTypeAndName(record.fileUrl); + if(fileInfo.type === 'pdf') { // 棰勮 + window.open("http://localhost:8092/cad/"+record.fileUrl); + }else { // 涓嬭浇 + let loading = this.$layer.loading(); + let link = document.createElement("a"); + link.style.display = "none"; + let url = this.webUrl + record.fileUrl; + let fileName = record.fileUrl.split("/").pop(); + link.href = url; + link.download = fileName; + document.body.appendChild(link); + link.click(); + this.$layer.close(loading); + document.body.removeChild(link); + } }, reasonCancel() { this.reasonVisible = false; @@ -887,6 +933,9 @@ logCancel() { this.logVisible = false; }, + pdfCancel() { + this.pdfInfo.visible = false; + }, goHistory(record) { let { fileName } = record; this.$router.push({ diff --git a/src/pages/resourceManage/sopFile/sopList.vue b/src/pages/resourceManage/sopFile/sopList.vue new file mode 100644 index 0000000..72a1050 --- /dev/null +++ b/src/pages/resourceManage/sopFile/sopList.vue @@ -0,0 +1,974 @@ +<template> + <div class="main"> + <div class="inner" ref="wraper"> + <a-spin class="" :spinning="spinning" tip="鎷煎懡鍔犺浇涓�..."> + <a-card> + <advance-table + ref="table" + class="doc-center-table" + :data-source="dataSource" + :columns="columns" + title=" " + :row-key="(record, index) => index" + @search="onSearch" + @refresh="onRefresh" + @reset="onReset" + :format-conditions="true" + :scroll="{ y }" + :pagination="{ + current: pageCurr, + pageSize: pageSize, + total: total, + showSizeChanger: true, + showLessItems: true, + showQuickJumper: true, + pageSizeOptions: ['10', '20', '50', '100'], + showTotal: (total, range) => + `绗� ${range[0]}-${range[1]} 鏉★紝鎬昏 ${total} 鏉, + onChange: onPageChange, + onShowSizeChange: onSizeChange, + }"> + <template slot="action" slot-scope="{ record }"> + <a-popover v-if="!record.currentFlag" title="" trigger="hover"> + <div class="" slot="content" style="width: 450px"> + <a-table + size="small" + :scroll="{ y: 300 }" + bordered + :columns="prodsColumns" + :data-source="record.sopProductList" + :pagination="false" + :expandRowByClick="true" + :row-key="(record1, index) => index" + > + <!-- <template slot="action" slot-scope="record1"> + 123{{ record1 }} + </template> --> + </a-table> + </div> + <a>閫傜敤浜у搧</a> + </a-popover> + <a-tag v-else class="tag-all" color="#f50"> 閫傜敤鍏ㄩ儴 </a-tag> + <template v-if="canDownload"> + <a-divider type="vertical"></a-divider> + <a v-if="record.isCanPreview" :disabled="!record.status" @click="downloadFile(record)">棰勮</a> + <a v-else :disabled="!record.status" @click="downloadFile(record)">涓嬭浇</a> + </template> + <a-divider type="vertical"></a-divider> + <a-popover title="" trigger="hover"> + <a-space class="btn-grp" direction="vertical" slot="content"> + <a-button + v-if="canUpload" + type="primary" + @click="updateDesc(record)" + >鏇存柊璇存槑</a-button + > + <a-button + v-if="canUpload" + type="primary" + @click="lock(record)" + >{{ record.status == 0 ? "瑙i攣" : "閿佸畾" }}</a-button + > + <a-button + v-if="canUpload" + type="primary" + @click="handleEmailShow(record)" + >閭欢閫氱煡</a-button + > + <a-button type="primary" @click="viewLog(record)" + >閿佸畾鏃ュ織</a-button + > + <a-button type="primary" @click="goHistory(record)" + >鍘嗗彶鐗堟湰</a-button + > + </a-space> + <a>鏇村</a> + </a-popover> + </template> + </advance-table> + </a-card> + </a-spin> + </div> + <pop + :visible.sync="popVisible" + :x="popPosition.x" + :y="popPosition.y" + :position="popPosition.dir" + :info="popInfo" + ></pop> + <a-modal + :visible="uploadShow" + :footer="null" + :width="800" + title="涓婁紶杞欢" + :destroyOnClose="true" + :maskClosable="false" + @cancel="uploadCancel" + > + <div class=""> + <template v-if="!onlyXls"> + <a-row type="flex" class="row"> + <a-col flex="6em" class="label">sop鍖�</a-col> + <a-col :flex="1"> + <a-upload + class="upload" + :before-upload="beforeUpload" + @change="uploadChange" + accept=".zip,.rar" + > + <a-button type="primary">閫夊帇缂╁寘</a-button> + </a-upload> + </a-col> + </a-row> + </template> + <a-row type="flex" class="row"> + <a-col flex="6em" class="label">SOP璇存槑</a-col> + <a-col :flex="1"> + <a-upload + class="upload" + :before-upload="beforeUpload" + @change="uploadChange1" + accept=".xls,.xlsx" + > + <a-button type="primary">璇存槑鏂囦欢</a-button> + </a-upload> + </a-col> + </a-row> + <div class="sub-title">璇存槑鏂囦欢瑙f瀽缁撴灉</div> + <div class="res-content"> + <desc-res :info="resObj"></desc-res> + </div> + <div class="modal-footer"> + <a-button type="danger" @click="uploadCancel"> 鍙栨秷 </a-button> + <a-button v-if="!onlyXls" type="primary" @click="uploadSop"> + 鎻愪氦 + </a-button> + <a-button v-else type="primary" @click="applyModel"> 鎻愪氦 </a-button> + </div> + </div> + </a-modal> + <a-modal + :visible="emailShow" + :footer="null" + :width="760" + title="閭欢鍙戦��" + :destroyOnClose="true" + :maskClosable="false" + @cancel="emailCancel" + > + <email-card + :visible.sync="emailShow" + :users="userList" + :title="emailInfo.title" + :content="emailInfo.content" + :type="2" + v-if="emailShow" + ></email-card> + </a-modal> + <!-- 鎿嶄綔鍘熷洜 --> + <a-modal + :visible="reasonVisible" + :width="460" + title="鎿嶄綔鍘熷洜" + :destroyOnClose="true" + :maskClosable="false" + @cancel="reasonCancel" + @ok="reasonOk" + > + <a-form-model-item ref="name" label="鎿嶄綔鍘熷洜"> + <a-input + type="textarea" + v-model="reason" + placeHolder="璇疯緭鍏ユ搷浣滃師鍥�" + /> + </a-form-model-item> + </a-modal> + <!-- 鏃ュ織 --> + <a-modal + :visible="logVisible" + :footer="null" + :width="800" + title="鎿嶄綔鏃ュ織" + :destroyOnClose="true" + @cancel="logCancel" + > + <div class="log-content"> + <a-timeline v-if="logList.length"> + <a-timeline-item + v-for="(item, idx) in logList" + :key="'log_' + idx" + :color="item.status == 0 ? 'red' : 'green'" + > + <div> + <span class="user">{{ item.userName }}</span> 鍦� + <span class="time">{{ item.createTime }}</span> + {{ item.status == 0 ? "閿佸畾" : "瑙i攣" }}浜嗙増鏈� + <span class="version">{{ item.fileVersion }}</span> + </div> + <div>鎿嶄綔鍘熷洜: {{ item.reason ? item.reason : "鏃�" }}</div> + </a-timeline-item> + </a-timeline> + <a-empty v-else /> + </div> + </a-modal> + + <!-- 鏃ュ織 --> + <a-modal + :visible="pdfInfo.visible" + :footer="null" + :width="960" + title="鏂囦欢棰勮" + :destroyOnClose="true" + @cancel="pdfCancel"> + <div style="height:600px; overflow-y: auto"> + <iframe :src="pdfInfo.src"></iframe> + </div> + + </a-modal> + </div> +</template> + +<script> +import AdvanceTable from "@/components/table/advance/AdvanceTable"; +import getWebUrl from "@/assets/js/tools/getWebUrl"; +import checkPermit from "@/assets/js/tools/checkPermit"; +import PERMITS from "@/assets/js/const/const_permits"; +import { mapGetters } from "vuex"; +import EmailCard from "../../components/emailCard"; +import { getUserList } from "../../permission/apis"; +import { + fileParse, + addSop, + getList, + getSopType1, + getSopType2, + updateSop, + sopLock, + getLogList, +} from "./apis"; +import offset from "@/assets/js/tools/offset"; +import Pop from "./pop"; +import DescRes from "./descRes"; +import getFileTypeAndName from "@/assets/js/tools/getFileTypeAndName"; +import VuePdf from "vue-pdf"; + + +export default { + props: { + parentCode: { + type: [String, Number], + default: 0 + } + }, + components: { + AdvanceTable, + Pop, + DescRes, + EmailCard, + VuePdf, + }, + name: "list", + data() { + return { + pdfInfo: { + visible: false, + src: "", + loadedRatio: 0, + page: 1, + numPages: 0, + rotate: 0, + }, + rowFileName: '', + logList: [], + logVisible: false, + currentObj: null, + reasonVisible: false, + reason: "", + emailShow: false, + emailInfo: { + title: "", + content: "", + }, + userList: [], + onlyXls: false, + uploadShow: false, + webUrl: getWebUrl(), + prodsColumns: [ + { + title: "鐗╂枡缂栫爜", + dataIndex: "code", + align: "center", + }, + { + title: "鍨�/鏉垮彿", + dataIndex: "model", + align: "center", + width: 180, + }, + // { + // title: "鎿嶄綔", + // dataIndex: "operation", + // align: "center", + // width: 180, + // scopedSlots: { customRender: "action" }, + // }, + ], + file: null, + file1: null, + resObj: {}, + popInfo: {}, + popVisible: false, + popPosition: { + x: 500, + y: 100, + dir: "bottom", + }, + spinning: false, + loading: false, + pageCurr: 1, + pageSize: 20, + total: 0, + y: 400, + update: -1, + conditions: {}, + columns: [ + { + title: "鍙戝竷鏃堕棿", + dataIndex: "releaseDate", + align: "center", + width: 160, + customCell: this.customCell, + }, + { + title: "璐熻矗浜�", + dataIndex: "editor", + align: "center", + width: 90, + customCell: this.customCell, + }, + { + title: "瀹℃牳浜�", + dataIndex: "auditor", + align: "center", + width: 90, + customCell: this.customCell, + }, + { + title: "鍙戝竷璇存槑", + dataIndex: "releaseNotes", + align: "center", + width: 260, + customCell: this.customCell, + }, + { + title: "鎿嶄綔", + dataIndex: "operation", + align: "center", + width: 200, + fixed: "right", + scopedSlots: { customRender: "action" }, + noSearch: true, + }, + ], + dataSource: [], + }; + }, + computed: { + ...mapGetters("account", ["permits"]), + ...mapGetters("setting", ["affixed"]), + canUpload() { + return checkPermit(PERMITS.uploadSoftware, this.permits); + }, + canDownload() { + return checkPermit(PERMITS.downloadSop, this.permits); + }, + }, + watch: { + update(n) { + if (-1 != n && !this._inactive) { + this.$nextTick(() => { + const table = this.$refs.table; + const header = document.querySelectorAll( + ".doc-center-table .ant-table-header" + )[0].clientHeight; + const bar = document.querySelectorAll(".header-bar")[0].clientHeight; + if (table.fullScreen) { + this.y = table.$el.clientHeight - bar - header - 64; + } else { + const wraper = this.$refs.wraper.clientHeight; + const card = document.querySelectorAll(".ant-card-body")[0]; + const { paddingBottom, paddingTop } = getComputedStyle(card, null); + const h = + wraper - + header - + 64 - + bar - + parseInt(paddingBottom) - + parseInt(paddingTop); + this.y = h; + } + }); + } + }, + affixed() { + setTimeout(() => { + this.update = Math.random(); + }, 200); + }, + }, + methods: { + searchAllUserList() { + getUserList() + .then((res) => { + let rs = res.data; + if (rs.code && rs.data) { + this.userList = rs.data2; + } + }) + .catch((error) => { + console.log(error); + }); + }, + showUpload() { + this.file = null; + this.file1 = null; + this.resObj = {}; + this.onlyXls = false; + this.uploadShow = true; + }, + updateDesc(row) { + this.file = null; + this.file1 = null; + this.resObj = { rowId: row.id }; + this.rowFileName = row.fileName; + this.onlyXls = true; + this.uploadShow = true; + }, + uploadCancel() { + this.uploadShow = false; + }, + handleEmailShow(record) { + this.emailInfo.title = + "[sop鍙戝竷璁板綍]" + record.fileName + " 鐗堟湰鍙凤細" + record.fileVersion; + let sopProductListText = record.sopProductList + .map((item) => { + return "鐗╂枡缂栫爜锛�" + item.code + " 鍨�/鏉垮彿锛�" + item.model; + }) + .join("\n"); + this.emailInfo.content = + "鏂囦欢鍩虹淇℃伅\n" + + "鏂囦欢鍚嶇О锛�" + + record.fileName + + "\n" + + "鏂囦欢绫诲瀷锛�" + + record.fileType + + "\n" + + "鏂囦欢鐗堟湰锛�" + + record.fileVersion + + "\n" + + "鍏宠仈鐗堟湰锛�" + + record.fileRelatedVersion + + "\n" + + "缂栧埗锛�" + + record.editor + + "\n" + + "瀹℃牳锛�" + + record.auditor + + "\n" + + "鍙戝竷鏃ユ湡锛�" + + record.releaseDate + + "\n" + + "鏂囦欢閫傜敤浜у搧\n" + + sopProductListText + + "\n" + + "鍙戝竷璇存槑锛�" + + record.releaseNotes; + this.emailShow = true; + }, + emailCancel() { + this.emailShow = false; + }, + uploadSop() { + if (!this.file) { + this.$message.error("璇烽�夋嫨瑕佷笂浼犵殑鍘嬬缉鍖�"); + return false; + } + if (!this.file1) { + this.$message.error("璇烽�夋嫨sop璇存槑鏂囦欢"); + return false; + } + if (!this.resObj.fileName) { + this.$message.error("sop璇存槑鏂囦欢瑙f瀽寮傚父"); + return false; + } + // 濡傛灉sop鏂囦欢鍚嶇О != sop璇存槑閲岀殑鏂囦欢鍚嶇О + 鏂囦欢鐗堟湰 鍒欐姤閿欐嫆缁� + let reg = /(.*)\..{1,5}$/; + let name1 = this.file.name.match(reg)[1]; + let { fileName, fileVersion } = this.resObj; + let name2 = fileName + fileVersion; + + if (name1.toLowerCase() != name2.toLowerCase()) { + console.log(name1.toLowerCase()+"&&&&&&"+ name2.toLowerCase()); + this.$message.error("sop涓庤鏄庢枃浠跺彲鑳戒笉鍖归厤"); + return false; + } + + let loading = this.$layer.loading(); + + const formData = new FormData(); + formData.append("multipartFile", this.file); + // formData.append("file2", this.file1); + formData.append("sopStr", JSON.stringify(this.resObj)); + addSop(formData) + .then((res) => { + let { code, data, msg } = res.data; + if (code) { + this.uploadShow = false; + this.$message.success("涓婁紶鎴愬姛"); + this.searchData(); + } else { + this.$message.error(msg); + } + this.$layer.close(loading); + }) + .catch((error) => { + this.$layer.close(loading); + console.log(error); + }); + }, + applyModel() { + if (!this.file1) { + this.$message.error("璇烽�夋嫨sop璇存槑鏂囦欢"); + return false; + } + if (!this.resObj.fileName) { + this.$message.error("sop璇存槑鏂囦欢瑙f瀽寮傚父"); + return false; + } + + if (this.rowFileName.toLowerCase() != this.resObj.fileName.toLowerCase()) { + this.$message.error("璇存槑鏂囦欢涓庤鏉¤褰曞彲鑳戒笉鍖归厤"); + return false; + } + let loading = this.$layer.loading(); + updateSop(this.resObj) + .then((res) => { + let { code, data, msg } = res.data; + if (code) { + this.uploadShow = false; + this.$message.success("涓婁紶鎴愬姛"); + this.searchData(); + } else { + this.$message.error("瑙f瀽澶辫触"); + } + this.$layer.close(loading); + }) + .catch((error) => { + this.$layer.close(loading); + console.log(error); + }); + }, + getSopType1() { + getSopType1() + .then((res) => { + let { code, data } = res.data; + let list = []; + if (code) { + list = data.map((v) => ({ + title: v.type1, + value: v.type1, + })); + } + this.columns[0].search.selectOptions = list; + }) + .catch((err) => { + console.log(err); + }); + }, + getSopType2(type) { + if (type) { + getSopType2(type) + .then((res) => { + let { code, data } = res.data; + let list = []; + if (code) { + list = data.map((v) => ({ + title: v.type2, + value: v.type2, + })); + } + this.columns[1].search.selectOptions = list; + }) + .catch((err) => { + console.log(err); + }); + } else { + this.columns[1].search.selectOptions = []; + } + }, + cellMouseenter(e, obj) { + // console.log("enter", e, obj); + const wraper = this.$refs.wraper; + const { clientHeight, clientWidth } = wraper; + const { target, clientX, clientY } = e; + let { left: x, top: y } = offset(wraper); + x = clientX - x; + y = clientY - y; + // 濡傛灉clientHeight 灏忎簬380 * 2 鍒欏乏鍙冲竷灞� + let dir = "bottom"; + if (clientHeight < 380 * 2) { + if (x + 420 + 18 > clientWidth) { + dir = "left"; + } else { + dir = "right"; + } + if (y < 180) { + y = 180; + } else if (y > clientHeight - 378) { + y = clientHeight / 2; + } + } else { + if (y + 18 + 360 > clientHeight) { + // y = clientHeight - 378; + dir = "top"; + } else { + dir = "bottom"; + } + if (x < 400) { + x = 400; + } + if (x + 400 > clientWidth) { + x = clientWidth - 400; + } + } + this.popPosition.x = x; + this.popPosition.y = y; + this.popPosition.dir = dir; + this.popInfo = obj; + this.popVisible = true; + }, + cellMouseleave(e, obj) { + // console.log("leave", obj); + this.popVisible = false; + }, + customCell(record) { + return { + on: { + mouseenter: (e) => this.cellMouseenter(e, record), + mouseleave: (e) => this.cellMouseleave(e, record), + }, + }; + }, + beforeUpload() { + return false; + }, + uploadChange(data) { + const { file, fileList } = data; + if (fileList.length > 1) { + fileList.shift(); + } + if (fileList.length) { + this.file = fileList[0].originFileObj; + } else { + this.file = null; + } + }, + uploadChange1(data) { + const { file, fileList } = data; + if (fileList.length > 1) { + fileList.shift(); + } + if (fileList.length) { + this.file1 = fileList[0].originFileObj; + } else { + this.file1 = null; + this.resObj = []; + return false; + } + let loading = this.$layer.loading(); + const formData = new FormData(); + formData.append("multipartFile", this.file1); + fileParse(formData) + .then((res) => { + this.$layer.close(loading); + let { code, data, data2, msg } = res.data; + if (code && data) { + let rowId = this.resObj.rowId; + this.resObj = data2; + this.resObj.id = rowId; + this.$message.success("瑙f瀽鎴愬姛"); + } else { + this.$message.error(msg); + } + }) + .catch((error) => { + this.$layer.close(loading); + console.log(error); + }); + }, + resize() { + setTimeout(() => { + this.update = Math.random(); + }, 200); + }, + activeFN() { + this.resize(); + }, + onSearch(conditions, searchOptions, col) { + // console.log(conditions); + // console.log(searchOptions, "00", col); + this.pageCurr = 1; + this.conditions = conditions; + if ("parentType" == col.dataIndex) { + this.parentTypeChange(col.search.value); + } + this.searchData(); + }, + onPageChange(page, pageSize) { + this.pageCurr = page; + this.pageSize = pageSize; + this.searchData(); + }, + onSizeChange(current, size) { + this.pageCurr = 1; + this.pageSize = size; + this.searchData(); + }, + onRefresh(conditions) { + this.conditions = conditions; + this.searchData(); + }, + onReset(conditions) { + this.conditions = conditions; + this.searchData(); + }, + // 鏂囦欢绫诲瀷鏌ヨ鏉′欢鍙戠敓鍙樺寲 鏌ヨ瀛愭枃浠剁被鍨嬪垪琛� 閲嶇疆瀛愭枃浠剁被鍨嬪�� + parentTypeChange(val) { + let _search = this.columns[1].search; + _search.value = []; + this.conditions["chileType"] = []; + this.getSopType2(val); + }, + searchData() { + const { pageCurr, pageSize, conditions, columns } = this; + let params = { pageCurr, pageSize }; + let data = {}; + Object.keys(conditions).forEach((v) => { + switch (v) { + case "code": + case "model": + params[v] = conditions[v]; + break; + case "status": + params[v] = conditions[v]?1:0; + break; + case "parentType": + case "chileType": + data[v] = conditions[v]; + break; + } + }); + params.status = 1; + params.code = this.parentCode; + let list = []; + let params2 = "{}" == JSON.stringify(data) ? [] : [data]; + getList(params, params2) + .then((res) => { + let { code, data, data2 } = res.data; + let total = 0; + if (code && data) { + // console.log(data2); + list = data2.list; + total = data2.total; + } + this.dataSource = list.map(item=>{ + const fileInfo = getFileTypeAndName(item.fileUrl); + item.isCanPreview = fileInfo.type === "pdf"; + return item; + }); + this.total = total; + this.getSopType1(); + if (-1 == this.update) { + this.update = Math.random(); + } + }) + .catch((err) => { + console.log(err); + }); + }, + downloadFile(record) { + const fileInfo = getFileTypeAndName(record.fileUrl); + if(fileInfo.type === 'pdf') { // 棰勮 + window.open("http://localhost:8092/cad/"+record.fileUrl); + }else { // 涓嬭浇 + let loading = this.$layer.loading(); + let link = document.createElement("a"); + link.style.display = "none"; + let url = this.webUrl + record.fileUrl; + let fileName = record.fileUrl.split("/").pop(); + link.href = url; + link.download = fileName; + document.body.appendChild(link); + link.click(); + this.$layer.close(loading); + document.body.removeChild(link); + } + }, + reasonCancel() { + this.reasonVisible = false; + }, + reasonOk() { + let { id, status } = this.currentObj; + let reason = this.reason; + status = status == 0 ? 1 : 0; + sopLock(id, status, reason).then((res) => { + const { code } = res.data; + if (code) { + this.$message.success("鎿嶄綔鎴愬姛"); + this.reasonVisible = false; + this.searchData(); + } else { + this.$message.error("鎿嶄綔澶辫触"); + } + }); + }, + lock(record) { + this.reason = ""; + this.currentObj = record; + this.reasonVisible = true; + }, + viewLog(obj) { + // console.log(obj); + const { id, fileVersion } = obj; + getLogList(id).then((res) => { + const { code, data, data2 } = res.data; + if (code) { + this.logList = data2.map((v) => ({ ...v, fileVersion })); + this.logVisible = true; + } else { + this.$message.error("鏃ュ織鏌ヨ澶辫触"); + } + }); + }, + logCancel() { + this.logVisible = false; + }, + pdfCancel() { + this.pdfInfo.visible = false; + }, + goHistory(record) { + let { fileName } = record; + this.$router.push({ + path: "/resource/sop-history", + query: { fileName }, + }); + }, + }, + mounted() { + this.searchData(); + this.searchAllUserList(); + this.getSopType1(); + window.addEventListener("resize", this.resize); + }, + destroyed() { + window.removeEventListener("resize", this.resize); + }, +}; +</script> + +<style scoped lang="less"> +.main { + height: 100%; + position: relative; + .inner { + position: absolute; + left: 0; + top: 0; + right: 0; + bottom: 0; + } +} +.img-wraper { + width: 80px; + height: 50px; + display: inline-block; + .image-view { + width: 100%; + height: 100%; + /deep/img { + width: 100%; + height: 100%; + object-fit: contain; + } + } +} +/deep/table { + table-layout: fixed; +} +.modal-footer { + text-align: right; + button + button { + margin-left: 8px; + } +} +.label { + display: flex; + justify-content: flex-end; + align-items: center; + padding-right: 0.4em; + height: 32px; + &::after { + content: ":"; + } +} +.row ~ .row { + margin-top: 10px; +} +.sub-title { + font-size: 14px; + font-weight: 700; + margin-top: 10px; +} +.res-content { + max-height: 260px; + overflow-y: auto; + margin-bottom: 10px; +} +.btn-grp button { + width: 6.4em; +} +.tag-all { + margin: 0; +} +/deep/ .ant-table-fixed-right { + .ant-table-body-outer { + margin-bottom: 0 !important; + } + .ant-table-body-inner { + overflow-x: hidden; + } +} +.log-content { + max-height: 400px; + overflow-y: auto; + + .user { + color: #23aaf2; + font-weight: 700; + } + + .time { + color: #f9be13; + font-weight: 700; + } + + .version { + color: #0aedb2; + font-weight: 700; + } + + .ant-timeline-item:first-of-type { + padding-top: 6px; + } +} +</style> -- Gitblit v1.9.1