| | |
| | | <a-layout class="main-content"> |
| | | <a-layout-header> |
| | | <a-card size="small"> |
| | | <a-descriptions :column="4" title=""> |
| | | <a-descriptions :column="7" title=""> |
| | | <a-descriptions-item label="产品编号">{{ |
| | | parentCode |
| | | }}</a-descriptions-item> |
| | | <a-descriptions-item label="产品型号">{{ |
| | | <a-descriptions-item label="产品型号" :span="2">{{ |
| | | parentModel |
| | | }}</a-descriptions-item> |
| | | <a-descriptions-item label="产品名称">{{ |
| | | <a-descriptions-item label="产品名称" :span="2">{{ |
| | | parentName |
| | | }}</a-descriptions-item> |
| | | <a-descriptions-item label="定制单号" :span="2">{{ |
| | |
| | | :data-source="dataSource" |
| | | :pagination="false" |
| | | :expandRowByClick="true" |
| | | :row-key="(record, index) => record.subCode + '_' + index" |
| | | :rowClassName=" |
| | | (record) => |
| | | record.children && record.children.length |
| | | ? 'is-replace' |
| | | : '' |
| | | :row-key=" |
| | | (record, index) => |
| | | record.p_subCode |
| | | ? record.p_subCode + '_' + record.subCode + '_' + index |
| | | : record.subCode + '_' + index |
| | | " |
| | | :rowClassName="rowClassFn" |
| | | > |
| | | <template slot="dataIndex" slot-scope="text, record, index"> |
| | | {{ index + 1 }} |
| | |
| | | v-if="canViewDoc && canDownloadDoc" |
| | | type="vertical" |
| | | ></a-divider> |
| | | <a v-if="canDownloadDoc" @click="downloadLog(record)" |
| | | <a |
| | | v-if="canDownloadDoc" |
| | | @click="showReason('downloadLog', record)" |
| | | >下载</a |
| | | > |
| | | </div> |
| | | <template |
| | | v-if=" |
| | | record.softwares && |
| | | record.softwares.length && |
| | | canDownloadSoftware |
| | | record.softwares.length && |
| | | canDownloadSoftware |
| | | " |
| | | > |
| | | <a-divider |
| | |
| | | <template slot="action" slot-scope="text, record1"> |
| | | <a |
| | | v-if="canDownloadSoftware" |
| | | @click="downloadLog(record1)" |
| | | @click="showReason('downloadLog', record1)" |
| | | >下载</a |
| | | > |
| | | </template> |
| | |
| | | </div> |
| | | <a>软件列表</a> |
| | | </a-popover> |
| | | </template> |
| | | <template v-if="/^0120/.test(record.subCode)"> |
| | | <a-divider |
| | | v-if=" |
| | | record.softwares && |
| | | record.softwares.length && |
| | | canDownloadSoftware |
| | | " |
| | | type="vertical" |
| | | ></a-divider> |
| | | <a href="javascript:;" @click="toDetails0120(record)" |
| | | >详情</a |
| | | > |
| | | </template> |
| | | <template v-if="/^08|^09/.test(record.subCode)"> |
| | | <a-divider |
| | | v-if=" |
| | | record.softwares && |
| | | record.softwares.length && |
| | | canDownloadSoftware |
| | | " |
| | | type="vertical" |
| | | ></a-divider> |
| | | <a |
| | | href="javascript:;" |
| | | @click="toDetails_type(record, '0809')" |
| | | >详情</a |
| | | > |
| | | </template> |
| | | <template v-if="/^0235/.test(record.subCode)"> |
| | | <a-divider |
| | | v-if=" |
| | | record.softwares && |
| | | record.softwares.length && |
| | | canDownloadSoftware |
| | | " |
| | | type="vertical" |
| | | ></a-divider> |
| | | <a |
| | | href="javascript:;" |
| | | @click="toDetails_type(record, '0235')" |
| | | >详情</a |
| | | > |
| | | </template> |
| | | </template> |
| | | </a-table> |
| | |
| | | </div> |
| | | <a-button type="primary">其他附件</a-button> |
| | | </a-popover> --> |
| | | <a-button type="primary" @click="viewLog">日志</a-button> |
| | | <a-button type="primary" @click="viewLog">状态日志</a-button> |
| | | <a-button type="primary" @click="downloadLogs">下载日志</a-button> |
| | | <a-button |
| | | v-if="otherDoc.length && currentVersion.enabled" |
| | | v-if="otherDoc.length && currentVersion.enabled == 1" |
| | | type="primary" |
| | | @click="showOtherDoc" |
| | | >其他附件</a-button |
| | | > |
| | | <a-button |
| | | v-if="canDownloadBom && currentVersion.enabled" |
| | | v-if=" |
| | | ((canDownloadBom && currentVersion.enabled == 1) || isTester) && |
| | | !is0120 |
| | | " |
| | | type="primary" |
| | | @click="checkLock('zipDownload')" |
| | | >bom下载</a-button |
| | | > |
| | | <a-button |
| | | v-if="canDownloadBom && currentVersion.enabled && originalZipUrl" |
| | | v-if=" |
| | | (((canDownloadBom || canDownloadOriginBom) && |
| | | currentVersion.enabled == 1) || |
| | | isTester) && |
| | | originalZipUrl && |
| | | !is0120 |
| | | " |
| | | type="primary" |
| | | @click="checkLock('OriginalZipDownload')" |
| | | >下载原始包</a-button |
| | | > |
| | | <a-button |
| | | v-if="isTester && originalZipUrl" |
| | | type="primary" |
| | | @click="viewRar" |
| | | >查看原始包</a-button |
| | | > |
| | | <a-button |
| | | type="primary" |
| | | v-if=" |
| | | softwareList.length && |
| | | canDownloadSoftware && |
| | | currentVersion.enabled |
| | | canDownloadSoftware && |
| | | currentVersion.enabled == 1 |
| | | " |
| | | @click="showSoftwareDownload" |
| | | >软件下载</a-button |
| | | > |
| | | <a-button |
| | | type="primary" |
| | | v-if="!currentVersion.enabled && canLockBom" |
| | | v-if=" |
| | | currentVersion.enabled == 0 && |
| | | canLockBom && |
| | | (!is0120 || maxVersionid == currentVersion.id) |
| | | " |
| | | @click="changeStatus" |
| | | >激活版本</a-button |
| | | > |
| | | <a-button |
| | | type="primary" |
| | | v-if="currentVersion.enabled && canLockBom" |
| | | v-if="currentVersion.enabled == -1 && isTester" |
| | | @click="changeStatus" |
| | | >解锁版本</a-button |
| | | > |
| | | <a-button |
| | | type="primary" |
| | | v-if="currentVersion.enabled == 1 && canLockBom" |
| | | @click="changeStatus" |
| | | >锁定版本</a-button |
| | | > |
| | | <a-button type="primary" @click="viewSopFile">SOP查看</a-button> |
| | | <a-button v-if="originalZipUrl" type="primary" @click="preview" |
| | | >原始包预览</a-button |
| | | > |
| | | </template> |
| | | </a-card> |
| | |
| | | <a-modal |
| | | :visible="softwareDownloadShow" |
| | | :footer="null" |
| | | :width="600" |
| | | :width="960" |
| | | title="软件下载" |
| | | :destroyOnClose="true" |
| | | :maskClosable="false" |
| | |
| | | :row-key="(record, index) => index" |
| | | > |
| | | <template slot="action" slot-scope="text, record"> |
| | | <a @click="downloadLog(record)">下载</a> |
| | | <a @click="showReason('downloadLog', record)">下载</a> |
| | | </template> |
| | | </a-table> |
| | | <pop |
| | |
| | | :footer="null" |
| | | @cancel="otherDocCancel" |
| | | > |
| | | <files-table :list="otherDoc" :info="info"></files-table> |
| | | <files-table |
| | | :list="otherDoc" |
| | | :info="info" |
| | | :type="12" |
| | | :oprate-version="currentVersion.versionTime" |
| | | ></files-table> |
| | | </a-modal> |
| | | <!-- 锁定清单 --> |
| | | <a-modal |
| | |
| | | <div> |
| | | <span class="user">{{ item.owner }}</span> 在 |
| | | <span class="time">{{ item.createTime }}</span> |
| | | {{ item.lockFlag ? "锁定" : "激活" }}了版本 |
| | | {{ |
| | | { "-1": "上传", "0": "激活", "1": "锁定" }[item.lockFlag] |
| | | }}了版本 |
| | | <span class="version">{{ item.versionTime }}</span> |
| | | </div> |
| | | <div>操作原因: {{ item.reason ? item.reason : "无" }}</div> |
| | |
| | | <a-empty v-else /> |
| | | </div> |
| | | </a-modal> |
| | | <download-reason |
| | | :reason-visible.sync="downloadReasonVisible" |
| | | v-if="downloadReasonVisible" |
| | | @ok="downloadReasonOk" |
| | | ></download-reason> |
| | | <download-logs |
| | | :visible.sync="downloadlogVisible" |
| | | v-if="downloadlogVisible" |
| | | :type="12" |
| | | :oprate-info="oprateInfo" |
| | | ></download-logs> |
| | | <a-modal |
| | | :visible="fileTreeVisible" |
| | | :footer="null" |
| | | :width="860" |
| | | title="文件列表" |
| | | :destroyOnClose="true" |
| | | @cancel="fileTreeVisible = false" |
| | | > |
| | | <div class="log-content"> |
| | | <a-tree |
| | | v-if="fileTree.length" |
| | | :show-line="true" |
| | | defaultExpandAll |
| | | :tree-data="fileTree" |
| | | /> |
| | | <a-empty v-else /> |
| | | </div> |
| | | </a-modal> |
| | | |
| | | <a-modal |
| | | :visible="fileTreeViewVisible" |
| | | :footer="null" |
| | | :width="860" |
| | | title="文件列表" |
| | | :destroyOnClose="true" |
| | | @cancel="fileTreeViewVisible = false" |
| | | > |
| | | <a-input-search |
| | | style="margin-bottom: 8px" |
| | | v-model="searchValue" |
| | | placeholder="输入关键词搜索文件名" |
| | | @change="searchChanged" |
| | | /> |
| | | <div class="log-content"> |
| | | <a-tree |
| | | class="file-tree-view" |
| | | v-if="fileTreeView.length && treeReset" |
| | | :show-line="true" |
| | | defaultExpandAll |
| | | :tree-data="fileTreeViewRes" |
| | | > |
| | | <template slot="custom" slot-scope="item"> |
| | | <div class="flex-r space-between"> |
| | | <span v-if="item.title.indexOf(searchValue) > -1" |
| | | >{{ item.title.substr(0, item.title.indexOf(searchValue)) |
| | | }}<span style="color: #f50">{{ searchValue }}</span |
| | | >{{ |
| | | item.title.substr( |
| | | item.title.indexOf(searchValue) + searchValue.length |
| | | ) |
| | | }}</span |
| | | > |
| | | <span v-else class="node-title">{{ item.title }} </span> |
| | | <span |
| | | class="icon-wrap" |
| | | v-if="item.isLeaf && viewAble(item.type)" |
| | | title="预览" |
| | | @click="view(item)" |
| | | > |
| | | <a-icon type="file-search" /> |
| | | </span> |
| | | </div> |
| | | </template> |
| | | </a-tree> |
| | | <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> |
| | | <!-- <a-modal |
| | | :width="600" |
| | | :visible="previewVisible" |
| | | :footer="null" |
| | | @cancel="handleCancel" |
| | | > |
| | | <img alt="" style="width: 100%" :src="imgUrl" /> |
| | | </a-modal> --> |
| | | <!-- <viewer :images="imgUrl"> |
| | | <img alt="" style="width: 100%" :src="imgUrl" /> |
| | | </viewer> --> |
| | | </div> |
| | | </template> |
| | | |
| | |
| | | import Pop from "../../software/pop"; |
| | | import offset from "@/assets/js/tools/offset"; |
| | | |
| | | 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 { |
| | |
| | | getBomHistoryAndMaterial, |
| | | compare, |
| | | getOriginalZip, |
| | | checkExist, |
| | | getzipAndRarInfo, |
| | | decompress, |
| | | } from "./apis"; |
| | | import { |
| | | searchDefaultMailUser, |
| | | sendMail, |
| | | } from "../../../components/emailCard/apis"; |
| | | import { getUserList } from "../../../permission/apis"; |
| | | import { getRoleUser } from "@/pages/user/apis"; |
| | | import { setpHistoryEnable, getLockedList, getLogList } from "../apis"; |
| | | import { dwgReview } from "@/pages/workplace/apis"; |
| | | import { downloadLog } from "@/pages/system/logs/apis"; |
| | | import { downLoadFileByFilePath } from "@/assets/js/apis"; |
| | | import { mapGetters } from "vuex"; |
| | | import createWs from "@/assets/js/websocket"; |
| | | |
| | |
| | | mixins: [WSMixin], |
| | | data() { |
| | | return { |
| | | treeReset: true, |
| | | searchValue: "", |
| | | imgUrl: "", |
| | | previewVisible: false, |
| | | showSop: false, |
| | | fileTreeVisible: false, |
| | | fileTree: [], |
| | | fileTreeViewVisible: false, |
| | | fileTreeView: [], |
| | | userListAll: [], |
| | | mailList: [], |
| | | tester: [], |
| | | oprateInfo: "", |
| | | downloadlogVisible: false, |
| | | downloadReasonVisible: false, |
| | | popVisible: false, |
| | | popPosition: { |
| | | x: 0, |
| | |
| | | webUrl: getWebUrl(), |
| | | record: {}, |
| | | currentVersion: -1, |
| | | // 0120的锁定激活只能操作版本列表中第一个(最大版本号) |
| | | // 最新的版本的id |
| | | maxVersionid: -1, |
| | | spinning: false, |
| | | loading: false, |
| | | total: 0, |
| | |
| | | { |
| | | title: "生产商", |
| | | dataIndex: "producer", |
| | | key: "producer", |
| | | align: "center", |
| | | width: 80, |
| | | }, |
| | | { |
| | | title: "厂家规格", |
| | | dataIndex: "producerSpecification", |
| | | align: "center", |
| | | width: 80, |
| | | }, |
| | |
| | | customCell: this.customCell, |
| | | }, |
| | | { |
| | | title: "发布说明", |
| | | dataIndex: "releaseNotes", |
| | | align: "center", |
| | | width: 340, |
| | | customCell: this.customCell, |
| | | }, |
| | | { |
| | | title: "操作", |
| | | dataIndex: "operation", |
| | | align: "center", |
| | |
| | | FilesTable, |
| | | DiffList, |
| | | Pop, |
| | | DownloadReason, |
| | | DownloadLogs, |
| | | SopList, |
| | | }, |
| | | computed: { |
| | | ...mapGetters("setting", ["affixed"]), |
| | | ...mapGetters("account", ["permits"]), |
| | | ...mapGetters("account", ["permits", "user"]), |
| | | canDownloadSoftware() { |
| | | return checkPermit(PERMITS.downloadSoftware, this.permits); |
| | | }, |
| | | canDownloadBom() { |
| | | return checkPermit(PERMITS.downloadBom, this.permits); |
| | | }, |
| | | canDownloadOriginBom() { |
| | | return checkPermit(PERMITS.downloadOriginBom, this.permits); |
| | | }, |
| | | canDownloadDoc() { |
| | | return checkPermit(PERMITS.downloadDoc, this.permits); |
| | |
| | | }, |
| | | canLockBom() { |
| | | return checkPermit(PERMITS.lockBom, this.permits); |
| | | }, |
| | | is0120() { |
| | | return /^0120/.test(this.parentCode); |
| | | }, |
| | | isTester() { |
| | | return this.tester.some((v) => v == this.user.name); |
| | | }, |
| | | // 有状态为-1的版本在 |
| | | hasLock() { |
| | | return this.versionList.some((v) => v.enabled == -1); |
| | | }, |
| | | fileTreeViewRes() { |
| | | let resList = this.fileTreeView.filter((v) => { |
| | | let fileName = v.split("\\").pop(); |
| | | return fileName.indexOf(this.searchValue) > -1; |
| | | }); |
| | | |
| | | let { |
| | | children: [ |
| | | { |
| | | children: [{ children: list }], |
| | | }, |
| | | ], |
| | | } = this.format(resList, false); |
| | | return list; |
| | | }, |
| | | }, |
| | | watch: { |
| | |
| | | }, |
| | | }, |
| | | methods: { |
| | | viewSopFile() { |
| | | this.showSop = true; |
| | | }, |
| | | getRoleUser() { |
| | | getRoleUser(1) |
| | | .then((res) => { |
| | | let { code, data, data2 } = res.data; |
| | | let list = []; |
| | | if (code && data) { |
| | | // console.log(data); |
| | | list = data2.map((v) => v.name); |
| | | } |
| | | this.tester = list; |
| | | }) |
| | | .catch((err) => { |
| | | console.log(err); |
| | | }); |
| | | }, |
| | | downloadLogs() { |
| | | let { customCode, parentCode } = this; |
| | | this.oprateInfo = parentCode + "_" + customCode; |
| | | this.downloadlogVisible = true; |
| | | }, |
| | | customCell(record) { |
| | | return { |
| | | on: { |
| | |
| | | // res = res.data; |
| | | const { code, data, data2 } = res; |
| | | let list = []; |
| | | let maxVersionid = -1; |
| | | if (code && data) { |
| | | list = data2; |
| | | list.forEach((v) => { |
| | | maxVersionid = v.id > maxVersionid ? v.id : maxVersionid; |
| | | }); |
| | | } |
| | | this.maxVersionid = maxVersionid; |
| | | this.versionList = list; |
| | | } |
| | | }, |
| | |
| | | }, |
| | | getOriginalZip() { |
| | | const { |
| | | currentVersion: { parentModel, customCode, version }, |
| | | currentVersion: { parentCode, parentModel, customCode, version }, |
| | | } = this; |
| | | this.originalZipUrl = ""; |
| | | getOriginalZip(parentModel, customCode, version).then((res) => { |
| | | const { code, data, data2 } = res.data; |
| | | if (code && data) { |
| | | this.originalZipUrl = data2; |
| | | getOriginalZip(parentCode, parentModel, customCode, version).then( |
| | | (res) => { |
| | | const { code, data, data2 } = res.data; |
| | | if (code && data) { |
| | | this.originalZipUrl = data2; |
| | | } |
| | | } |
| | | }); |
| | | ); |
| | | }, |
| | | getInfo(force) { |
| | | const { |
| | |
| | | let otherDoc = []; |
| | | let attachLocks = []; |
| | | this.spinning = false; |
| | | let oprateInfo; |
| | | if (code && data) { |
| | | list = data2.map((v) => { |
| | | if (v.materials && v.materials.length) { |
| | | v.children = v.materials; |
| | | v.children = v.materials.map((vv) => { |
| | | vv.p_subCode = v.subCode; |
| | | return vv; |
| | | }); |
| | | } |
| | | return v; |
| | | }); |
| | | softwareList = data3; |
| | | otherDoc = data4.files || []; |
| | | attachLocks = data4.attachLocks || []; |
| | | let { parentCode, customCode } = data2[0]; |
| | | oprateInfo = parentCode + "_" + customCode; |
| | | } |
| | | this.dataSource = list; |
| | | this.softwareList = softwareList; |
| | | this.otherDoc = otherDoc; |
| | | this.info = { attachLocks, productId: id }; |
| | | this.info = { attachLocks, productId: id, oprateInfo }; |
| | | if (-1 == this.update) { |
| | | this.update = Math.random(); |
| | | } |
| | |
| | | console.log(error); |
| | | }); |
| | | }, |
| | | downloadLog(record) { |
| | | const { parentCode, subModel, dwgUrl, fileUrl: softwareUrl } = record; |
| | | const url = softwareUrl |
| | | ? this.webUrl + softwareUrl |
| | | : this.webUrl + dwgUrl; |
| | | let link = document.createElement("a"); |
| | | link.style.display = "none"; |
| | | link.href = url; |
| | | // link.download = fileName; |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | document.body.removeChild(link); |
| | | downloadLog(parentCode, subModel); |
| | | showReason(action, record) { |
| | | const { dwgUrl, fileUrl: softwareUrl } = record; |
| | | const url = softwareUrl ? softwareUrl : dwgUrl; |
| | | this.downloadUrl = url; |
| | | this.currentAction = action; |
| | | this.downloadReasonVisible = true; |
| | | }, |
| | | downloadLog(reason) { |
| | | let url = this.downloadUrl; |
| | | let reg = /(.*\\+)*(.*)$/; |
| | | let fileName = url.match(reg)[2]; |
| | | |
| | | downLoadFileByFilePath( |
| | | url, |
| | | reason, |
| | | this.info.oprateInfo, |
| | | this.currentVersion.versionTime, |
| | | 12 |
| | | ).then((res) => { |
| | | let { data, status } = res; |
| | | if (200 == status && data) { |
| | | let url = window.URL.createObjectURL(data); |
| | | let link = document.createElement("a"); |
| | | link.style.display = "none"; |
| | | link.href = url; |
| | | link.download = fileName; |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | document.body.removeChild(link); |
| | | window.URL.revokeObjectURL(url); |
| | | } else { |
| | | this.$message.error("下载失败"); |
| | | } |
| | | }); |
| | | }, |
| | | // action 检查后要执行的动作 |
| | | checkLock(action) { |
| | |
| | | } else { |
| | | // 没有锁定 |
| | | // this.zipDownload(); |
| | | this[action](); |
| | | // this[action](); |
| | | this.showReasonDialog(); |
| | | } |
| | | } else { |
| | | this.$message.error("查询锁定清单出错"); |
| | |
| | | lockListOk() { |
| | | this.lockListVisible = false; |
| | | // this.zipDownload(); |
| | | this[this.currentAction](); |
| | | // this[this.currentAction](); |
| | | this.downloadReasonVisible = true; |
| | | }, |
| | | OriginalZipDownload() { |
| | | let loading = this.$layer.loading(); |
| | | let link = document.createElement("a"); |
| | | link.style.display = "none"; |
| | | let url = this.webUrl + this.originalZipUrl; |
| | | link.href = url; |
| | | link.download = url; |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | this.$layer.close(loading); |
| | | document.body.removeChild(link); |
| | | showReasonDialog() { |
| | | // this.currentAction = action; |
| | | this.downloadReasonVisible = true; |
| | | }, |
| | | zipDownload() { |
| | | downloadReasonOk(reason) { |
| | | this[this.currentAction](reason); |
| | | }, |
| | | OriginalZipDownload(reason) { |
| | | // let loading = this.$layer.loading(); |
| | | // let link = document.createElement("a"); |
| | | // link.style.display = "none"; |
| | | // let url = this.webUrl + this.originalZipUrl; |
| | | // link.href = url; |
| | | // link.download = url; |
| | | // document.body.appendChild(link); |
| | | // link.click(); |
| | | // this.$layer.close(loading); |
| | | // document.body.removeChild(link); |
| | | let url = this.originalZipUrl; |
| | | let reg = /(.*\\+)*(.*)$/; |
| | | let fileName = url.match(reg)[2]; |
| | | downLoadFileByFilePath( |
| | | url, |
| | | reason, |
| | | this.info.oprateInfo, |
| | | this.currentVersion.versionTime, |
| | | 12 |
| | | ).then((res) => { |
| | | let { data, status } = res; |
| | | if (200 == status && data) { |
| | | let url = window.URL.createObjectURL(data); |
| | | let link = document.createElement("a"); |
| | | link.style.display = "none"; |
| | | link.href = url; |
| | | link.download = fileName; |
| | | document.body.appendChild(link); |
| | | link.click(); |
| | | document.body.removeChild(link); |
| | | window.URL.revokeObjectURL(url); |
| | | } else { |
| | | this.$message.error("下载失败"); |
| | | } |
| | | }); |
| | | }, |
| | | zipDownload(reason) { |
| | | // const { parentCode, currentVersion } = this; |
| | | const { |
| | | currentVersion: { id, version }, |
| | | } = this; |
| | | let loading = this.$layer.loading(); |
| | | zipDownload(id, version).then((res) => { |
| | | zipDownload(id, version, reason, this.info.oprateInfo).then((res) => { |
| | | // console.log(res, "==========="); |
| | | let { headers, data, status } = res; |
| | | if (200 == status && data) { |
| | | let url = window.URL.createObjectURL(data); |
| | | const matchRes = /filename=(.*)/.exec(headers["content-disposition"]); |
| | | const fileName = matchRes ? matchRes[1].trim() : "未知文件名.zip"; |
| | | const fileName = matchRes |
| | | ? decodeURI(matchRes[1].trim()) |
| | | : "未知文件名.zip"; |
| | | let link = document.createElement("a"); |
| | | link.style.display = "none"; |
| | | link.href = url; |
| | |
| | | this.softwareDownloadShow = false; |
| | | }, |
| | | diff(data) { |
| | | console.log("比较两个版本", data); |
| | | // console.log("比较两个版本", data); |
| | | let params = data.map((v) => v * 1).sort((a, b) => a - b); |
| | | compare(...params).then((res) => { |
| | | const { code, data, data2, data3 } = res.data; |
| | |
| | | this.diffShow = false; |
| | | }, |
| | | changeStatus() { |
| | | if (this.hasLock && this.currentVersion.enabled != -1) { |
| | | this.$message.error("存在新上传的版本未复核, 不能操作其他版本"); |
| | | return false; |
| | | } |
| | | this.reasonVisible = true; |
| | | }, |
| | | reasonCancel() { |
| | |
| | | currentVersion: { |
| | | customCode, |
| | | parentCode, |
| | | enabled, |
| | | enabled: lockFlagNow, |
| | | version, |
| | | versionTime, |
| | | }, |
| | | reason, |
| | | } = this; |
| | | enabled = !enabled * 1; |
| | | let enabled = lockFlagNow != 1 ? 1 : 0; |
| | | setpHistoryEnable({ |
| | | customCode, |
| | | parentCode, |
| | |
| | | if (code && data) { |
| | | this.$message.success("操作成功"); |
| | | this.currentVersion.enabled = enabled; |
| | | // 如果是测试人员解锁确认 则自动发送邮件 |
| | | if (lockFlagNow == -1 && this.isTester) { |
| | | this.sendEmail(); |
| | | } |
| | | this.reasonVisible = false; |
| | | } else { |
| | | this.$message.error("操作失败"); |
| | | } |
| | | }); |
| | | }, |
| | | sendEmail() { |
| | | let { title, content } = this.handleEmailShow(this.currentVersion, true); |
| | | let params = { mailList: this.mailList, title, content }; |
| | | sendMail(params); |
| | | }, |
| | | searchAllUserList() { |
| | | getUserList() |
| | | .then((res) => { |
| | | let rs = res.data; |
| | | if (rs.code && rs.data) { |
| | | this.userListAll = rs.data2; |
| | | this.searchDefaultMailUser(); |
| | | } |
| | | }) |
| | | .catch((error) => { |
| | | console.log(error); |
| | | }); |
| | | }, |
| | | searchDefaultMailUser() { |
| | | // type为3 |
| | | let type = 3; |
| | | searchDefaultMailUser(type).then((res) => { |
| | | let rs = res.data; |
| | | let data = []; |
| | | if (rs.code === 1) { |
| | | data = rs.data.map((item) => { |
| | | return item.user; |
| | | }); |
| | | } |
| | | this.mailList = this.userListAll |
| | | .filter((o) => data.includes(o.name) && o.mail) |
| | | .map((item) => { |
| | | return item.mail; |
| | | }); |
| | | }); |
| | | }, |
| | | handleEmailShow(record, get) { |
| | | let title = |
| | | "[产品发布记录]" + record.parentModel + " 版本:" + record.versionTime; |
| | | let content = []; |
| | | content.push("物料编码: " + record.parentCode); |
| | | content.push("物料名称: " + record.parentName); |
| | | content.push("规格型号: " + record.parentModel); |
| | | content.push("标准机型: " + (!record.customCode ? "是" : "否")); |
| | | content.push("定制单号: " + (record.customCode || "无")); |
| | | content.push("版本时间: " + record.versionTime); |
| | | if (get) { |
| | | return { |
| | | title, |
| | | content: content.join("\n"), |
| | | }; |
| | | } |
| | | }, |
| | | showOtherDoc() { |
| | | this.getInfo(1); |
| | |
| | | toggleSide() { |
| | | this.sideVisible = !this.sideVisible; |
| | | }, |
| | | rowClassFn(record) { |
| | | let classList = []; |
| | | if (record.children && record.children.length) { |
| | | classList.push("is-replace"); |
| | | } |
| | | // 0120是半成品 |
| | | if (/^0120/.test(record.subCode)) { |
| | | classList.push("is-0120"); |
| | | } |
| | | // 08 09 开头的半成品 |
| | | if (/^08|^09/.test(record.subCode)) { |
| | | classList.push("is-08_09"); |
| | | } |
| | | return classList; |
| | | }, |
| | | toDetails0120(record) { |
| | | const { |
| | | subCode: parentCode, |
| | | subModel: parentModel, |
| | | subName: parentName, |
| | | } = record; |
| | | this.$router.push({ |
| | | path: "/resource/product-details-0120", |
| | | query: { parentCode, customCode: "", parentModel, parentName }, |
| | | }); |
| | | }, |
| | | toDetails_type(record, type) { |
| | | const { |
| | | subCode: parentCode, |
| | | subModel: parentModel, |
| | | subName: parentName, |
| | | } = record; |
| | | checkExist(parentCode, "") |
| | | .then((res) => { |
| | | let { code, data } = res.data; |
| | | if (code && data) { |
| | | this.$router.push({ |
| | | path: "/resource/product-details-" + type, |
| | | query: { parentCode, customCode: "", parentModel, parentName }, |
| | | }); |
| | | // console.log(data); |
| | | } else { |
| | | this.$message.error("产品未上传"); |
| | | } |
| | | }) |
| | | .catch((err) => { |
| | | console.log(err); |
| | | }); |
| | | }, |
| | | getParent(obj, arr, i) { |
| | | let len = arr.length - 1; |
| | | if (i > len) { |
| | | return false; |
| | | } |
| | | // if (i == 0) { |
| | | // return obj; |
| | | // } |
| | | // if (i == 1) { |
| | | // return obj[arr[0]]; |
| | | // } |
| | | let res = obj; |
| | | let tmp = {}; |
| | | for (let m = 1; m <= i; m++) { |
| | | // tmp[arr[m]] = {}; |
| | | // tmp = tmp[arr[m]]; |
| | | tmp = arr[m - 1]; |
| | | res = res[tmp]; |
| | | } |
| | | |
| | | return res; |
| | | }, |
| | | format(list, needTime = true) { |
| | | let counter = this.counter(); |
| | | let obj = { |
| | | counter, |
| | | key: "root", |
| | | children: [], |
| | | }; |
| | | // let root = { |
| | | // counter, |
| | | // key: "root", |
| | | // children: [], |
| | | // }; |
| | | list.forEach((v) => { |
| | | let url = needTime ? v.fileName : v; |
| | | let fileTime = v.fileTime; |
| | | let splitStr = needTime ? "/" : "\\"; |
| | | let arr = url.split(splitStr); |
| | | let fileName = arr.pop(); |
| | | let files = fileName.split("."); |
| | | let type = files.length ? files[files.length - 1].toLowerCase() : ""; |
| | | |
| | | let tmp = obj; |
| | | |
| | | for (let i = 0, len = arr.length; i < len; i++) { |
| | | let parent = this.getParent(obj, arr, i); |
| | | if (!tmp[arr[i]]) { |
| | | tmp[arr[i]] = { |
| | | parent, |
| | | title: arr[i], |
| | | key: parent.key + "-" + parent.counter(), |
| | | children: [], |
| | | scopedSlots: { title: "custom" }, |
| | | counter: this.counter(), |
| | | }; |
| | | // tmp[arr[i]].parent.children.push(tmp[arr[i]]); |
| | | parent.children.push(tmp[arr[i]]); |
| | | } |
| | | tmp = tmp[arr[i]]; |
| | | } |
| | | // console.log(tmp.children, 'children') |
| | | tmp.children.push({ |
| | | url, |
| | | type, |
| | | fileName, |
| | | fileTime, |
| | | key: tmp.key + "-" + tmp.counter(), |
| | | title: needTime ? fileName + " " + fileTime : fileName, |
| | | scopedSlots: { title: "custom" }, |
| | | isLeaf: true, |
| | | }); |
| | | // console.log(obj, '......') |
| | | // for (let i = 0, len = arr.length; i < len; i++) { |
| | | // // 判断有没有父级 i为0没有 i为大于1就有 |
| | | // let parent = i > 0 ? tmp[arr[i - 1]] : root; |
| | | // if (!obj[item]) { |
| | | // obj[item] = { |
| | | // title: item, |
| | | // key: parent.key + "-" + parent.counter(), |
| | | // children: [], |
| | | // counter: this.counter(), |
| | | // }; |
| | | // } |
| | | // } |
| | | }); |
| | | return obj; |
| | | }, |
| | | counter() { |
| | | let count = 0; |
| | | return () => { |
| | | return count++; |
| | | }; |
| | | }, |
| | | // 查看压缩包内文件目录结构 |
| | | viewRar() { |
| | | let loading = this.$layer.loading(); |
| | | // console.log(this.originalZipUrl); |
| | | getzipAndRarInfo(this.originalZipUrl) |
| | | .then((res) => { |
| | | let { code, data, data2 } = res.data; |
| | | let list = { children: [] }; |
| | | if (code && data) { |
| | | console.log(data2); |
| | | list = this.format(data2); |
| | | } |
| | | this.$layer.close(loading); |
| | | this.fileTree = list.children; |
| | | this.fileTreeVisible = true; |
| | | // { title: 'Tree Node', key: '2', isLeaf: true }, |
| | | console.log(list, "===list"); |
| | | }) |
| | | .catch((err) => { |
| | | this.$layer.close(loading); |
| | | console.log(err); |
| | | }); |
| | | }, |
| | | // 解压压缩包到服务器 然后返回内部文件的结构和路径 路径可用来预览 |
| | | preview() { |
| | | this.searchValue = ''; |
| | | let loading = this.$layer.loading(); |
| | | decompress(this.originalZipUrl) |
| | | .then((res) => { |
| | | let { code, data, data2, msg } = res.data; |
| | | let list = []; |
| | | if (code && data) { |
| | | // console.log(data); |
| | | this.$message.success("解析成功"); |
| | | // let { |
| | | // children: [ |
| | | // { |
| | | // children: [{ children: list1 }], |
| | | // }, |
| | | // ], |
| | | // } = this.format(data2, false); |
| | | // list = list1; |
| | | list = data2; |
| | | } else { |
| | | this.$message.error(msg); |
| | | } |
| | | this.$layer.close(loading); |
| | | |
| | | this.fileTreeView = list; |
| | | |
| | | // this.fileTreeView = list.children[0]["children"][0]["children"]; |
| | | this.fileTreeViewVisible = true; |
| | | // console.log(list, "===list111"); |
| | | }) |
| | | .catch((err) => { |
| | | console.log(err); |
| | | this.$layer.close(loading); |
| | | }); |
| | | }, |
| | | viewAble(type) { |
| | | return ["bmp", "jpg", "jpeg", "png", "pdf", "doc", "docx", "dwg"].some( |
| | | (v) => v == type |
| | | ); |
| | | }, |
| | | view(obj) { |
| | | switch (obj.type) { |
| | | // 图片 |
| | | case "bmp": |
| | | case "jpg": |
| | | case "jpeg": |
| | | case "png": |
| | | this.imgUrl = this.webUrl + obj.url; |
| | | this.viewerImg(); |
| | | // this.previewVisible = true; |
| | | break; |
| | | case "pdf": |
| | | window.open(this.webUrl + obj.url); |
| | | break; |
| | | case "doc": |
| | | case "docx": |
| | | case "dwg": |
| | | this.dwgReview(obj.url); |
| | | break; |
| | | // default: |
| | | // this.$message.warn("该类型文件暂不支持预览"); |
| | | // break; |
| | | } |
| | | }, |
| | | handleCancel() { |
| | | this.previewVisible = false; |
| | | }, |
| | | viewerImg() { |
| | | this.$viewerApi({ |
| | | images: [this.imgUrl], |
| | | options: { |
| | | initialViewIndex: 0, |
| | | }, |
| | | }); |
| | | }, |
| | | searchChanged() { |
| | | this.treeReset = false; |
| | | this.$nextTick(() => { |
| | | this.treeReset = true; |
| | | }); |
| | | }, |
| | | }, |
| | | mounted() { |
| | | this.searchAllUserList(); |
| | | this.getRoleUser(); |
| | | this.sendMessage(); |
| | | // this.searchData(); |
| | | window.addEventListener("resize", this.resize); |
| | |
| | | /deep/.ant-table-row-level-1.ant-table-row-level-1:hover > td { |
| | | background: #ffbcc9; |
| | | } |
| | | /deep/.is-08_09 > td, |
| | | /deep/.is-0120 > td { |
| | | background: #ffae00; |
| | | } |
| | | /deep/.is-08_09.is-08_09.ant-table-row-hover > td, |
| | | /deep/.is-08_09.is-08_09:hover > td, |
| | | /deep/.is-0120.is-0120.ant-table-row-hover > td, |
| | | /deep/.is-0120.is-0120:hover > td { |
| | | background: #f8c34f; |
| | | } |
| | | } |
| | | /deep/.ant-descriptions-row > th, |
| | | /deep/.ant-descriptions-row > td { |
| | |
| | | /deep/.ant-descriptions-row .ant-descriptions-item:first-child { |
| | | width: 180px; |
| | | } |
| | | .file-tree-view /deep/ li { |
| | | // display: flex; |
| | | // flex-direction: row; |
| | | .ant-tree-switcher { |
| | | float: left; |
| | | } |
| | | .ant-tree-node-content-wrapper { |
| | | display: block; |
| | | cursor: auto; |
| | | .ant-tree-title { |
| | | display: block; |
| | | } |
| | | } |
| | | .ant-tree-child-tree { |
| | | flex-basis: 100%; |
| | | } |
| | | .icon-wrap { |
| | | cursor: pointer; |
| | | font-size: 22px; |
| | | } |
| | | } |
| | | .flex-r { |
| | | display: flex; |
| | | flex-direction: row; |
| | | &.space-between { |
| | | justify-content: space-between; |
| | | } |
| | | } |
| | | </style> |