From 7eb190f13437b2e67788e9f4bdea725fdb165f01 Mon Sep 17 00:00:00 2001
From: zhuo <2089219845@qq.com>
Date: 星期二, 20 五月 2025 10:41:01 +0800
Subject: [PATCH] 代码合并

---
 src/components/Table/lims-table.vue                                            |    3 
 src/views/CNAS/process/ensureResults/ensureResultsValidity/index.vue           |   26 ++
 src/views/CNAS/resourceDemand/device/index.vue                                 |   24 ++
 src/api/cnas/process/ensureResults/managementReview.js                         |   36 +++
 src/views/CNAS/resourceDemand/device/component/management.vue                  |   20 +
 src/views/structural/capabilityAndLaboratory/capabilityComponents/EditForm.vue |   17 +
 src/api/cnas/process/reportResults.js                                          |    1 
 src/layout/components/TagsView/index.vue                                       |    6 
 src/views/CNAS/process/reportResults/index.vue                                 |   45 +---
 src/views/business/inspectionTask/inspection.vue                               |   13 +
 src/views/business/productOrder/index.vue                                      |   28 +
 src/views/business/materialOrder/customsInspectionOrder.vue                    |   10 
 src/views/business/productOrder/components/addOrder.vue                        |   89 +++++--
 src/views/CNAS/resourceDemand/device/component/record.vue                      |   10 
 src/views/CNAS/process/ensureResults/managementReview/index.vue                |  284 +++++++++++++++++++++++++
 src/components/Preview/filePreview.vue                                         |   14 
 src/api/business/add.js                                                        |    8 
 17 files changed, 539 insertions(+), 95 deletions(-)

diff --git a/src/api/business/add.js b/src/api/business/add.js
index 68389df..053a9cf 100644
--- a/src/api/business/add.js
+++ b/src/api/business/add.js
@@ -16,6 +16,14 @@
     data: query
   })
 }
+// 妫�楠岀被鍒负鎶芥鏃舵帀鎺ュ彛
+export function judgeNotSpotCheckOrder(query) {
+  return request({
+    url: '/insOrder/judgeNotSpotCheckOrder',
+    method: 'post',
+    data: query
+  })
+}
 // 娣诲姞妫�楠屼笅鍗曟暟鎹�
 export function addInsOrder(query) {
   return request({
diff --git a/src/api/cnas/process/ensureResults/managementReview.js b/src/api/cnas/process/ensureResults/managementReview.js
new file mode 100644
index 0000000..35449f4
--- /dev/null
+++ b/src/api/cnas/process/ensureResults/managementReview.js
@@ -0,0 +1,36 @@
+//璐ㄩ噺鐩戠潱绠$悊璇勫杈撳叆鏉愭枡鐩稿叧鎺ュ彛
+import request from '@/utils/request'
+
+// 鍒嗛〉鏌ヨ
+export function pageManagementReview(query) {
+  return request({
+    url: '/managementReview/pageManagementReview',
+    method: 'get',
+    params: query
+  })
+}
+// 瀵煎嚭
+export function exportManagementReview(query) {
+  return request({
+    url: '/managementReview/exportManagementReview',
+    method: 'get',
+    params: query,
+    responseType: 'blob'
+  })
+}
+// 鍒犻櫎
+export function deleteManagementReview(query) {
+  return request({
+    url: '/managementReview/deleteManagementReview',
+    method: 'delete',
+    params: query
+  })
+}
+// 鏂板淇敼鎻愪氦
+export function saveOrUpdateManagementReview(query) {
+  return request({
+    url: '/managementReview/saveOrUpdateManagementReview',
+    method: 'post',
+    data: query
+  })
+}
diff --git a/src/api/cnas/process/reportResults.js b/src/api/cnas/process/reportResults.js
index 0dbeb96..1b1011f 100644
--- a/src/api/cnas/process/reportResults.js
+++ b/src/api/cnas/process/reportResults.js
@@ -7,6 +7,7 @@
     url: "/processReport/exportProcessReport",
     method: "get",
     params: data,
+    responseType: "blob",
   });
 }
 
diff --git a/src/components/Preview/filePreview.vue b/src/components/Preview/filePreview.vue
index 7633c5e..aedb375 100644
--- a/src/components/Preview/filePreview.vue
+++ b/src/components/Preview/filePreview.vue
@@ -3,10 +3,11 @@
     <div v-if="isImage">
       <img :src="imgUrl" alt="Image Preview" />
     </div>
-    <div v-if="isPdf">
-      <object :data="fileUrl" type="application/pdf" width="100%" height="750px">
-        <p>鎮ㄧ殑娴忚鍣ㄤ笉鏀寔 PDF 棰勮銆�<a :href="fileUrl" style="color: #3a7bfa;" target="_blank">涓嬭浇 PDF 鏂囦欢</a></p>
-      </object>
+    <div v-if="isPdf" style="height: 80vh;">
+<!--      <object :data="fileUrl" type="application/pdf" width="100%" height="750px">-->
+<!--        <p>鎮ㄧ殑娴忚鍣ㄤ笉鏀寔 PDF 棰勮銆�<a :href="fileUrl" style="color: #3a7bfa;" target="_blank">涓嬭浇 PDF 鏂囦欢</a></p>-->
+<!--      </object>-->
+      <onlyoffice ref="onlyoffice" :options="option" style="width: 100%;height: 100%;" />
     </div>
     <div v-if="isDoc">
       <p v-if="!isDocShow">鏂囨。鏃犳硶鐩存帴棰勮锛岃涓嬭浇鏌ョ湅銆�</p>
@@ -58,8 +59,10 @@
 import VueOfficeExcel from '@vue-office/excel'
 //寮曞叆鐩稿叧鏍峰紡
 import '@vue-office/excel/lib/index.css'
+import onlyoffice from "@/components/Onlyoffice/onlyoffice.vue";
 export default {
   components: {
+    onlyoffice,
     VueOfficeDocx,
     VueOfficeExcel,
   },
@@ -72,6 +75,9 @@
       type: Object,
       required: true
     },
+    option: {
+      type: Object,
+    },
   },
   data() {
     return {
diff --git a/src/components/Table/lims-table.vue b/src/components/Table/lims-table.vue
index 2df0ddc..1f4e431 100644
--- a/src/components/Table/lims-table.vue
+++ b/src/components/Table/lims-table.vue
@@ -505,4 +505,7 @@
 .lims-table .highlight-danger-row-border td:last-child {
   border-right: 4px solid #f56c6c;
 }
+>>>.red-row td {
+  background: #FFCCCC !important;
+}
 </style>
diff --git a/src/layout/components/TagsView/index.vue b/src/layout/components/TagsView/index.vue
index 73d03a4..3b014fb 100644
--- a/src/layout/components/TagsView/index.vue
+++ b/src/layout/components/TagsView/index.vue
@@ -168,7 +168,11 @@
     closeSelectedTag(view) {
       this.$tab.closePage(view).then(({ visitedViews }) => {
         if (this.isActive(view)) {
-          this.toLastView(visitedViews, view)
+          if (view.fullPath.includes('/materialOrder/customsInspectionOrder') || view.fullPath.includes('/materialOrder/customsInspectionView')) {
+            this.$router.push('/business/materialOrder')
+          } else {
+            this.toLastView(visitedViews, view)
+          }
         }
       })
     },
diff --git a/src/views/CNAS/process/ensureResults/ensureResultsValidity/index.vue b/src/views/CNAS/process/ensureResults/ensureResultsValidity/index.vue
index efd399a..0ae1168 100644
--- a/src/views/CNAS/process/ensureResults/ensureResultsValidity/index.vue
+++ b/src/views/CNAS/process/ensureResults/ensureResultsValidity/index.vue
@@ -85,7 +85,7 @@
     </el-dialog>
     <!--棰勮鎶ュ憡-->
     <el-dialog :visible.sync="lookDialogVisible" fullscreen title="鏌ョ湅闄勪欢" top="5vh" width="800px">
-      <filePreview v-if="lookDialogVisible" :currentFile="{}"
+      <filePreview v-if="lookDialogVisible" :currentFile="{}" :option="option"
         :fileUrl="javaApi + '/word/' + currentInfo.finishReportUrl" style="height: 70vh;overflow-y: auto;" />
       <div>
         鎵瑰噯鐘舵�侊細
@@ -153,7 +153,7 @@
       <div style="margin: 0 auto;">
         <el-upload ref="upload1" :action="action1" :auto-upload="false"
           :data="{ qualityMonitorDetailsId: qualityMonitorDetailsId }" :file-list="fileList1" :headers="uploadHeader"
-          :limit="1" :on-change="beforeUpload1" :on-error="onError1" :on-success="onSuccess1" accept='.doc,.docx' drag
+          :limit="1" :on-change="beforeUpload1" :on-error="onError1" :on-success="onSuccess1" accept='.doc,.docx,application/pdf,' drag
           name="file">
           <i class="el-icon-upload"></i>
           <div class="el-upload__text">灏嗘枃浠舵嫋鍒版澶勶紝鎴�<em>鐐瑰嚮涓婁紶</em></div>
@@ -569,7 +569,8 @@
       ratifyRemark: '',
       downloadDialog: false,
       download: {},
-      planYear: ''
+      planYear: '',
+      option: {}
     };
   },
   mounted() {
@@ -802,6 +803,23 @@
       if (row.finishReportUrl) {
         this.currentInfo = row
         this.ratifyStatus = row.ratifyStatus
+        const userName = this.nickName
+        const isPdf = /\.pdf$/i.test(row.finishReportUrl)
+        if (isPdf) {
+          this.option = {
+            url: this.javaApi + "/word/" + row.finishReportUrl,
+            isEdit: false,
+            fileType: 'pdf',
+            title: '鎶ュ憡',
+            lang: 'zh-CN',
+            isPrint: false,
+            user_id: 1,
+            user_name: userName,
+            editUrl: this.javaApi + "/insReport/onlyOffice/save?fileName=" + row.finishReportUrl
+          }
+        } else {
+          this.option = {}
+        }
         this.lookDialogVisible = true
       } else {
         this.uploadDia1 = true
@@ -935,7 +953,7 @@
   },
   // 鐢ㄤ簬涓婁紶鏂囦欢鐨勪俊鎭�
   computed: {
-    ...mapGetters(["userId"]),
+    ...mapGetters(["userId", "nickName"]),
     action() {
       return this.javaApi + '/qualityMonitor/importQualityMonitor'
     },
diff --git a/src/views/CNAS/process/ensureResults/managementReview/index.vue b/src/views/CNAS/process/ensureResults/managementReview/index.vue
new file mode 100644
index 0000000..9e7a2a9
--- /dev/null
+++ b/src/views/CNAS/process/ensureResults/managementReview/index.vue
@@ -0,0 +1,284 @@
+<template>
+  <div class="capacity-scope">
+    <div style="display: flex;justify-content: space-between">
+      <div style="display: flex;">
+        <div style="margin-bottom: 18px;margin-right: 10px;display: flex;align-items: center;line-height: 32px;">
+          <span style="width: 88px;font-size: 14px;font-weight: 700;color: #606266;">鏂囦欢鍚嶇О</span>
+          <el-input v-model="queryParams.fileName" clearable placeholder="璇疯緭鍏�" size="small"
+                    @keyup.enter.native="refreshTable()"></el-input>
+        </div>
+        <div style="line-height: 30px;">
+          <el-button type="primary" size="mini" @click="refreshTable">鏌ヨ</el-button>
+          <el-button size="mini" @click="refresh">閲嶇疆</el-button>
+        </div>
+      </div>
+      <div style="line-height: 30px;">
+        <el-button :loading="outLoading" size="small" type="primary" style="margin-right: 10px" @click="openForm('add')">鏂板</el-button>
+      </div>
+    </div>
+    <div class="table">
+      <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 270px)'"
+                  :page="page" @pagination="pagination"></lims-table>
+    </div>
+    <el-dialog :visible.sync="addDialogVisible" title="璇勪环" width="900px" @close="closeDia">
+      <el-form ref="form" :model="form" label-position="right" label-width="120px" :rules="formRules">
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鏂囦欢鍚嶇О:" prop="fileName">
+              <el-input v-model="form.fileName" placeholder="璇疯緭鍏�" size="small"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="璁″垝鍐呭:" prop="implementationContent">
+              <el-input v-model="form.implementationContent" placeholder="璇疯緭鍏�"
+                        size="small"
+                        :rows="6"
+                        type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="24">
+            <el-form-item label="鍔ㄦ�佸唴瀹�:" prop="dynamicContent">
+              <el-input v-model="form.dynamicContent" placeholder="璇疯緭鍏�"
+                        size="small"
+                        :rows="6"
+                        type="textarea"></el-input>
+            </el-form-item>
+          </el-col>
+        </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鐩戠潱浜�:" prop="supervisor">
+              <el-select v-model="form.supervisor"
+                         clearable filterable
+                         placeholder="璇烽�夋嫨" size="small" style="width: 100%;">
+                <el-option v-for="item in responsibleOptions" :key="item.name" :label="item.name" :value="item.name">
+                </el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+          <el-col :span="12">
+            <el-form-item label="璐ㄩ噺璇勫鏃ユ湡:" prop="superviseDate">
+              <el-date-picker v-model="form.superviseDate" format="yyyy-MM-dd"
+                              placeholder="閫夋嫨鏃ユ湡" size="small" value-format="yyyy-MM-dd"
+                              type="date" style="width: 100%"></el-date-picker>
+            </el-form-item>
+          </el-col>
+        </el-row>
+      </el-form>
+      <span slot="footer" class="dialog-footer">
+        <el-button @click="closeDia">鍙� 娑�</el-button>
+        <el-button :loading="addLoading" type="primary" @click="handleAdd">纭� 瀹�</el-button>
+      </span>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import limsTable from "@/components/Table/lims-table.vue";
+import filePreview from "@/components/Preview/filePreview.vue";
+import {
+  exportProcessEvaluate,
+  doProcessEvaluate,
+  delProcessEvaluate,
+  pageProcessEvaluate,
+} from '@/api/cnas/process/uncertainty.js'
+import { mapGetters } from "vuex";
+import {
+  deleteManagementReview,
+  exportManagementReview,
+  pageManagementReview, saveOrUpdateManagementReview
+} from "@/api/cnas/process/ensureResults/managementReview";
+import {selectUserCondition} from "@/api/cnas/resourceDemand/facilitiesEnvironment/facilitiesAndEnvironment";
+export default {
+  name: 'Uncertainty',
+  components: {
+    limsTable,
+    filePreview
+  },
+  data() {
+    return {
+      addPower: false,
+      outPower: false,
+      outLoading: false,
+      addDialogVisible: false,
+      operationType: '',
+      addInfo: {},
+      addLoading: false,
+      queryParams: {},
+      tableData: [],
+      column: [
+        { label: "鏂囦欢鍚嶇О", prop: "fileName" },
+        { label: "鐩戠潱浜�", prop: "supervisor" },
+        { label: "璐ㄩ噺璇勫鏃ユ湡", prop: "superviseDate" },
+        {
+          dataType: "action",
+          label: "鎿嶄綔",
+          operation: [
+            {
+              name: "缂栬緫",
+              type: "text",
+              clickFun: (row) => {
+                this.openForm('edit', row);
+              },
+            },
+            {
+              name: "鍒犻櫎",
+              type: "text",
+              clickFun: (row) => {
+                this.handleDelete(row);
+              },
+            },
+            {
+              name: "瀵煎嚭",
+              type: "text",
+              clickFun: (row) => {
+                this.handleDown0(row);
+              },
+            },
+          ],
+        },
+      ],
+      page: {
+        total: 0,
+        size: 10,
+        current: 0,
+      },
+      tableLoading: false,
+      form: {
+        fileName: '',
+        implementationContent: '',
+        dynamicContent: '',
+        supervisor: '',
+        superviseDate: '',
+      },
+      formRules: {
+        fileName: [{required: true, message: '璇峰~鍐欐枃浠跺悕绉�',trigger: 'blur'}],
+        implementationContent: [{required: true, message: '璇峰~鍐欒鍒掑唴瀹�',trigger: 'blur'}],
+        dynamicContent: [{required: true, message: '璇峰~鍔ㄦ�佸唴瀹�',trigger: 'blur'}],
+        supervisor: [{required: true, message: '璇烽�夋嫨鐩戠潱浜�',trigger: 'change'}],
+        superviseDate: [{required: true, message: '璇烽�夋嫨鏃ユ湡',trigger: 'change'}],
+      },
+      responsibleOptions: [],
+    }
+  },
+  // 鐢ㄤ簬涓婁紶鏂囦欢鐨勪俊鎭�
+  computed: {
+    ...mapGetters(["userId"]),
+  },
+  mounted() {
+    this.getList()
+  },
+  methods: {
+    getList() {
+      this.tableLoading = true;
+      let param = { ...this.queryParams, ...this.page };
+      delete param.total;
+      pageManagementReview({ ...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.getList();
+    },
+    refresh() {
+      this.queryParams = {};
+      this.page.current = 1;
+      this.getList();
+    },
+    refreshTable() {
+      this.page.current = 1;
+      this.getList();
+    },
+    handleDown0(row) {
+      exportManagementReview({managementReviewId: row.managementReviewId}).then(res => {
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, row.fileName + '.docx');
+      })
+    },
+    // 鎵撳紑鏂板缂栬緫寮规
+    openForm (type, row) {
+      this.addDialogVisible = true;
+      this.$nextTick(() => {
+        this.form = {}
+        this.$refs['form'].resetFields();
+        if (type === 'edit') {
+          this.form = {...row}
+        }
+        this.operationType = type;
+        this.getUserList()
+      })
+    },
+    // 鎻愪氦琛ㄥ崟
+    handleAdd() {
+      this.addLoading = true;
+      saveOrUpdateManagementReview(this.form).then((res) => {
+        this.addLoading = false;
+        this.$message.success('璇勪环鎴愬姛');
+        this.closeDia();
+        this.refreshTable()
+      })
+    },
+    closeDia() {
+      this.$refs['form'].resetFields();
+      this.addDialogVisible = false;
+    },
+    handleDelete(row) {
+      this.$confirm("鏄惁鍒犻櫎璇ユ潯鏁版嵁?", "鎻愮ず", {
+        confirmButtonText: "纭畾",
+        cancelButtonText: "鍙栨秷",
+        type: "warning",
+      }).then(() => {
+        deleteManagementReview({ managementReviewId: row.managementReviewId }).then((res) => {
+          this.$message.success("鍒犻櫎鎴愬姛");
+          this.refresh();
+        });
+      }).catch(() => { });
+    },
+    getUserList(){
+      selectUserCondition({type: 2}).then(res => {
+        if (res.code == 200) {
+          this.responsibleOptions = res.data
+        }
+      })
+    },
+  }
+}
+</script>
+
+<style scoped>
+.search {
+  height: 46px;
+  display: flex;
+  justify-content: space-between;
+}
+
+.search_thing {
+  width: 350px;
+  display: flex;
+  align-items: center;
+}
+
+.search_label {
+  width: 80px;
+  font-size: 14px;
+  text-align: right;
+}
+
+.search_input {
+  width: calc(100% - 80px);
+}
+</style>
diff --git a/src/views/CNAS/process/reportResults/index.vue b/src/views/CNAS/process/reportResults/index.vue
index 81566bd..88b1c7c 100644
--- a/src/views/CNAS/process/reportResults/index.vue
+++ b/src/views/CNAS/process/reportResults/index.vue
@@ -19,8 +19,7 @@
     </div>
     <div class="table">
       <lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 270px)'"
-        :page="page" @pagination="pagination" :isSelection="true"
-        :handleSelectionChange="handleSelectionChange"></lims-table>
+        :page="page" @pagination="pagination"></lims-table>
     </div>
     <el-dialog :title="title" :visible.sync="addDialogVisible" width="400px" top="6vh">
       <el-row>
@@ -83,12 +82,8 @@
         <el-col :span="24" style="margin-bottom: 16px;">
           <div class="search_thing">
             <div class="search_label">绛炬敹浜猴細</div>
-            <div class="search_input">
-              <el-select v-model="addInfo.signatory" placeholder="璇烽�夋嫨" size="small" style="width: 100%;" multiple>
-                <el-option v-for="item in personList" :key="item.value" :label="item.label" :value="item.value">
-                </el-option>
-              </el-select>
-            </div>
+            <div class="search_input"><el-input size="small" placeholder="璇疯緭鍏�" clearable
+                                                v-model="addInfo.signatory"></el-input></div>
           </div>
         </el-col>
         <el-col :span="24" style="margin-bottom: 16px;">
@@ -132,11 +127,8 @@
       personList: [],
       title: '鏂板',
       addDialogVisible: false,
-      addInfo: {
-        signatory: []
-      },
+      addInfo: {},
       addLoading: false,
-      mutilSelect: [],
       queryParams: {
         insReportCode: ''
       },
@@ -152,7 +144,7 @@
         { label: "鍙戦�佹柟寮�", prop: "method" },
         { label: "鍙戦�佹棩鏈�", prop: "sendTime" },
         { label: "鍙戦�佷汉", prop: "sendUserName" },
-        { label: "绛炬敹浜�", prop: "signatoryName" },
+        { label: "绛炬敹浜�", prop: "signatory" },
         { label: "澶囨敞", prop: "remark" },
         {
           dataType: "action",
@@ -191,21 +183,16 @@
   },
   methods: {
     handleDown() {
-      if (this.mutilSelect.length == 0) {
-        this.$message.warning('璇烽�夋嫨瑕佸鍑虹殑鏁版嵁')
-        return
-      }
       this.outLoading = true
-      exportProcessReport({ ids: this.mutilSelect.map(m => m.id) }).then(res => {
+      exportProcessReport(this.queryParams).then(res => {
         this.outLoading = false
-        this.$download.saveAs(res.data, "鎶ュ憡缁撴灉");
+        const blob = new Blob([res], { type: 'application/msword' });
+        this.$download.saveAs(blob, '鎶ュ憡缁撴灉' + '.docx');
       })
     },
     openAdd() {
       this.title = '鏂板'
-      this.addInfo = {
-        signatory: []
-      }
+      this.addInfo = {}
       this.addDialogVisible = true;
     },
     getList() {
@@ -238,9 +225,6 @@
       this.page.current = 1;
       this.getList();
     },
-    handleSelectionChange(val) {
-      this.mutilSelect = val
-    },
     getAuthorizedPerson() {
       selectUserCondition().then(res => {
         let data = []
@@ -258,13 +242,10 @@
       delete this.addInfo.createTime
       delete this.addInfo.createUser
       delete this.addInfo.updateTime
-      delete this.addInfo.signatoryUrl
       delete this.addInfo.updateUserer
       delete this.addInfo.sendUserName
-      let addInfo = this.HaveJson(this.addInfo)
-      addInfo.signatory = addInfo.signatory.join(',')
       if (this.title == '鏂板') {
-        addProcessReport(addInfo).then(res => {
+        addProcessReport(this.addInfo).then(res => {
           this.addLoading = false
           this.addDialogVisible = false
           this.$message({
@@ -274,7 +255,7 @@
           this.refreshTable()
         }).catch(err => { })
       } else {
-        doProcessReport(addInfo).then(res => {
+        doProcessReport(this.addInfo).then(res => {
           this.addLoading = false
           this.addDialogVisible = false
           this.$message({
@@ -289,11 +270,7 @@
       this.title = '淇敼'
       this.addInfo = row
       console.log(this.addInfo)
-      this.addInfo.signatory = this.addInfo.signatory ? this.addInfo.signatory.split(',').map(m => Number(m)) : []
       this.addDialogVisible = true;
-    },
-    handleChangeTask(list) {
-      this.mutilSelect = list
     },
     handleDelete(row) {
       this.$confirm("鏄惁鍒犻櫎璇ユ潯鏁版嵁?", "鎻愮ず", {
diff --git a/src/views/CNAS/resourceDemand/device/component/management.vue b/src/views/CNAS/resourceDemand/device/component/management.vue
index 8d74156..9224055 100644
--- a/src/views/CNAS/resourceDemand/device/component/management.vue
+++ b/src/views/CNAS/resourceDemand/device/component/management.vue
@@ -16,9 +16,9 @@
                       @keyup.enter.native="refreshTable()">
             </el-input>
           </el-form-item>
-          <el-form-item label="瑙勬牸鍨嬪彿" prop="specificationModel">
+          <el-form-item label="绠$悊缂栧彿" prop="managementNumber">
             <el-input size="small" placeholder="璇疯緭鍏�" clearable
-                      v-model="queryParams.specificationModel" @keyup.enter.native="refreshTable()"></el-input>
+                      v-model="queryParams.managementNumber" @keyup.enter.native="refreshTable()"></el-input>
           </el-form-item>
           <el-form-item>
             <el-button type="primary" size="mini" @click="refreshTable">鏌ヨ</el-button>
@@ -33,7 +33,7 @@
     </div>
 		<div class="table" v-show="!showData">
 			<lims-table :tableData="tableData" :column="column" :tableLoading="tableLoading" :height="'calc(100vh - 300px)'"
-				:page="page" @pagination="pagination"></lims-table>
+				:page="page" @pagination="pagination" :row-class-name="tableRowClassName"></lims-table>
 		</div>
 		<el-dialog :title="isUp ? '璁惧璇︽儏' : '妗f淇'" :visible.sync="dialogVisible" width="70%" top="5vh"
 			:before-close="handleClose">
@@ -477,7 +477,7 @@
 				{ label: "绠$悊缂栧彿", prop: "managementNumber" },
 				{ label: "鎶�鏈寚鏍�", prop: "technicalIndicators" },
 				{ label: "璐疆鏃ユ湡", prop: "acquisitionDate" },
-				{ label: "鍚敤鏃ユ湡", prop: "activationDate" },
+				{ label: "鏍″噯鏈夋晥鏈�", prop: "activationDate" },
 				{ label: "绠$悊浜�", prop: "equipmentManagerUser" },
 				{ label: "瀛樻斁鐐�", prop: "storagePoint" },
 				{ label: "鎵�灞為儴闂�", prop: "laboratoryName" },
@@ -606,6 +606,18 @@
 			this.page.size = limit;
 			this.getList();
 		},
+    tableRowClassName({ row }) {
+      const today = new Date();
+      const targetDate = new Date(row.activationDate);
+      const fiveDaysBeforeTarget = new Date(targetDate);
+      // 璁$畻鍓嶄簲澶╃殑鏃ユ湡
+      fiveDaysBeforeTarget.setDate(targetDate.getDate() - 5);
+      // 姣旇緝鏃堕渶瑕佺‘淇濇瘮杈冪殑鏄畬鏁寸殑鏃ユ湡鏃堕棿锛屽寘鍚椂鍒嗙
+      if (today > fiveDaysBeforeTarget) {
+        return 'red-row';
+      }
+      return '';
+    },
 		refresh() {
 			this.queryParams = {};
 			this.page.current = 1;
diff --git a/src/views/CNAS/resourceDemand/device/component/record.vue b/src/views/CNAS/resourceDemand/device/component/record.vue
index 869410d..5f3b83c 100644
--- a/src/views/CNAS/resourceDemand/device/component/record.vue
+++ b/src/views/CNAS/resourceDemand/device/component/record.vue
@@ -108,7 +108,8 @@
               prop="useDateList">
               <el-date-picker v-model="form.useDateList" :disabled="operationType === 'view'" end-placeholder="缁撴潫鏃ユ湡"
                 format="yyyy-MM-dd HH:mm:ss" size="small" start-placeholder="寮�濮嬫棩鏈�" style="width:100%"
-                type="datetimerange" value-format="yyyy-MM-dd HH:mm:ss">
+                type="datetimerange" value-format="yyyy-MM-dd HH:mm:ss"
+                              :picker-options="pickerOptions">
               </el-date-picker>
             </el-form-item>
           </el-col>
@@ -213,7 +214,12 @@
       dialogVisible: false,
       operationType: '',
       formParamList: [],
-      tableLoading: false
+      tableLoading: false,
+      pickerOptions: {
+        disabledDate(time) {
+          return time.getTime() > Date.now();
+        }
+      }
     }
   },
   mounted() {
diff --git a/src/views/CNAS/resourceDemand/device/index.vue b/src/views/CNAS/resourceDemand/device/index.vue
index 063a9b2..e01dc60 100644
--- a/src/views/CNAS/resourceDemand/device/index.vue
+++ b/src/views/CNAS/resourceDemand/device/index.vue
@@ -12,7 +12,9 @@
         <div slot-scope="{ node, data }" class="custom-tree-node">
           <el-row style="width: 100%;">
             <el-col :span="24">
-              <p class="single-line-ellipsis" style="width: 100%">
+              <p class="single-line-ellipsis" style="width: 100%" :style="{
+              color: isLeafNode(data) && shouldHighlight(data) ? 'red' : ''
+            }">
                 <i :class="`node_i ${data.children != undefined
                   ? data.code === '[1]'
                     ? 'el-icon-folder-opened'
@@ -22,7 +24,9 @@
                   "></i>
                 {{ data.label }}
               </p>
-              <p>
+              <p :style="{
+              color: isLeafNode(data) && shouldHighlight(data) ? 'red' : ''
+            }">
                 {{ data.managementNumber === undefined ? '' : data.managementNumber }}
               </p>
             </el-col>
@@ -198,9 +202,25 @@
       treeDevice().then(res => {
         let data = res.data;
         this.list = data;
+        console.log('this.list--', this.list)
         this.loading = false
       });
     },
+    // 鍒ゆ柇鏄惁鏄彾瀛愯妭鐐�
+    isLeafNode(data) {
+      return !data.children || data.children.length === 0;
+    },
+    // 鍒ゆ柇鏄惁闇�瑕佹爣绾�
+    shouldHighlight(data) {
+      if (!data.activationDate) return false;
+      const today = new Date();
+      const targetDate = new Date(data.activationDate);
+      const fiveDaysBeforeTarget = new Date(targetDate);
+      // 璁$畻鍓嶄簲澶╃殑鏃ユ湡
+      fiveDaysBeforeTarget.setDate(targetDate.getDate() - 5);
+
+      return today > fiveDaysBeforeTarget;
+    },
     handleNodeClick(val, node, el) {
       // 鐐瑰嚮涓存椂缂撳瓨
       this.clickNodeVal = val;
diff --git a/src/views/business/inspectionTask/inspection.vue b/src/views/business/inspectionTask/inspection.vue
index f648679..06fe550 100644
--- a/src/views/business/inspectionTask/inspection.vue
+++ b/src/views/business/inspectionTask/inspection.vue
@@ -2663,12 +2663,23 @@
           } else {
             param = this.param;
           }
+          let isNoTestValue = ''
+          for (let key in param) {
+            if (param[key]) {
+              if (param[key].insValue?.length === 0) {
+                isNoTestValue = 1
+              } else {
+                isNoTestValue = ''
+              }
+            }
+          }
           saveInsContext({
             param: JSON.stringify(param),
             currentTable: this.currentTable,
             sampleId: this.currentSample.id,
             orderId: this.orderId,
-            sonLaboratory: this.sonLaboratory
+            sonLaboratory: this.sonLaboratory,
+            isNoTestValue: isNoTestValue
           }).then((res) => {
             this.$message.success("宸蹭繚瀛�");
           });
diff --git a/src/views/business/materialOrder/customsInspectionOrder.vue b/src/views/business/materialOrder/customsInspectionOrder.vue
index 35d165b..cfb2675 100644
--- a/src/views/business/materialOrder/customsInspectionOrder.vue
+++ b/src/views/business/materialOrder/customsInspectionOrder.vue
@@ -12,9 +12,13 @@
           <el-select v-show="active==1" v-model="template" placeholder="涓嬪崟妯℃澘" size="small" style="margin-right: 10px;"
                      @change="selectInsOrderTemplateByIdList">
             <el-option v-for="(a, ai) in templates" :key="ai" :label="a.name" :value="a.id">
-              <span style="float: left">{{ a.name }}</span>
-              <i class="el-icon-delete" style="float: right; color: #66b1ff; font-size: 16px"
-                 @click.stop="handleDelete(a)"></i>
+              <div style="display: flex; align-items: center; justify-content: space-between;">
+                <span>{{ a.name }}</span>
+                <i class="el-icon-delete"
+                   style="color: #66b1ff; font-size: 16px; cursor: pointer;"
+                   @click.stop="handleDelete(a)">
+                </i>
+              </div>
             </el-option>
           </el-select>
           <el-button v-show="active==1" size="small" @click="templateDia=true">
diff --git a/src/views/business/productOrder/components/addOrder.vue b/src/views/business/productOrder/components/addOrder.vue
index 555567b..90eb98b 100644
--- a/src/views/business/productOrder/components/addOrder.vue
+++ b/src/views/business/productOrder/components/addOrder.vue
@@ -14,9 +14,13 @@
           <el-select v-show="active==1" v-model="template" placeholder="涓嬪崟妯℃澘" size="small"
                      @change="selectInsOrderTemplateById">
             <el-option v-for="(a, ai) in templates" :key="ai" :label="a.name" :value="a.id">
-              <span style="float: left">{{ a.name }}</span>
-              <i class="el-icon-delete" style="float: right; color: #66b1ff; font-size: 16px"
-                 @click.stop="handleDelete(a)"></i>
+              <div style="display: flex; align-items: center; justify-content: space-between;">
+                <span>{{ a.name }}</span>
+                <i class="el-icon-delete"
+                   style="color: #66b1ff; font-size: 16px; cursor: pointer;"
+                   @click.stop="handleDelete(a)">
+                </i>
+              </div>
             </el-option>
           </el-select>
           <el-button v-show="active==1" size="small" @click="templateDia=true">
@@ -587,7 +591,7 @@
 } from "@/api/business/rawMaterialOrder";
 import {
   addInsOrder, addInsOrderTemplate, delInsOrderTemplate,
-  getQuarterOnOrder, selectInsOrderTemplateById,
+  getQuarterOnOrder, judgeNotSpotCheckOrder, selectInsOrderTemplateById,
   selectOrderManDay,
   updateInsOrder,
   upInsOrder,
@@ -598,6 +602,7 @@
 import limsTable from "@/components/Table/lims-table.vue";
 import {selectCustomPageList} from "@/api/system/customer";
 import {mapGetters} from "vuex";
+import {addQuarter, updateQuarterOnOrder} from "@/api/business/finishedProductSampling";
 
 export default {
   name: 'AddOrder',
@@ -1255,36 +1260,62 @@
         }
       },
       saveMethod(sampleList){
-        this.saveLoad = true
         if (this.addObj.quarterItemId) {
           this.addObj.quarterItemId = this.addObj.quarterItemId[1]
         }
-        if(this.tabIndex==4&&this.active==2){
-          if (this.addObj.createTime) {
-            delete this.addObj.createTime
-          }
-          // 閫�鍥炲悗鎻愪氦
-          updateInsOrder({insOrder: this.addObj, sampleProduct: sampleList}).then(res => {
-            this.saveLoad = false
-            this.$message.success('宸叉彁浜�')
-            this.bsm3Dia = false;
-            this.closeOpenPage()
-          }).catch(e=>{
-            this.saveLoad = false
-          })
-        }else{
-          // 甯歌鎻愪氦
-          addInsOrder({insOrder: this.addObj, sampleList: sampleList}).then(res => {
-            this.saveLoad = false
-            this.$message.success('宸叉彁浜�')
-            this.bsm3Dia = false;
-            this.closeOpenPage()
-          }).catch(e=>{
-            this.saveLoad = false
-          })
+        if (this.addObj.createTime) {
+          delete this.addObj.createTime
         }
-
+        if (this.addObj.orderType === '鎶芥') {
+          judgeNotSpotCheckOrder({ insOrder: this.addObj, sampleList: sampleList }).then(res => {
+            if (res.data === true) {
+              this.saveData(sampleList);
+            } else {
+              // const message = res.message.replace(/\n/g, '<br>');
+              this.$confirm(res.message, '鎻愮ず', {
+                confirmButtonText: '纭畾',
+                cancelButtonText: '鍙栨秷',
+                type: 'warning',
+                dangerouslyUseHTMLString: true, // 馃憟 鍏抽敭鐐癸細鍏佽 HTML
+                message: res.message // 杩欓噷涔熷彲浠ョ渷鐣ワ紝鍥犱负绗簩涓弬鏁版槸 title锛岀涓変釜鏄� options
+              }).then(() => {
+                this.saveData(sampleList);
+              }).catch(() => {
+                this.$message({
+                  type: 'info',
+                  message: '宸插彇娑�'
+                });
+              });
+            }
+          });
+        } else {
+          this.saveData(sampleList)
+        }
       },
+    saveData(sampleList) {
+      this.saveLoad = true
+      if(this.tabIndex==4&&this.active==2){
+        // 閫�鍥炲悗鎻愪氦
+        updateInsOrder({insOrder: this.addObj, sampleProduct: sampleList}).then(res => {
+          this.saveLoad = false
+          this.$message.success('宸叉彁浜�')
+          this.bsm3Dia = false;
+          this.closeOpenPage()
+        }).catch(e=>{
+          this.saveLoad = false
+        })
+      }else{
+        // 甯歌鎻愪氦
+        addInsOrder({insOrder: this.addObj, sampleList: sampleList}).then(res => {
+          this.saveLoad = false
+          this.$message.success('宸叉彁浜�')
+          this.bsm3Dia = false;
+          this.closeOpenPage()
+        }).catch(e=>{
+          this.saveLoad = false
+        })
+      }
+    },
       upInsOrderOfState(state) {
         if (state == 1) {
           this.saveLoad = true
diff --git a/src/views/business/productOrder/index.vue b/src/views/business/productOrder/index.vue
index b602274..b674f14 100644
--- a/src/views/business/productOrder/index.vue
+++ b/src/views/business/productOrder/index.vue
@@ -985,14 +985,26 @@
     },
     // 鐐瑰嚮鏍峰搧鍚嶇О
     selectAllByOne(row) {
-      this.$router.push({
-        path: "/productOrder/addView", query: {
-          examine: 1,
-          active: 2,
-          currentId: row.id,
-          tabIndex: this.tabIndex,
-        }
-      });
+      if (this.tabIndex === 4) {
+        this.$router.push({
+          path: "/productOrder/addOrder", query: {
+            examine: 1,
+            active: 2,
+            currentId: row.id,
+            tabIndex: this.tabIndex,
+          }
+        });
+      } else {
+        this.$router.push({
+          path: "/productOrder/addView", query: {
+            examine: 1,
+            active: 2,
+            currentId: row.id,
+            tabIndex: this.tabIndex,
+          }
+        });
+      }
+
     },
     // 淇敼鏍峰搧鍨嬪彿
     editSampleModel (row) {
diff --git a/src/views/structural/capabilityAndLaboratory/capabilityComponents/EditForm.vue b/src/views/structural/capabilityAndLaboratory/capabilityComponents/EditForm.vue
index bb55b02..a236a5b 100644
--- a/src/views/structural/capabilityAndLaboratory/capabilityComponents/EditForm.vue
+++ b/src/views/structural/capabilityAndLaboratory/capabilityComponents/EditForm.vue
@@ -175,6 +175,15 @@
             </el-form-item>
           </el-col>
         </el-row>
+        <el-row>
+          <el-col :span="12">
+            <el-form-item label="鎶芥绫诲瀷缁戝畾锛�" prop="spotCheckType">
+              <el-select v-model="editForm.spotCheckType" clearable placeholder="璇烽�夋嫨" size="small" style="width: 100%">
+                <el-option v-for="item in dict.type.spot_check_type" :key="item.value" :label="item.label" :value="item.value"></el-option>
+              </el-select>
+            </el-form-item>
+          </el-col>
+        </el-row>
 <!--        <el-col :span="12">-->
 <!--          <el-form-item label="瀛楀吀绫诲瀷锛�" prop="dic">-->
 <!--            <el-select v-model="editForm.dic" clearable placeholder="璇烽�夋嫨" size="small" style="width: 100%">-->
@@ -207,7 +216,7 @@
   name: "EditForm",
   // import 寮曞叆鐨勭粍浠堕渶瑕佹敞鍏ュ埌瀵硅薄涓墠鑳戒娇鐢�
   components: {},
-  dicts: ['sys_sub_lab', 'inspection_item_type', 'sys_unit', 'inspection_value_type', 'inspection_bsm'],
+  dicts: ['sys_sub_lab', 'inspection_item_type', 'sys_unit', 'inspection_value_type', 'inspection_bsm', 'spot_check_type'],
   data() {
     // 杩欓噷瀛樻斁鏁版嵁
     return {
@@ -237,7 +246,8 @@
         inspectionItemClassEn: '', // 妫�楠岄」鍒嗙被EN
         method: '', // 璇曢獙鏂规硶
         radiusList: [], // 鏉′欢
-        rates: '', // 鏉′欢
+        rates: '', // 鏀惰垂鏍囧噯(鍏�/娆�)
+        spotCheckType: '', // 鎶芥绫诲瀷缁戝畾
         deviceId: [], // 璁惧
       },
       sampleList: [], // 妫�楠屽璞′笅鎷夋
@@ -313,7 +323,8 @@
             inspectionItemClassEn: '', // 妫�楠岄」鍒嗙被EN
             method: '', // 璇曢獙鏂规硶
             radiusList: [], // 鏉′欢
-            rates: '', // 鏉′欢
+            rates: '', // 鏀惰垂鏍囧噯(鍏�/娆�)
+            spotCheckType: '', // 鎶芥绫诲瀷缁戝畾
         }
         this.resetForm('editForm')
       } else {

--
Gitblit v1.9.3