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"/>-->
+<!--    &lt;!&ndash;浜т笟閾句俊鎭煡鐪�&ndash;&gt;-->
+<!--    <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