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