From 717dc9fa42e09e8befe970496877e7178e59ca76 Mon Sep 17 00:00:00 2001 From: gaoluyang <2820782392@qq.com> Date: 星期一, 24 二月 2025 13:06:37 +0800 Subject: [PATCH] 检验任务复核 --- src/views/business/inspectionReview/index.vue | 407 +++++++++++++++++++++++++++++++++++++ src/components/Onlyoffice/onlyoffice.vue | 206 ++++++++++++++++++ src/assets/images/no-full.svg | 1 3 files changed, 614 insertions(+), 0 deletions(-) diff --git a/src/assets/images/no-full.svg b/src/assets/images/no-full.svg new file mode 100644 index 0000000..e78c651 --- /dev/null +++ b/src/assets/images/no-full.svg @@ -0,0 +1 @@ +<?xml version="1.0" standalone="no"?><!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd"><svg t="1712111454775" class="icon" viewBox="0 0 1024 1024" version="1.1" xmlns="http://www.w3.org/2000/svg" p-id="5950" width="18" height="18" xmlns:xlink="http://www.w3.org/1999/xlink"><path d="M354.133333 682.666667H256v-42.666667h170.666667v170.666667H384v-98.133334L243.2 853.333333l-29.866667-29.866666L354.133333 682.666667z m358.4 0l140.8 140.8-29.866666 29.866666-140.8-140.8V810.666667h-42.666667v-170.666667h170.666667v42.666667h-98.133334zM354.133333 384L213.333333 243.2l29.866667-29.866667L384 354.133333V256h42.666667v170.666667H256V384h98.133333z m358.4 0H810.666667v42.666667h-170.666667V256h42.666667v98.133333L823.466667 213.333333l29.866666 29.866667L712.533333 384z" fill="#606266" p-id="5951"></path></svg> \ No newline at end of file diff --git a/src/components/Onlyoffice/onlyoffice.vue b/src/components/Onlyoffice/onlyoffice.vue new file mode 100644 index 0000000..1371068 --- /dev/null +++ b/src/components/Onlyoffice/onlyoffice.vue @@ -0,0 +1,206 @@ +<!--onlyoffice 缂栬緫鍣�--> +<template> + <div id="vabOnlyOffice"></div> +</template> + +<script> +export default { + name: "VabOnlyOffice", + props: ['options'], + data() { + return { + doctype: "", + docEditor: null, + //鍙傝�僾abOnlyOffice缁勪欢鍙傛暟閰嶇疆 + option: { + url: "", + isEdit: false, + fileType: "", + title: "", + lang: "zh-CN", + isPrint: true, + user: {}, + editUrl: "" + } + }; + }, + created() { + if(this.options){ + const option = this.options + this.option.url = option.url + this.option.isEdit = option.isEdit === "true" ? true : false + this.option.fileType = option.fileType + this.option.title = option.title + this.option.lang = option.lang + this.option.isPrint = option.isPrint + this.option.user.id = option.user_id + this.option.user.name = option.user_name + this.option.editUrl = option.editUrl + }else{ + const option = this.$route.query + this.option.url = option.url + this.option.isEdit = option.isEdit === "true" ? true : false + this.option.fileType = option.fileType + this.option.title = option.title + this.option.lang = option.lang + this.option.isPrint = option.isPrint + this.option.user.id = option.user_id + this.option.user.name = option.user_name + this.option.editUrl = option.editUrl + } + }, + beforeDestroy() { + if (this.docEditor !== null) { + this.docEditor.destroyEditor(); + this.docEditor = null; + } + }, + watch: { + option: { + handler: function(n) { + this.setEditor(n); + this.doctype = this.getFileType(n.fileType); + }, + deep: true + } + }, + mounted() { + if (this.option.url) { + this.setEditor(this.option); + } + }, + methods: { + async setEditor(option) { + if (this.docEditor !== null) { + this.docEditor.destroyEditor(); + this.docEditor = null; + } + this.doctype = this.getFileType(option.fileType); + let config = { + document: { + //鍚庣紑 + fileType: option.fileType, + key: option.key || "", + title: option.title, + permissions: { + edit: option.isEdit, //鏄惁鍙互缂栬緫: 鍙兘鏌ョ湅锛屼紶false + print: option.isPrint, + download: false + // "fillForms": true,//鏄惁鍙互濉啓琛ㄦ牸锛屽鏋滃皢mode鍙傛暟璁剧疆涓篹dit锛屽垯濉啓琛ㄥ崟浠呭鏂囨。缂栬緫鍣ㄥ彲鐢ㄣ�� 榛樿鍊间笌edit鎴杛eview鍙傛暟鐨勫�间竴鑷淬�� + // "review": true //璺熻釜鍙樺寲 + }, + url: option.url + }, + documentType: this.doctype, + editorConfig: { + callbackUrl: option.editUrl, //"缂栬緫word鍚庝繚瀛樻椂鍥炶皟鐨勫湴鍧�锛岃繖涓猘pi闇�瑕佽嚜宸卞啓浜嗭紝灏嗙紪杈戝悗鐨勬枃浠堕�氳繃杩欎釜api淇濆瓨鍒拌嚜宸辨兂瑕佺殑浣嶇疆 + lang: option.lang, //璇█璁剧疆 + //瀹氬埗 + customization: { + autosave: true, //鏄惁鑷姩淇濆瓨 + chat: true, + comments: false, + help: false, + "hideRightMenu": false,//瀹氫箟鍦ㄧ涓�娆″姞杞芥椂鏄樉绀鸿繕鏄殣钘忓彸渚ц彍鍗曘�� 榛樿鍊间负false + //鏄惁鏄剧ず鎻掍欢 + plugins: false + }, + user: { + id: option.user.id, + name: option.user.name + }, + mode: option.model ? option.model : "edit" + }, + width: "100%", + height: "100%", + token: option.token || "" + }; + + // eslint-disable-next-line no-undef,no-unused-vars + this.docEditor = new DocsAPI.DocEditor("vabOnlyOffice", config); + }, + getFileType(fileType) { + let docType = ""; + let fileTypesDoc = [ + "doc", + "docm", + "docx", + "dot", + "dotm", + "dotx", + "epub", + "fodt", + "htm", + "html", + "mht", + "odt", + "ott", + "pdf", + "rtf", + "txt", + "djvu", + "xps" + ]; + let fileTypesCsv = [ + "csv", + "fods", + "ods", + "ots", + "xls", + "xlsm", + "xlsx", + "xlt", + "xltm", + "xltx" + ]; + let fileTypesPPt = [ + "fodp", + "odp", + "otp", + "pot", + "potm", + "potx", + "pps", + "ppsm", + "ppsx", + "ppt", + "pptm", + "pptx" + ]; + if (fileTypesDoc.includes(fileType)) { + docType = "text"; + } + if (fileTypesCsv.includes(fileType)) { + docType = "spreadsheet"; + } + if (fileTypesPPt.includes(fileType)) { + docType = "presentation"; + } + return docType; + } + } +}; +</script> + +<style> +html, +body { + height: 100%; +} +#app { + font-family: Avenir, Helvetica, Arial, sans-serif; + -webkit-font-smoothing: antialiased; + -moz-osx-font-smoothing: grayscale; + text-align: center; + color: #2c3e50; + height: 100%; +} +.qualityManual-container { + padding: 0 !important; + height: 100%; +} +.qualityManual-container-office { + width: 100%; + height: calc(100% - 55px); +} +</style> diff --git a/src/views/business/inspectionReview/index.vue b/src/views/business/inspectionReview/index.vue new file mode 100644 index 0000000..3756557 --- /dev/null +++ b/src/views/business/inspectionReview/index.vue @@ -0,0 +1,407 @@ +<template> + <div class="app-container"> + <div> + <el-form :model="entity" ref="entity" size="small" :inline="true"> + <el-form-item label="濮旀墭缂栧彿" prop="entrustCode"> + <el-input size="small" placeholder="璇疯緭鍏�" clearable + v-model="entity.entrustCode" + @keyup.enter.native="refreshTable()"></el-input> + </el-form-item> + <el-form-item label="涓嬪崟绫诲埆" prop="entrustCode"> + <el-select size="small" v-model="entity.typeSource" clearable style="width: 100%;" @change="refreshTable()"> + <el-option v-for="(a, i) in typeSourceList" :key="i" :label="a.label" :value="a.value"></el-option> + </el-select> + </el-form-item> + <el-form-item> + <el-button icon="el-icon-refresh" size="mini" @click="refresh">閲� 缃�</el-button> + <el-button type="primary" icon="el-icon-search" size="mini" @click="refreshTable">鏌� 璇�</el-button> + </el-form-item> + </el-form> + <div class="page_total"> + <span>鎬昏浠诲姟鏁伴噺:</span> + <span>{{page.total}}</span> + </div> + </div> + <div> + <lims-table :tableData="tableData" :column="column" :page="page" :tableLoading="tableLoading" + :rowClassName="rowClassName" :height="'calc(100vh - 250px)'" @pagination="pagination" + key="tableData0"></lims-table> + </div> +<!-- <div style="width: 100%;height: 100%;" v-if="activeFace >0 && isCopper == null">--> +<!-- <Add :active="activeFace" :currentId="currentId"/>--> +<!-- </div>--> +<!-- <div style="width: 100%;height: 100%;" v-if="activeFace >0 && isCopper == 0">--> +<!-- <CustomsInspection :active="activeFace" :customsInspection="customsInspection" :currentId="currentId"/>--> +<!-- </div>--> +<!-- <div style="width: 100%;height: 100%;" v-if="activeFace >0 && isCopper == 1">--> +<!-- <CopperOrder :active="activeFace" :currentId="currentId"></CopperOrder>--> +<!-- </div>--> +<!-- <Inspection v-if="state>0" @goback="goback" :orderId="orderId" :sonLaboratory="componentData.entity.sonLaboratory" :typeSource="typeSource" :state="state"/>--> +<!-- <!–浜т笟閾句俊鎭煡鐪�–>--> +<!-- <ShowInfo v-if="showInfoDialog" :showInfoDialog="showInfoDialog" ref="showInfoDialog"></ShowInfo>--> + <!--鎶ュ憡鏌ョ湅--> + <el-dialog title="鎶ュ憡鏌ョ湅" :visible.sync="issuedVisible" width="80vw" :modal-append-to-body="false" + :fullscreen="fullscreen"> + <div class="full-screen"> + <i class="el-icon-full-screen" style="cursor: pointer;font-size: 18px" @click="fullscreen=true;" v-if="!fullscreen"></i> + <img src="@/assets/images/no-full.svg" alt="" v-else style="cursor: pointer;" @click="fullscreen=false;" > + </div> + <div style="height: 80vh;" v-if="issuedVisible"> + <onlyoffice ref="onlyoffice" :options="option" style="width: 100%;height: 100%;" /> + </div> + </el-dialog> + </div> +</template> + +<script> +import { getYearAndMonthAndDays } from "@/utils/date"; +// import ShowInfo from "../do/b1-material-ins-order/showInfo.vue"; +import onlyoffice from "@/components/Onlyoffice/onlyoffice.vue"; +import limsTable from "@/components/Table/lims-table.vue"; +import {selectInsOrderPlanList, selectUserCondition} from "@/api/business/inspectionTask"; +import {mapGetters} from "vuex"; + +export default { + components: { + onlyoffice, + limsTable, + // ShowInfo, + }, + dicts: ["urgency_level", "inspection_task_state"], + computed: { + ...mapGetters(["nickName", "userId"]), + }, + data() { + return { + alone: false, + tabList: [], + active: 1, + tabIndex: 0, + entity: { + sonLaboratory: null, + insState: '3', + userId: 0, + typeSource: null, + isCheck: 1 + }, + tableData: [], + column: [ + { + label: "濮旀墭缂栧彿", + prop: "entrustCode", + width: "160px", + dataType: "link", + linkMethod: "selectAllByOne", + }, + { label: "鏍峰搧鍚嶇О", prop: "sample", width: "160px" }, + { + label: "涓嬪崟绫诲埆", + prop: "typeSource", + width: "100px", + dataType: "tag", + formatData: (params) => { + if (params == 0) { + return "鎴愬搧涓嬪崟"; + } else { + return "鍘熸潗鏂欎笅鍗�"; + } + }, + }, + { label: "鏍峰搧鍨嬪彿", prop: "sampleModel", width: "120px" }, + { + label: "绱ф�ョ▼搴�", + prop: "type", + dataType: "tag", + formatData: (params) => { + return this.urgencyLevel.find((m) => m.value == params).label; + }, + }, + { + label: "妫�楠岀被鍨�", + prop: "orderType", + width: "100px", + dataType: "tag", + formatData: (params) => { + return this.orderTypeList.find((m) => m.value == params).label; + }, + formatType: (params) => { + return this.orderTypeList.find((m) => m.value == params).type; + }, + }, + { + label: "鐘舵��", + prop: "insState", + dataType: "tag", + formatData: (params) => { + return this.inspectionTaskState.find((m) => m.value == params) + .label; + }, + formatType: (params) => { + return this.inspectionTaskState.find((m) => m.value == params).type; + }, + }, + { label: "妫�楠屼汉", prop: "userName" }, + { label: "澶嶆牳浜�", prop: "checkName" }, + { label: "绾﹀畾鏃堕棿", prop: "appointed" }, + { label: "涓嬪彂鏃堕棿", prop: "sendTime", width: "140px" }, + { label: "妫�楠屽紑濮嬫椂闂�", prop: "insTime", width: "140px" }, + { label: "鐞嗙敱", prop: "verifyTell", width: "140px" }, + { + dataType: "action", + fixed: "right", + label: "鎿嶄綔", + operation: [ + { + name: "澶嶆牳", + type: "text", + clickFun: (row) => { + this.handleReview(row); + }, + disabled: (row) => { + return row.userName == null || row.userName && !row.userName.includes(this.nickName) + } + }, + { + name: "涓嬭浇鎶ュ憡", + type: "text", + clickFun: (row) => { + this.download(row); + }, + }, + { + name: "涓婁紶", + type: "text", + clickFun: (row) => { + this.handleUpload(row); + }, + }, + { + name: "杩樺師", + type: "text", + clickFun: (row) => { + this.handleRestore(row); + }, + }, + { + name: "鏌ョ湅鎶ュ憡", + type: "text", + clickFun: (row) => { + this.handleIssued(row); + } + }, + // { + // name: "浜т笟閾�", + // type: "text", + // clickFun: (row) => { + // this.openInfoDialog(row); + // }, + // disabled: (row) => { + // return row.typeSource !== 1 + // }, + // } + ], + }, + ], + page: { + total: 0, + size: 10, + current: 0, + }, + tableLoading: false, + upIndex: 0, + planTotal: 0, + insStateList: [], + state:0,//0:鍙拌处椤碉紝1锛氭楠岄〉闈�,2妫�楠岄〉闈�(澶嶆牳)锛岄粯璁や负0 + activeFace: 0, //1锛氫笅鍗曪紝2锛氭煡鐪嬶紝3锛氬鏍革紝榛樿涓�0 + examine: null, + isReport: 0, + currentId: null, + orderId: 0, + personList:[], + currentTime: null, + sonLaboratoryList:[], + typeSourceList: [ + {label: '鎴愬搧涓嬪崟', value: 0}, + {label: '鍘熸潗鏂欎笅鍗�', value: 1}, + ], + isCopper: null, + customsInspection: {}, + typeSource: null,// 0:鎴愬搧涓嬪崟锛�1锛氬師鏉愭枡涓嬪崟 + showInfoDialog: false, // 浜т笟閾句俊鎭煡鐪� + issuedVisible: false, + fullscreen: false, + option:null, + } + }, + created() { + this.getDicts("urgency_level").then((response) => { + this.urgencyLevel = this.dictToValue(response.data); + }); + this.getDicts("inspection_task_state").then((response) => { + this.inspectionTaskState = this.dictToValue(response.data); + }); + this.getAuthorizedPerson() + this.currentTime = getYearAndMonthAndDays() + }, + mounted() { + this.refreshTable() + }, + methods: { + refreshTable(e) { + this.tableLoading = true; + let param = { ...this.entity, ...this.page }; + delete param.total; + selectInsOrderPlanList({ ...param }).then((res) => { + this.tableLoading = false; + if (res.code === 200) { + this.tableData = res.data.records; + this.page.total = res.data.total; + } + }).catch((err) => { + this.tableLoading = false; + }); + }, + pagination({ page, limit }) { + this.page.current = page; + this.page.size = limit; + this.refreshTable(); + }, + refresh() { + this.resetForm('entity') + this.refreshTable() + }, + rowClassName({ row, rowIndex }) { + if (this.currentTime == row.appointed) { + return "highlight-warning-row-border"; + } else if (this.currentTime > row.appointed) { + return "highlight-danger-row-border"; + } + return ""; + }, + // 鏌ョ湅浜т笟閾句俊鎭� + // openInfoDialog (row) { + // this.showInfoDialog = true + // this.$nextTick(() => { + // this.$refs.showInfoDialog.getInfo(row.ifsInventoryId) + // }) + // }, + selectAllByOne(row) { + this.isCopper = row.isCopper + this.customsInspection = row + this.activeFace = 2; + this.examine = 1; + this.isReport = 0; + this.currentId = parseInt(row.id) + switch (row.isCopper) { + case 0: + // 鍘熸潗鏂� + this.$router.push({ + path: "/materialOrder/customsInspection", query: { + customsInspection: row, + active: this.activeFace, + currentId: this.currentId, + isReport: this.isReport + } + }); + break; + case null: + // 鎴愬搧 + this.$router.push({ + path: "/productOrder/add", query: { + examine: this.examine, + active: this.activeFace, + currentId: this.currentId + } + }); + break; + case 1: + // 閾滄潗 + this.$router.push({ + path: "/materialOrder/copperOrder", query: { + active: this.activeFace, + currentId: this.currentId + } + }); + break; + } + }, + // 澶嶆牳鍥炶皟 + handleReview(row){ + this.$router.push({ + path: "/inspectionTask/inspection", + query: { + sonLaboratory: row.sonLaboratory, + state: 2, + typeSource: row.typeSource, + orderId: row.id, + }, + }) + }, + // 涓婁紶鎶ュ憡 + handleUpload () { + + }, + // 涓嬭浇鎶ュ憡 + download(row) { + let url = (row.urlS===null||row.urlS==='')?row.url:row.urlS + const link = document.createElement('a'); + link.href = this.javaApi + url; + link.target = '_blank'; + document.body.appendChild(link); + link.click(); + }, + // 杩樺師鎿嶄綔 + handleRestore(row) { + this.$axios.post(this.$api.insReport.upReportUrl, { + id: row.insReportId + }).then(res => { + if (res.code === 200) { + this.$message.success('鎿嶄綔鎴愬姛') + this.refreshTable('page') + } + }) + }, + // 鏌ョ湅鎶ュ憡 + handleIssued(row) { + this.currentInfo = row; + let fileName = row.url + let fileType = "docx" + if (row.tempUrlPdf != null || row.tempUrlPdf === '') { + fileName = row.tempUrlPdf + fileType = "pdf" + } + fileName = fileName.replace('/word/','') + const userName = JSON.parse(localStorage.getItem("user")).name; + this.option = { + url: this.javaApi + "/word/" + fileName, + isEdit: false, + fileType: fileType, + title: fileName, + lang: 'zh-CN', + isPrint: false, + user_id: 1, + user_name: userName, + editUrl: this.javaApi + "/insReport/onlyOffice/save?fileName=" + fileName + } + this.issuedVisible = true; + }, + getAuthorizedPerson() { + selectUserCondition({ type: 1 }).then((res) => { + let data = []; + res.data.forEach((a) => { + data.push({ + label: a.name, + value: a.id, + }); + }); + this.personList = data; + }); + }, + } +} +</script> +<style scoped> +.page_total { + margin-bottom: 10px; +} +</style> -- Gitblit v1.9.3