From 332e2e6cd982c2d71028798f535a94d7b9c55b91 Mon Sep 17 00:00:00 2001
From: 董国庆 <364620639@qq.com>
Date: 星期二, 09 十二月 2025 16:59:26 +0800
Subject: [PATCH] 12.07  更新

---
 laboratory/src/views/dataManagement/testResultReport/detail.vue                              |  170 +++++
 laboratory/src/views/dataManagement/testResultReport/list.vue                                |  385 +++++++---
 laboratory/src/views/dataManagement/testResultReport/components/record-detail.vue            |  756 ++++++++++++++++++++++
 laboratory/src/views/chemistQa/productApproval/index.vue                                     |    8 
 laboratory/src/views/dataManagement/originalRecordTest/service.js                            |    1 
 laboratory/src/views/chemistQa/rawMaterials/index.vue                                        |    8 
 laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue              |   29 
 laboratory/src/views/dataManagement/sampleSubmissionList/submission.vue                      |  303 ++++++--
 laboratory/src/components/DynamicComponent/addTableData.vue                                  |   96 ++
 laboratory/src/views/dataManagement/sampleSubmissionList/components/receiveConfirmDialog.vue |  130 +++
 laboratory/src/App.vue                                                                       |    2 
 laboratory/src/components/AiEditor/index.vue                                                 |    2 
 laboratory/src/views/dataManagement/testResultReport/service.js                              |   12 
 laboratory/src/views/dataManagement/schemeManagement/addPlan.vue                             |  102 ++
 laboratory/src/views/chemistQa/projectTesting/index.vue                                      |    4 
 laboratory/src/views/chemistQa/pilotAndProduction/index.vue                                  |    7 
 laboratory/src/views/dataManagement/originalRecordTest/list.vue                              |    1 
 17 files changed, 1,739 insertions(+), 277 deletions(-)

diff --git a/laboratory/src/App.vue b/laboratory/src/App.vue
index 4a0f830..47db138 100644
--- a/laboratory/src/App.vue
+++ b/laboratory/src/App.vue
@@ -148,7 +148,7 @@
 
     .el-pagination__sizes {
       .el-input__inner {
-        width: 100px;
+        width: 100px !important;
       }
     }
 
diff --git a/laboratory/src/components/AiEditor/index.vue b/laboratory/src/components/AiEditor/index.vue
index ba6f6ea..576c52f 100644
--- a/laboratory/src/components/AiEditor/index.vue
+++ b/laboratory/src/components/AiEditor/index.vue
@@ -278,8 +278,6 @@
         },
 
       }
-
-      console.log('this.addIpToContent(this.value)',this.addIpToContent(this.value))
       try {
         this.editor = new AiEditor(options)
       } catch (error) {
diff --git a/laboratory/src/components/DynamicComponent/addTableData.vue b/laboratory/src/components/DynamicComponent/addTableData.vue
index de40882..3ed8113 100644
--- a/laboratory/src/components/DynamicComponent/addTableData.vue
+++ b/laboratory/src/components/DynamicComponent/addTableData.vue
@@ -30,20 +30,28 @@
                   :prop="header.name"
                   :rules="[
                     {
-                      required: header.required === true || header.required === 'true',
+                      required:
+                        (header.required === true ||
+                          header.required === 'true') &&
+                        isApprovaler,
                       message: header.message || `请输入${header.name}`,
                       trigger: ['blur', 'change'],
                     },
                     {
                       validator: (rule, value, callback) => {
-                        if ((header.required === true || header.required === 'true') && (!value || value.trim() === '')) {
+                        if (
+                          (header.required === true ||
+                            header.required === 'true') &&
+                          (!value || value.trim() === '') &&
+                          isApprovaler
+                        ) {
                           callback(header.message || `请输入${header.name}`);
                         } else {
                           callback();
                         }
                       },
                       trigger: ['blur', 'change'],
-                    }
+                    },
                   ]"
                   v-if="header.type == 'text'"
                 >
@@ -58,7 +66,9 @@
                   :prop="header.name"
                   :rules="{
                     required:
-                      header.required === true || header.required === 'true',
+                      (header.required === true ||
+                        header.required === 'true') &&
+                      isApprovaler,
                     trigger: ['blur', 'change'],
                   }"
                   class="image-form-item"
@@ -72,9 +82,18 @@
                     :auto-upload="true"
                     list-type="picture-card"
                     :before-upload="beforeImageUpload"
-                    :on-change="(file, fileList) => handleImageChange(file, fileList, header.name)"
-                    :on-remove="(file, fileList) => handleImageRemove(file, fileList, header.name)"
-                    :on-success="(res, file, fileList) => handleImageSuccess(res, file, fileList, header.name)"
+                    :on-change="
+                      (file, fileList) =>
+                        handleImageChange(file, fileList, header.name)
+                    "
+                    :on-remove="
+                      (file, fileList) =>
+                        handleImageRemove(file, fileList, header.name)
+                    "
+                    :on-success="
+                      (res, file, fileList) =>
+                        handleImageSuccess(res, file, fileList, header.name)
+                    "
                     :on-preview="handlePreview"
                     :disabled="!checkEditPermission(header)"
                     multiple
@@ -96,7 +115,9 @@
                   :prop="header.name"
                   :rules="{
                     required:
-                      header.required === true || header.required === 'true',
+                      (header.required === true ||
+                        header.required === 'true') &&
+                      isApprovaler,
                     message: header.message || `请输入${header.name}`,
                     trigger: ['blur', 'change'],
                   }"
@@ -141,7 +162,9 @@
                   :prop="header.name"
                   :rules="{
                     required:
-                      header.required === true || header.required === 'true',
+                      (header.required === true ||
+                        header.required === 'true') &&
+                      isApprovaler,
                     message: header.message || `请输入${header.name}`,
                     trigger: ['blur', 'change'],
                   }"
@@ -244,6 +267,10 @@
       const userInfo = JSON.parse(sessionStorage.getItem("userInfo") || "{}");
       return userInfo.userId;
     },
+    isApprovaler() {
+      const userInfo = JSON.parse(sessionStorage.getItem("userInfo") || "{}");
+      return userInfo.roleType != 3; // 不是工艺工程师
+    },
   },
   watch: {
     visible: {
@@ -297,7 +324,8 @@
       if (!header.role || !Array.isArray(header.role)) {
         return true;
       }
-      return header.role.includes(this.currentUserId);
+      const userInfo = JSON.parse(sessionStorage.getItem("userInfo") || "{}");
+      return header.role.includes(this.currentUserId) || (userInfo.roleType == 3);
     },
     initRules() {
       // 初始化校验规则
@@ -305,12 +333,24 @@
       if (this.headerList && this.headerList.length) {
         this.headerList.forEach((header) => {
           // 处理required可能是字符串的情况
+          const userInfo = JSON.parse(
+            sessionStorage.getItem("userInfo") || "{}"
+          );
           const isRequired =
-            header.required === true || header.required === "true";
+            (header.required === true || header.required === "true") &&
+            userInfo.roleType != 3;
           if (isRequired) {
             rules[header.name] = [
               {
                 required: true,
+                message: header.message || `请输入${header.name}`,
+                trigger: ["blur", "change"],
+              },
+            ];
+          }else{
+            rules[header.name] = [
+              {
+                required: false,
                 message: header.message || `请输入${header.name}`,
                 trigger: ["blur", "change"],
               },
@@ -357,8 +397,20 @@
           if (header.type === "user") {
             formData[header.name] = data[header.name] || [];
           } else if (header.type === "image") {
-            formData[header.name] = Array.isArray(data[header.name]) ? data[header.name] : (data[header.name] ? [data[header.name]] : []);
-            this.$set(this.imageListMap, header.name, (formData[header.name] || []).map(url => ({ name: "image", url: getFullUrl(url), status: "success" })));
+            formData[header.name] = Array.isArray(data[header.name])
+              ? data[header.name]
+              : data[header.name]
+              ? [data[header.name]]
+              : [];
+            this.$set(
+              this.imageListMap,
+              header.name,
+              (formData[header.name] || []).map((url) => ({
+                name: "image",
+                url: getFullUrl(url),
+                status: "success",
+              }))
+            );
           } else {
             formData[header.name] = data[header.name] || "";
           }
@@ -415,7 +467,7 @@
       this.initFormData();
     },
     handleSubmit() {
-      console.log('4444444444444')
+      console.log("4444444444444");
       this.$refs.form.validate((valid) => {
         if (valid) {
           const submitData = {
@@ -472,12 +524,24 @@
         this.$set(this.form, fieldName, []);
       }
       // 只保留 fileList 中的 url
-      this.$set(this.form, fieldName, fileList.map(f => f.url ? (f.url.startsWith('http') ? f.url : getFullUrl(f.url)) : ''));
+      this.$set(
+        this.form,
+        fieldName,
+        fileList.map((f) =>
+          f.url ? (f.url.startsWith("http") ? f.url : getFullUrl(f.url)) : ""
+        )
+      );
       this.$set(this.imageListMap, fieldName, fileList);
       this.$refs.form && this.$refs.form.validateField(fieldName);
     },
     handleImageRemove(file, fileList, fieldName) {
-      this.$set(this.form, fieldName, fileList.map(f => f.url ? (f.url.startsWith('http') ? f.url : getFullUrl(f.url)) : ''));
+      this.$set(
+        this.form,
+        fieldName,
+        fileList.map((f) =>
+          f.url ? (f.url.startsWith("http") ? f.url : getFullUrl(f.url)) : ""
+        )
+      );
       this.$set(this.imageListMap, fieldName, fileList);
     },
     handlePreview(file) {
diff --git a/laboratory/src/views/chemistQa/pilotAndProduction/index.vue b/laboratory/src/views/chemistQa/pilotAndProduction/index.vue
index eb48357..e24b860 100644
--- a/laboratory/src/views/chemistQa/pilotAndProduction/index.vue
+++ b/laboratory/src/views/chemistQa/pilotAndProduction/index.vue
@@ -67,7 +67,7 @@
                             <el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
                         </template>
                         <!-- 工艺工程师的按钮 -->
-                        <template v-else-if="isProcessEngineer">
+                        <template v-else-if="isApprovaler">
                             <el-button v-if="row.status == 1" type="text" @click="handleApprove(row)">审批</el-button>
                             <el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
                         </template>
@@ -139,6 +139,11 @@
         isProcessEngineer() {
             const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
             return userInfo.roleType == 3; // 3是工艺工程师
+        },
+        
+        isApprovaler() {
+            const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
+            return userInfo.roleType == 2; // 2是审批人
         }
     },
     created() {
diff --git a/laboratory/src/views/chemistQa/productApproval/index.vue b/laboratory/src/views/chemistQa/productApproval/index.vue
index d7594e2..5ef4fad 100644
--- a/laboratory/src/views/chemistQa/productApproval/index.vue
+++ b/laboratory/src/views/chemistQa/productApproval/index.vue
@@ -66,8 +66,8 @@
                             </template>
                             <el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
                         </template>
-                        <!-- 工艺工程师的按钮 -->
-                        <template v-else-if="isProcessEngineer">
+                        <!-- 工艺工程师的按钮 --修改为审批人-->
+                        <template v-else-if="isApprovaler">
                             <el-button v-if="row.status == 1" type="text" @click="handleApprove(row)">审批</el-button>
                             <el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
                         </template>
@@ -139,6 +139,10 @@
         isProcessEngineer() {
             const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
             return userInfo.roleType == 3; // 3是工艺工程师
+        },
+        isApprovaler() {
+            const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
+            return userInfo.roleType == 2; // 2是审批人
         }
     },
     created() {
diff --git a/laboratory/src/views/chemistQa/projectTesting/index.vue b/laboratory/src/views/chemistQa/projectTesting/index.vue
index 8a21ab7..3582a70 100644
--- a/laboratory/src/views/chemistQa/projectTesting/index.vue
+++ b/laboratory/src/views/chemistQa/projectTesting/index.vue
@@ -159,8 +159,8 @@
                                 <el-button v-if="currentType == 'list'" type="text"
                                     @click="handleDetail(row)">详情</el-button>
                             </template>
-                            <!-- 工艺工程师的操作按钮 -->
-                            <template v-else-if="isProcessEngineer">
+                            <!-- 工艺工程师的操作按钮  更改为审批人-->
+                            <template v-else-if="isApprovaler">
                                 <el-button v-if="row.status == 1" type="text" @click="handleApprove(row)">审核</el-button>
                                 <el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
                             </template>
diff --git a/laboratory/src/views/chemistQa/rawMaterials/index.vue b/laboratory/src/views/chemistQa/rawMaterials/index.vue
index 616902d..6eb0a73 100644
--- a/laboratory/src/views/chemistQa/rawMaterials/index.vue
+++ b/laboratory/src/views/chemistQa/rawMaterials/index.vue
@@ -66,8 +66,8 @@
                             </template>
                             <el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
                         </template>
-                        <!-- 工艺工程师的按钮 -->
-                        <template v-else-if="isProcessEngineer">
+                        <!-- 工艺工程师的按钮 -修改为审批人-->
+                        <template v-else-if="isApprovaler">
                             <el-button v-if="row.status == 1" type="text" @click="handleApprove(row)">审批</el-button>
                             <el-button v-else type="text" @click="handleDetail(row)">详情</el-button>
                         </template>
@@ -139,6 +139,10 @@
         isProcessEngineer() {
             const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
             return userInfo.roleType == 3; // 3是工艺工程师
+        },
+        isApprovaler() {
+            const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
+            return userInfo.roleType == 2; // 2是审批人
         }
     },
     created() {
diff --git a/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue b/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue
index bac62ef..df5f698 100644
--- a/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue
+++ b/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue
@@ -269,21 +269,20 @@
     handleSubmit() {
       this.$refs.form.validate((valid) => {
         if (valid) {
-          console.log('this.form.dataType',this.form.dataType,'this.photoList',this.photoList,'this.spectrumList',this.spectrumList)
-          if (
-            this.form.dataType.includes("1") &&
-            (!this.photoList || !this.photoList.length)
-          ) {
-            this.$message.error("请上传检测照片");
-            return;
-          }
-          if (
-            this.form.dataType.includes("2") &&
-            (!this.spectrumList || !this.spectrumList.length)
-          ) {
-            this.$message.error("请上传检测图谱");
-            return;
-          }
+          // if (
+          //   this.form.dataType.includes("1") &&
+          //   (!this.photoList || !this.photoList.length)
+          // ) {
+          //   this.$message.error("请上传检测照片");
+          //   return;
+          // }
+          // if (
+          //   this.form.dataType.includes("2") &&
+          //   (!this.spectrumList || !this.spectrumList.length)
+          // ) {
+          //   this.$message.error("请上传检测图谱");
+          //   return;
+          // }
           const submitData = {
             ...this.form,
             // 确保 dataType 在提交时转换为字符串
diff --git a/laboratory/src/views/dataManagement/originalRecordTest/list.vue b/laboratory/src/views/dataManagement/originalRecordTest/list.vue
index c708cd7..f174ded 100644
--- a/laboratory/src/views/dataManagement/originalRecordTest/list.vue
+++ b/laboratory/src/views/dataManagement/originalRecordTest/list.vue
@@ -56,7 +56,6 @@
       <template #table>
         <el-table-column prop="projectName" label="所属项目课题方案"></el-table-column>
         <el-table-column prop="originalCode" label="原始检验记录编号"></el-table-column>
-
         <el-table-column prop="experimentCode" label="所属实验编号"></el-table-column>
         <el-table-column prop="experimentName" label="实验名称"></el-table-column>
         <el-table-column prop="termCode" label="检测项编号"></el-table-column>
diff --git a/laboratory/src/views/dataManagement/originalRecordTest/service.js b/laboratory/src/views/dataManagement/originalRecordTest/service.js
index 4fc53e7..ea1b8ff 100644
--- a/laboratory/src/views/dataManagement/originalRecordTest/service.js
+++ b/laboratory/src/views/dataManagement/originalRecordTest/service.js
@@ -13,3 +13,4 @@
 export const update = (data) => {
   return axios.post('/api/t-test-method-confirm-sheet-original/update', { ...data })
 }
+// 1947497725527871489
\ No newline at end of file
diff --git a/laboratory/src/views/dataManagement/sampleSubmissionList/components/receiveConfirmDialog.vue b/laboratory/src/views/dataManagement/sampleSubmissionList/components/receiveConfirmDialog.vue
index 2f84106..6056c3b 100644
--- a/laboratory/src/views/dataManagement/sampleSubmissionList/components/receiveConfirmDialog.vue
+++ b/laboratory/src/views/dataManagement/sampleSubmissionList/components/receiveConfirmDialog.vue
@@ -8,10 +8,44 @@
     @close="handleClose"
   >
     <div class="receive-dialog">
+      <!-- 人员选择区域 -->
+      <div class="personnel-selection" v-if="personnelList.length > 0">
+        <div class="personnel-table">
+          <el-table
+            ref="personnelTable"
+            :data="personnelList"
+            style="width: 100%"
+            border
+            size="small"
+            @row-click="handlePersonnelRowClick"
+            :row-class-name="getPersonnelRowClassName"
+            @selection-change="handleSelectionChange"
+          >
+            <el-table-column type="index" width="55" align="center" label="编号"></el-table-column>
+            <el-table-column prop="nickName" label="化验师姓名" min-width="120" align="center">
+              <template slot-scope="scope">
+                <span>{{ scope.row.nickName }}</span>
+              </template>
+            </el-table-column>
+            <el-table-column prop="id" label="操作" min-width="120" align="center">
+              <template slot-scope="scope">
+                <!-- <el-radio v-model="selectedPersonnelId" :label="scope.row.nickName"></el-radio> -->
+                <el-checkbox :value="selectedPersonnelId ==scope.row.id"></el-checkbox>
+              </template>
+            </el-table-column>
+            <!-- <el-table-column prop="id" label="人员ID" min-width="120" align="center">
+              <template slot-scope="scope">
+                <span>{{ scope.row.id }}</span>
+              </template>
+            </el-table-column> -->
+          </el-table>
+        </div>
+      </div>
+
       <div class="receive-tip">
         您已选中 <span class="sample-count">{{ sampleCount }}</span> 条样品发送,请签字确认
       </div>
-      
+
       <div class="approval-dialog-approve">
         <div class="add-group">
           <div>*</div>
@@ -29,7 +63,7 @@
 
     <div slot="footer" class="dialog-footer select-member-footer">
       <el-button @click="handleClose">取 消</el-button>
-      <el-button type="primary" @click="handleConfirm" :disabled="!imgSrc">
+      <el-button type="primary" @click="handleConfirm" :disabled="!selectedPersonnelId || !imgSrc">
         确认发送
       </el-button>
     </div>
@@ -61,11 +95,19 @@
       type: Number,
       default: 1,
     },
+    personnelList: {
+      type: Array,
+      default: () => [],
+      validator: (value) => {
+        return value.every(item => item.id && item.nickName)
+      }
+    },
   },
   data() {
     return {
       signatureDialogVisible: false,
       imgSrc: "",
+      selectedPersonnelId: null,
     };
   },
   methods: {
@@ -91,13 +133,45 @@
         this.imgSrc = imageData;
       });
     },
+    handlePersonnelRowClick(row, column, event) {
+      // 当点击表格行时,设置为选中状态
+      this.$refs.personnelTable.clearSelection();
+      this.$refs.personnelTable.toggleRowSelection(row);
+      this.selectedPersonnelId = row.id;
+    },
+    getPersonnelRowClassName({ row }) {
+      // 根据是否选中来设置行样式
+      return row.id === this.selectedPersonnelId ? 'selected-personnel' : '';
+    },
+    handleSelectionChange(selection) {
+      // 当radio选择改变时,更新选中的人员
+      if (selection && selection.id) {
+        this.selectedPersonnelId = selection.id;
+      } else {
+        this.selectedPersonnelId = null;
+      }
+    },
     handleConfirm() {
+      if (!this.selectedPersonnelId) {
+        this.$message.warning("请先选择接收人员");
+        return;
+      }
       if (!this.imgSrc) {
         this.$message.warning("请先完成签名确认");
         return;
       }
-      this.$emit("confirm", this.imgSrc);
+      
+      this.$emit("confirm", {
+        personnelId: this.selectedPersonnelId,
+        personnelName: this.personnelList.find(p => p.id === this.selectedPersonnelId)?.name || '',
+        imgSrc: this.imgSrc
+      });
       this.handleClose();
+    },
+    handleClose() {
+      this.$emit("update:visible", false);
+      this.imgSrc = "";
+      this.selectedPersonnelId = null; // 清空选中的人员
     },
   },
 };
@@ -151,6 +225,56 @@
   }
 }
 
+.personnel-selection {
+  margin-bottom: 20px;
+}
+
+.personnel-table {
+  padding-left: 25px;
+  margin-bottom: 19px;
+
+  ::v-deep .el-table {
+    border-radius: 4px;
+
+    .el-table__header-wrapper {
+      thead {
+        th {
+          background-color: #f5f7fa;
+          color: #606266;
+          font-weight: 500;
+          font-size: 13px;
+          border-color: #ebeef5;
+        }
+      }
+    }
+
+    .el-table__body-wrapper {
+      tbody {
+        td {
+          border-color: #ebeef5;
+          font-size: 13px;
+
+          &.cell {
+            padding: 8px 0;
+          }
+        }
+
+        .selected-personnel {
+          background-color: #ecf5ff;
+        }
+
+        tr:hover {
+          background-color: #f5f7fa;
+        }
+
+        tr.selected-personnel:hover {
+          background-color: #ecf5ff;
+        }
+      }
+    }
+  }
+}
+
 .dialog-footer {
   align-items: center;
   display: flex;
diff --git a/laboratory/src/views/dataManagement/sampleSubmissionList/submission.vue b/laboratory/src/views/dataManagement/sampleSubmissionList/submission.vue
index 9ebb062..cf6a8da 100644
--- a/laboratory/src/views/dataManagement/sampleSubmissionList/submission.vue
+++ b/laboratory/src/views/dataManagement/sampleSubmissionList/submission.vue
@@ -4,15 +4,43 @@
       <img src="@/assets/public/headercard.png" />
       <div>所属实验调度</div>
     </div>
-    <Table :data="schedulingData" :total="0" :height="null" >
+    <Table :data="schedulingData" :total="0" :height="null">
       <template>
-        <el-table-column prop="projectName" label="所属项目课题方案" width="200"></el-table-column>
-        <el-table-column prop="experimentCode" label="实验编号" width="200"></el-table-column>
-        <el-table-column prop="experimentName" label="实验名称" width="200"></el-table-column>
-        <el-table-column prop="experimentDate" label="通知时间" width="200"></el-table-column>
-        <el-table-column prop="experimentStartTime" label="实验开始时间" width="200"></el-table-column>
-        <el-table-column prop="experimentEndTime" label="实验结束时间" width="200"></el-table-column>
-        <el-table-column prop="participantsName" label="参加人员" width="200"></el-table-column>
+        <el-table-column
+          prop="projectName"
+          label="所属项目课题方案"
+          width="200"
+        ></el-table-column>
+        <el-table-column
+          prop="experimentCode"
+          label="实验编号"
+          width="200"
+        ></el-table-column>
+        <el-table-column
+          prop="experimentName"
+          label="实验名称"
+          width="200"
+        ></el-table-column>
+        <el-table-column
+          prop="experimentDate"
+          label="通知时间"
+          width="200"
+        ></el-table-column>
+        <el-table-column
+          prop="experimentStartTime"
+          label="实验开始时间"
+          width="200"
+        ></el-table-column>
+        <el-table-column
+          prop="experimentEndTime"
+          label="实验结束时间"
+          width="200"
+        ></el-table-column>
+        <el-table-column
+          prop="participantsName"
+          label="参加人员"
+          width="200"
+        ></el-table-column>
         <el-table-column prop="status" label="状态" width="150">
           <template slot-scope="scope">
             <el-tag :type="getStatusType(scope.row.status)">
@@ -36,49 +64,142 @@
           {{ showAdditives ? "收起辅料详情" : "展开辅料详情" }}
         </el-button>
       </div>
-      <div class="sample-code">取样单编号:{{ form.sampleCode || 'DD-25010BS01' }}</div>
-      
+      <div class="sample-code">
+        取样单编号:{{ form.sampleCode || "DD-25010BS01" }}
+      </div>
+
       <div class="sample-table">
         <div class="table-header">
-          <el-button type="primary" class="batch-send" @click="handleBatchSend">批量发送</el-button>
+          <el-button type="primary" class="batch-send" @click="handleBatchSend"
+            >批量发送</el-button
+          >
         </div>
-        <Table :data="sampleList" :total="sampleTotal" :height="null"
-         @selection-change="handleSelectionChange">
+        <Table
+          :data="sampleList"
+          :total="sampleTotal"
+          :height="null"
+          @selection-change="handleSelectionChange"
+        >
           <template>
-            <el-table-column type="selection" width="55" :selectable="isSelectable"></el-table-column>
-            <el-table-column type="index"  label="序号" width="80"></el-table-column>
-            <el-table-column prop="processTime" label="工艺时间" width="120"></el-table-column>
-            <el-table-column prop="samplingName" label="取样名称" width="150"></el-table-column>
-            <el-table-column prop="sampleCode" label="取样样品编号" width="150"></el-table-column>
-            <el-table-column prop="temperature" label="温度" width="100"></el-table-column>
-            <el-table-column prop="samplePh" label="PH" width="100"></el-table-column>
-            <el-table-column prop="waterAddition" label="加水量" width="100"></el-table-column>
+            <el-table-column
+              type="selection"
+              width="55"
+              :selectable="isSelectable"
+            ></el-table-column>
+            <el-table-column
+              type="index"
+              label="序号"
+              width="80"
+            ></el-table-column>
+            <el-table-column
+              prop="processTime"
+              label="工艺时间"
+              width="120"
+            ></el-table-column>
+            <el-table-column
+              prop="samplingName"
+              label="取样名称"
+              width="150"
+            ></el-table-column>
+            <el-table-column
+              prop="sampleCode"
+              label="取样样品编号"
+              width="150"
+            ></el-table-column>
+            <el-table-column
+              prop="temperature"
+              label="温度"
+              width="100"
+            ></el-table-column>
+            <el-table-column
+              prop="samplePh"
+              label="PH"
+              width="100"
+            ></el-table-column>
+            <el-table-column
+              prop="waterAddition"
+              label="加水量"
+              width="100"
+            ></el-table-column>
             <template v-if="showAdditives">
-              <el-table-column prop="addAuxiliaryOne" label="加辅1" width="150"></el-table-column>
-              <el-table-column prop="addAuxiliaryTwo" label="加辅2" width="150"></el-table-column>
-              <el-table-column prop="addAuxiliaryThree" label="加辅3" width="150"></el-table-column>
-              <el-table-column prop="addAuxiliaryFour" label="加辅4" width="150"></el-table-column>
-              <el-table-column prop="addAuxiliaryFive" label="加辅5" width="150"></el-table-column>
-              <el-table-column prop="addAuxiliarySix" label="加辅6" width="150"></el-table-column>
-              <el-table-column prop="addAuxiliarySeven" label="加辅7" width="150"></el-table-column>
-              <el-table-column prop="addAuxiliaryEight" label="加辅8" width="150"></el-table-column>
-              <el-table-column prop="addAuxiliaryNine" label="加辅9" width="150"></el-table-column>
-              <el-table-column prop="addAuxiliaryTen" label="加辅10" width="150"></el-table-column>
+              <el-table-column
+                prop="addAuxiliaryOne"
+                label="加辅1"
+                width="150"
+              ></el-table-column>
+              <el-table-column
+                prop="addAuxiliaryTwo"
+                label="加辅2"
+                width="150"
+              ></el-table-column>
+              <el-table-column
+                prop="addAuxiliaryThree"
+                label="加辅3"
+                width="150"
+              ></el-table-column>
+              <el-table-column
+                prop="addAuxiliaryFour"
+                label="加辅4"
+                width="150"
+              ></el-table-column>
+              <el-table-column
+                prop="addAuxiliaryFive"
+                label="加辅5"
+                width="150"
+              ></el-table-column>
+              <el-table-column
+                prop="addAuxiliarySix"
+                label="加辅6"
+                width="150"
+              ></el-table-column>
+              <el-table-column
+                prop="addAuxiliarySeven"
+                label="加辅7"
+                width="150"
+              ></el-table-column>
+              <el-table-column
+                prop="addAuxiliaryEight"
+                label="加辅8"
+                width="150"
+              ></el-table-column>
+              <el-table-column
+                prop="addAuxiliaryNine"
+                label="加辅9"
+                width="150"
+              ></el-table-column>
+              <el-table-column
+                prop="addAuxiliaryTen"
+                label="加辅10"
+                width="150"
+              ></el-table-column>
             </template>
-            <el-table-column prop="sampleAmount" label="取样量" width="100"></el-table-column>
+            <el-table-column
+              prop="sampleAmount"
+              label="取样量"
+              width="100"
+            ></el-table-column>
             <el-table-column prop="pictures" label="拍照" width="100">
               <template slot-scope="scope">
                 <el-image
-                  v-for="(url, index) in scope.row.pictures.split(',')" 
+                  v-for="(url, index) in scope.row.pictures.split(',')"
                   :key="index"
                   :src="getFullUrl(url)"
                   :preview-src-list="[getFullUrl(url)]"
-                  style="width: 50px; height: 50px;"
+                  style="width: 50px; height: 50px"
                 />
               </template>
             </el-table-column>
-            <el-table-column prop="handlePersonName" label="操作人员" width="100"></el-table-column>
-            <el-table-column prop="status" label="状态" width="100" fixed="right">
+            <el-table-column
+              prop="handlePersonName"
+              label="操作人员"
+              width="100"
+            ></el-table-column>
+            <el-table-column
+              prop="status"
+              label="状态"
+              width="100"
+              fixed="right"
+            >
               <template slot-scope="scope">
                 <el-tag :type="getSampleStatusType(scope.row.status)">
                   {{ getSampleStatusText(scope.row.status) }}
@@ -87,7 +208,12 @@
             </el-table-column>
             <el-table-column label="操作" width="100" fixed="right">
               <template slot-scope="scope">
-                <el-button type="text" @click="handleSend(scope.row)" v-if="scope.row.status == '1'">发送</el-button>
+                <el-button
+                  type="text"
+                  @click="handleSend(scope.row)"
+                  v-if="scope.row.status == '1'"
+                  >发送</el-button
+                >
               </template>
             </el-table-column>
           </template>
@@ -98,20 +224,26 @@
     <receive-confirm-dialog
       :visible.sync="showReceiveConfirm"
       :sample-count="selectedSamples.length"
+      :personnelList="peopleList"
       @confirm="confirmSend"
     />
   </Card>
 </template>
 
 <script>
-import ReceiveConfirmDialog from './components/receiveConfirmDialog.vue'
-import { getDetail, commitRecord, batchSendSamples, sendSample } from './service'
-import {getFullUrl} from '@/utils/utils'
+import ReceiveConfirmDialog from "./components/receiveConfirmDialog.vue";
+import {
+  getDetail,
+  commitRecord,
+  batchSendSamples,
+  sendSample,
+} from "./service";
+import { getFullUrl } from "@/utils/utils";
 
 export default {
   name: "SampleSubmission",
   components: {
-    ReceiveConfirmDialog
+    ReceiveConfirmDialog,
   },
   data() {
     return {
@@ -127,27 +259,28 @@
       sampleTotal: 0,
       selectedSamples: [],
       statusTypeMap: {
-        '-1': 'info',
-        '1': 'warning',
-        '2': 'success',
-        '3': 'info'
+        "-1": "info",
+        1: "warning",
+        2: "success",
+        3: "info",
       },
       statusTextMap: {
-        '-1': '草稿箱',
-        '1': '待提交',
-        '2': '已提交',
-        '3': '已封存'
+        "-1": "草稿箱",
+        1: "待提交",
+        2: "已提交",
+        3: "已封存",
       },
       sampleStatusTypeMap: {
-        '1': 'warning',
-        '2': 'info',
-        '3': 'success'
+        1: "warning",
+        2: "info",
+        3: "success",
       },
       sampleStatusTextMap: {
-        '1': '待发送',
-        '2': '待接收',
-        '3': '已接收'
-      }
+        1: "待发送",
+        2: "待接收",
+        3: "已接收",
+      },
+      peopleList: [],
     };
   },
   created() {
@@ -156,20 +289,25 @@
       this.getDetailData();
     }
   },
-  methods: {getFullUrl,
+  methods: {
+    getFullUrl,
     async getDetailData() {
       try {
         const res = await getDetail({ id: this.id });
         if (res) {
           this.schedulingData = [res.experimentDispatch] || [];
+          this.peopleList =
+            (res.experimentDispatch &&
+              res.experimentDispatch.experimentDispatchParticipantChemists) ||
+            [];
           this.schedulingTotal = this.schedulingData.length;
-          this.form.sampleCode = res.samplingCode || '';
+          this.form.sampleCode = res.samplingCode || "";
           this.sampleList = res.samplingRecordOperations || [];
           this.sampleTotal = this.sampleList.length;
         }
       } catch (error) {
-        console.error('获取详情失败:', error);
-        this.$message.error('获取详情失败');
+        console.error("获取详情失败:", error);
+        this.$message.error("获取详情失败");
       }
     },
     handleSelectionChange(selection) {
@@ -181,49 +319,57 @@
     },
     async handleBatchSend() {
       if (this.selectedSamples.length == 0) {
-        this.$message.warning('请先选择要发送的样品');
+        this.$message.warning("请先选择要发送的样品");
         return;
       }
       this.showReceiveConfirm = true;
     },
-    async confirmSend(signature) {
+    async confirmSend(params) {
       try {
-        const recordOperationIds = this.selectedSamples.map(item => item.id);
-        const res = await batchSendSamples({ 
-          recordOperationId: recordOperationIds,
-          sendSign: signature
+        let recordOperationIds = [];
+        this.selectedSamples.forEach((item) => {
+          recordOperationIds.push({
+            id: item.id,
+            sendSign: params.imgSrc,
+            receiptsPersonId: params.personnelId,
+          });
+        });
+        const res = await batchSendSamples({
+          recordOperationList:recordOperationIds
         });
 
         if (res.code == 200) {
-          this.$message.success(`成功发送 ${this.selectedSamples.length} 个样品`);
+          this.$message.success(
+            `成功发送 ${this.selectedSamples.length} 个样品`
+          );
           this.selectedSamples = [];
           this.showReceiveConfirm = false;
           // 刷新数据
           this.getDetailData();
         } else {
-          this.$message.error(res.msg || '发送失败');
+          this.$message.error(res.msg || "发送失败");
         }
       } catch (error) {
-        console.error('发送失败:', error);
-        this.$message.error('发送失败');
+        console.error("发送失败:", error);
+        this.$message.error("发送失败");
       }
     },
     getStatusType(status) {
-      return this.statusTypeMap[status] || 'info';
+      return this.statusTypeMap[status] || "info";
     },
     getStatusText(status) {
-      return this.statusTextMap[status] || '未知状态';
+      return this.statusTextMap[status] || "未知状态";
     },
     isSelectable(row) {
-      return row.status == '1';
+      return row.status == "1";
     },
     getSampleStatusType(status) {
-      return this.sampleStatusTypeMap[status] || 'info';
+      return this.sampleStatusTypeMap[status] || "info";
     },
     getSampleStatusText(status) {
-      return this.sampleStatusTextMap[status] || '未知状态';
+      return this.sampleStatusTextMap[status] || "未知状态";
     },
-  }
+  },
 };
 </script>
 
@@ -239,7 +385,8 @@
     height: 19px;
   }
 
-  div, span {
+  div,
+  span {
     flex-shrink: 0;
     font-weight: bold;
     font-size: 18px;
@@ -264,7 +411,7 @@
     font-family: PingFangSC, PingFang SC;
     font-weight: 400;
     font-size: 14px;
-    color: rgba(0,0,0,0.88);
+    color: rgba(0, 0, 0, 0.88);
     margin: 20px 0;
   }
 
diff --git a/laboratory/src/views/dataManagement/schemeManagement/addPlan.vue b/laboratory/src/views/dataManagement/schemeManagement/addPlan.vue
index ab8bbfa..2f41653 100644
--- a/laboratory/src/views/dataManagement/schemeManagement/addPlan.vue
+++ b/laboratory/src/views/dataManagement/schemeManagement/addPlan.vue
@@ -569,18 +569,18 @@
           formData.experimentMaterial = JSON.stringify(
             this.form.experimentMaterial
           );
-
           // 编辑模式下添加id参数
           if (this.editId) {
             formData.id = this.editId;
           }
 
           // 根据是否为编辑模式调用不同接口
-          const apiCall = (this.editId && !this.isEdit)
-            ? update(formData)
-            : this.isEdit
-            ? updateTester(formData)
-            : add(formData);
+          const apiCall =
+            this.editId && !this.isEdit
+              ? update(formData)
+              : this.isEdit
+              ? updateTester(formData)
+              : add(formData);
 
           apiCall
             .then((res) => {
@@ -589,10 +589,10 @@
                   status === 1 ? "保存成功" : "草稿保存成功"
                 );
                 this.$router.back();
-      this.$store.commit(
-        "SET_TAGLIST",
-        this.tagList.filter((item) => item.path !== this.$route.path)
-      );
+                this.$store.commit(
+                  "SET_TAGLIST",
+                  this.tagList.filter((item) => item.path !== this.$route.path)
+                );
               } else {
                 this.$message.error(
                   res.msg || (status === 1 ? "保存失败" : "草稿保存失败")
@@ -660,14 +660,40 @@
       function checkDynamicComponentTables(list, label) {
         if (!Array.isArray(list)) return true;
         for (const comp of list) {
-          if (comp.type === 'customTable') {
-            if (!comp.data || !Array.isArray(comp.data.headers) || comp.data.headers.length === 0) {
+          console.log(
+            "校验 DynamicComponent 里的表格 校验 DynamicComponent 里的表格",
+            comp
+          );
+          if (comp.type === "customTable") {
+            if (
+              !comp.data ||
+              !Array.isArray(comp.data.headers) ||
+              comp.data.headers.length === 0
+            ) {
               this.$message.error(`${label}中有表格未添加表头`);
               return false;
             }
             if (!Array.isArray(comp.data.rows) || comp.data.rows.length === 0) {
               this.$message.error(`${label}中有表格未添加数据`);
               return false;
+            }
+            if (this.userRole != 3) {
+              let status = true;
+              let errText=[]
+              comp.data.headers.forEach((header, index) => {
+                if ( header.required==true || header.required=="true" ) {
+                  comp.data.rows.forEach((row, rowIndex) => {
+                    if(!row[header.name]){
+                      status = false;
+                      errText.push(`${label}的第${rowIndex + 1}条数据的${header.name}未填写`) 
+                    }
+                  });
+                }
+              });
+              if(!status){
+                this.$message.error( errText.join(';') );
+              }
+              return status;
             }
           }
         }
@@ -678,7 +704,13 @@
         this.$message.error("请添加实验材料");
         return false;
       }
-      if (!checkDynamicComponentTables.call(this, this.form.experimentMaterial, '实验材料')) {
+      if (
+        !checkDynamicComponentTables.call(
+          this,
+          this.form.experimentMaterial,
+          "实验材料"
+        )
+      ) {
         return false;
       }
       // 校验实验设备
@@ -686,7 +718,13 @@
         this.$message.error("请添加实验设备");
         return false;
       }
-      if (!checkDynamicComponentTables.call(this, this.form.experimentDevice, '实验设备')) {
+      if (
+        !checkDynamicComponentTables.call(
+          this,
+          this.form.experimentDevice,
+          "实验设备"
+        )
+      ) {
         return false;
       }
       // 校验实验步骤记录
@@ -701,7 +739,13 @@
           this.$message.error(`请完善第${i + 1}个步骤的内容`);
           return false;
         }
-        if (!checkDynamicComponentTables.call(this, step.content, `第${i + 1}个步骤`)) {
+        if (
+          !checkDynamicComponentTables.call(
+            this,
+            step.content,
+            `第${i + 1}个步骤`
+          )
+        ) {
           return false;
         }
       }
@@ -776,18 +820,20 @@
           } catch (err) {
             console.error("获取组别列表失败:", err);
           }
-          getParticipantsByDispatchId({ dispatchId: data.experimentDispatch.id })
-          .then((res) => {
-            if (res) {
-              this.participantsData = res || [];
-            } else {
-              this.$message.error(res.msg || "获取参加人员列表失败");
-            }
+          getParticipantsByDispatchId({
+            dispatchId: data.experimentDispatch.id,
           })
-          .catch((err) => {
-            this.$message.error("获取参加人员列表失败");
-            console.error("获取参加人员列表失败:", err);
-          });
+            .then((res) => {
+              if (res) {
+                this.participantsData = res || [];
+              } else {
+                this.$message.error(res.msg || "获取参加人员列表失败");
+              }
+            })
+            .catch((err) => {
+              this.$message.error("获取参加人员列表失败");
+              console.error("获取参加人员列表失败:", err);
+            });
         }
 
         // 填充参与人员
@@ -1202,14 +1248,18 @@
   margin-bottom: 20px;
   width: 95%;
   display: flex;
+
   .content-box-left {
     flex: 1;
+
     div {
       padding: 10px 0;
     }
   }
+
   .content-box-right {
     flex: 1;
+
     div {
       padding: 10px 0;
     }
diff --git a/laboratory/src/views/dataManagement/testResultReport/components/record-detail.vue b/laboratory/src/views/dataManagement/testResultReport/components/record-detail.vue
new file mode 100644
index 0000000..8773af7
--- /dev/null
+++ b/laboratory/src/views/dataManagement/testResultReport/components/record-detail.vue
@@ -0,0 +1,756 @@
+<template>
+  <div>
+    <el-dialog
+      title="原始检验记录详情"
+      :visible="dialogVisible"
+      width="90%"
+      top="5vh"
+      :close-on-click-modal="false"
+      @close="handleClose"
+    >
+      <div class="approval-content">
+        <el-form
+          ref="form"
+          :model="form"
+          :rules="rules"
+          inline
+          label-position="top"
+        >
+          <div style="padding-left: 25px">
+            <el-form-item prop="originalCode" label="原始检验记录编号">
+              <el-input
+                v-model="form.originalCode"
+                placeholder="请输入"
+                disabled
+              />
+            </el-form-item>
+          </div>
+
+          <div class="header-title" style="margin-bottom: 38px">
+            <div class="header-title-left">
+              <img src="@/assets/public/headercard.png" />
+              <span>检测项信息</span>
+            </div>
+          </div>
+          <div style="padding-left: 25px">
+            <el-form-item prop="termName" label="检测项名字">
+              <el-input v-model="form.termName" placeholder="请输入" disabled />
+            </el-form-item>
+            <el-form-item prop="termCode" label="检测项编号">
+              <el-input v-model="form.termCode" placeholder="请输入" disabled />
+            </el-form-item>
+            <el-form-item prop="termMethod" label="检测方法名字">
+              <el-input
+                v-model="form.termMethod"
+                placeholder="请输入"
+                disabled
+              />
+            </el-form-item>
+            <el-form-item prop="termMethodCode" label="检测方法编号">
+              <el-input
+                v-model="form.termMethodCode"
+                placeholder="请输入"
+                disabled
+              />
+            </el-form-item>
+          </div>
+
+          <div class="header-title" style="margin-bottom: 38px">
+            <div class="header-title-left">
+              <img src="@/assets/public/headercard.png" />
+              <div>一 、检测标准</div>
+            </div>
+          </div>
+          <AiEditor
+            ref="standardEditor"
+            :value="editorContents.termStandard"
+            height="400px"
+            style="margin: 20px 0"
+            placeholder="请输入检测标准..."
+            :readOnly="isDetail"
+          />
+
+          <div class="header-title" style="margin-bottom: 38px">
+            <div class="header-title-left">
+              <img src="@/assets/public/headercard.png" />
+              <div>二 、检测仪器</div>
+            </div>
+          </div>
+          <AiEditor
+            ref="instrumentEditor"
+            :value="editorContents.termInstrument"
+            height="400px"
+            style="margin: 20px 0"
+            placeholder="请输入检测仪器..."
+            :readOnly="isDetail"
+          />
+
+          <div class="header-title" style="margin-bottom: 38px">
+            <div class="header-title-left">
+              <img src="@/assets/public/headercard.png" />
+              <div>三 、检测试剂</div>
+            </div>
+          </div>
+          <AiEditor
+            ref="reagentEditor"
+            :value="editorContents.termReagent"
+            height="400px"
+            style="margin: 20px 0"
+            placeholder="请输入检测试剂..."
+            :readOnly="isDetail"
+          />
+
+          <div class="header-title" style="margin-bottom: 38px">
+            <div class="header-title-left">
+              <img src="@/assets/public/headercard.png" />
+              <div>四 、检测步骤</div>
+            </div>
+          </div>
+          <AiEditor
+            ref="stepsEditor"
+            :value="editorContents.termStep"
+            height="400px"
+            style="margin: 20px 0"
+            placeholder="请输入检测步骤..."
+            :readOnly="isDetail"
+          />
+
+          <div class="header-title" style="margin-bottom: 38px">
+            <div class="header-title-left">
+              <img src="@/assets/public/headercard.png" />
+              <div>五 、检测数据及参照</div>
+            </div>
+            <el-button
+              v-if="!isDetail"
+              type="primary"
+              class="el-icon-plus"
+              @click="handleAddTask"
+              >添加检测数据</el-button
+            >
+          </div>
+
+          <Table
+            :data="taskTableData"
+            :total="allTaskTableData.length"
+            :height="null"
+            :queryForm="{ pageNum: currentPage, pageSize: pageSize }"
+            :disAblePagination="true"
+            @handleCurrentChange="handleCurrentChange"
+            class="rwuTable"
+          >
+            <el-table-column
+              type="index"
+              label="序号"
+              width="80"
+            ></el-table-column>
+            <el-table-column
+              prop="sampleCode"
+              label="检测样编号"
+            ></el-table-column>
+            <el-table-column prop="testData" label="检测数据"></el-table-column>
+            <el-table-column
+              prop="createTime"
+              label="检测时间"
+              width="180"
+            ></el-table-column>
+            <el-table-column label="检测图片" width="200">
+              <template slot-scope="scope">
+                <div
+                  class="image-preview"
+                  v-if="scope.row.photos && scope.row.photos.length"
+                >
+                  <el-image
+                    v-for="(photo, index) in scope.row.photos"
+                    :key="index"
+                    :src="photo.url"
+                    :preview-src-list="getPhotoUrls(scope.row.photos)"
+                    fit="cover"
+                    class="preview-image"
+                  >
+                    <div slot="error" class="image-slot">
+                      <i class="el-icon-picture-outline"></i>
+                    </div>
+                  </el-image>
+                </div>
+                <span v-else>无图片</span>
+              </template>
+            </el-table-column>
+            <el-table-column label="检测图谱" width="200">
+              <template slot-scope="scope">
+                <div v-if="scope.row.spectrums && scope.row.spectrums.length">
+                  <el-link
+                    v-for="(spectrum, index) in scope.row.spectrums"
+                    :key="index"
+                    type="primary"
+                    :href="spectrum.url"
+                    target="_blank"
+                    class="spectrum-link"
+                  >
+                    {{ spectrum.name }}
+                  </el-link>
+                </div>
+                <span v-else>无图谱</span>
+              </template>
+            </el-table-column>
+
+            <!-- <el-table-column v-if="!isDetail" label="操作" width="150">
+              <template slot-scope="scope">
+                <el-button type="text" @click="handleEditTask(scope.row)"
+                  >编辑</el-button
+                >
+                <el-button type="text" @click="handleDeleteTask(scope.row)"
+                  >删除</el-button
+                >
+              </template>
+            </el-table-column> -->
+          </Table>
+
+          <div class="header-title">
+            <div class="header-title-left">
+              <img src="@/assets/public/headercard.png" />
+              <div>六 、检测结果运算</div>
+            </div>
+          </div>
+          <AiEditor
+            ref="resultCalculationEditor"
+            :value="editorContents.termResult"
+            height="400px"
+            style="margin: 20px 0"
+            placeholder="请输入检测结果运算..."
+            :readOnly="isDetail"
+          />
+          <Table
+            :data="taskTableData"
+            :total="allTaskTableData.length"
+            :height="null"
+            class="rwuTable"
+            :queryForm="{ pageNum: currentPage, pageSize: pageSize }"
+            :disAblePagination="true"
+            @handleCurrentChange="handleCurrentChange"
+          >
+            <el-table-column
+              type="index"
+              label="序号"
+              width="80"
+            ></el-table-column>
+            <el-table-column
+              prop="sampleCode"
+              label="检测样编号"
+            ></el-table-column>
+            <el-table-column prop="testData" label="检测数据"></el-table-column>
+            <el-table-column label="检测结果">
+              <template slot-scope="scope">
+                <el-input
+                  v-model="scope.row.resultText"
+                  placeholder="请输入检测结果"
+                  :disabled="isDetail"
+                ></el-input>
+              </template>
+            </el-table-column>
+          </Table>
+        </el-form>
+      </div>
+    </el-dialog>
+  </div>
+</template>
+
+<script>
+import AiEditor from "@/components/AiEditor";
+import { getExperimentDetail, getRecordDetail } from "../service";
+import moment from 'moment'
+import { mapState } from "vuex";
+
+export default {
+  name: "ApprovalDialog",
+  components: {
+    AiEditor,
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false,
+    },
+    type: {
+      type: String,
+      default: "approve", // approve-审批,view-查看
+    },
+    data: {
+      type: Object,
+      default: () => ({}),
+    },
+  },
+  data() {
+    return {
+
+      isDetail: true,
+      dialogVisible: false,
+      form: {
+        id: '',
+        originalCode: '',
+        termName: '',
+        termCode: '',
+        termMethod: '',
+        termMethodCode: '',
+        status: 1,
+        termStandard: '',
+        termInstrument: '',
+        termReagent: '',
+        termStep: '',
+        termResult: ''
+      },
+      editorContents: {
+        termStandard: '',
+        termInstrument: '',
+        termReagent: '',
+        termStep: '',
+        termResult: ''
+      },
+      rules: {
+        termName: [{ required: true, message: "请输入检测项名字", trigger: "blur" }],
+        termCode: [{ required: true, message: "请输入检测项编号", trigger: "blur" }],
+        experimentName: [{ required: true, message: "请输入检测方法名字", trigger: "blur" }],
+        experimentCode: [{ required: true, message: "请输入检测方法编号", trigger: "blur" }]
+      },
+      currentPage: 1,
+      pageSize: 15,
+      allTaskTableData: [],
+      taskTableData: [],
+    };
+  },
+  watch: {
+    visible: {
+      handler(val) {
+        this.dialogVisible = val;
+        if (val && this.data && this.data.id) {
+          console.log('111111111111111111',this.data.id)
+          // 弹窗打开时,确保数据已获取
+          this.getDetail(this.data.id);
+        }
+      },
+      immediate: true,
+    },
+  },
+  methods: {
+    getPhotoUrls(photos) {
+      return photos.map(photo => photo.url);
+    },
+    updateTableData() {
+      const start = (this.currentPage - 1) * this.pageSize;
+      const end = this.currentPage * this.pageSize;
+      this.taskTableData = this.allTaskTableData.slice(start, end);
+    },
+    handleCurrentChange(page) {
+      this.currentPage = page;
+      this.updateTableData();
+    },
+    handleClose() {
+      this.$emit('update:visible', false);
+    },
+    // 获取详情
+    getDetail(id) {
+      if (id) {
+        getRecordDetail({ id }).then(res => {
+          if (res) {
+            const data = res;
+            // 设置表单数据
+            this.form = {
+              ...data,
+              termCode: data.testMethodConfirmSheetTerm.termCode || '',
+              termName: data.testMethodConfirmSheetTerm.termName || '',
+              termMethod: data.testMethodConfirmSheetTerm.termMethod || '',
+              termMethodCode: data.testMethodConfirmSheetTerm.termMethodCode || '',
+              termStandard: data.termStandard || '',
+              termInstrument: data.termInstrument || '',
+              termReagent: data.termReagent || '',
+              termStep: data.termStep || '',
+              termResult: data.termResult || ''
+            };
+            // 设置编辑器内容
+            this.editorContents = {
+              termStandard: data.termStandard || '',
+              termInstrument: data.termInstrument || '',
+              termReagent: data.termReagent || '',
+              termStep: data.termStep || '',
+              termResult: data.termResult || ''
+            };
+            // 设置检测数据表格
+            if (data.testMethodConfirmSheetOriginalDataList && data.testMethodConfirmSheetOriginalDataList.length > 0) {
+              this.allTaskTableData = data.testMethodConfirmSheetOriginalDataList.map(item => ({
+                sampleCode: item.dataCode || '',
+                testData: item.dataTitle || '',
+                resultText: item.resultText || '',
+                photos: item.dataPictures ? item.dataPictures.split(',').map(url => ({ url })) : [],
+                spectrums: item.dataFiles ? JSON.parse(item.dataFiles) : [],
+                createTime: item.createTime || moment().format('YYYY-MM-DD HH:mm:ss')
+              }));
+            } else {
+              this.allTaskTableData = [];
+            }
+            this.currentPage = 1;
+            this.updateTableData();
+          }
+        }).catch(err => {
+          console.error('获取详情失败:', err);
+          this.$message.error('获取详情失败');
+        });
+      }
+    },
+  },
+};
+</script>
+
+<style scoped lang="less">
+::v-deep .el-dialog__header {
+  border-bottom: 1px solid #e4e7ed;
+}
+
+::v-deep .el-dialog__body {
+  // padding: 20px;
+  max-height: 80vh;
+  overflow: auto;
+}
+
+@media screen and (max-width: 1200px) {
+  ::v-deep .el-dialog__body {
+    max-height: none;
+    overflow: auto;
+  }
+}
+
+.approval-dialog {
+  display: flex;
+  min-height: 60vh;
+  max-height: 80vh;
+  padding: 20px;
+  overflow: auto;
+
+  @media screen and (max-width: 1200px) {
+    flex-direction: column;
+    height: auto;
+
+    .approval-content,
+    .approval-flow {
+      width: 100%;
+      margin-right: 0;
+      margin-bottom: 20px;
+      height: 50vh;
+    }
+  }
+
+  .approval-content {
+    flex: 7;
+    margin-right: 20px;
+    background: #ffffff;
+    box-shadow: 0px 4px 12px 4px rgba(0, 0, 0, 0.08);
+    border-radius: 10px;
+    overflow-y: auto;
+  }
+
+  .approval-flow {
+    flex: 3;
+    max-width: 305px;
+    padding: 20px 0px;
+    background: #ffffff;
+    box-shadow: 0px 4px 12px 4px rgba(0, 0, 0, 0.08);
+    border-radius: 10px;
+    overflow-y: auto;
+
+    .flow-title {
+      font-size: 16px;
+      font-weight: bold;
+      margin-bottom: 20px;
+      color: #303133;
+    }
+
+    .flow-content {
+      height: calc(100% - 40px);
+      overflow-y: auto;
+
+      .el-form--inline .el-form-item {
+        margin-right: 83px;
+      }
+    }
+  }
+}
+
+.approval-dialog-approve {
+  margin-top: 18px;
+}
+
+.approval-content-card {
+  height: calc(100% - 10px) !important;
+  box-shadow: none !important;
+}
+
+.header-title {
+  display: flex;
+  align-items: center;
+  flex-wrap: wrap;
+  gap: 13px;
+  margin-top: 38px;
+
+  .header-title-left {
+    display: flex;
+    align-items: center;
+    gap: 13px;
+
+    img {
+      width: 12px;
+      height: 19px;
+    }
+
+    div {
+      flex-shrink: 0;
+      font-weight: bold;
+      font-size: 18px;
+      color: #222222;
+      line-height: 27px;
+      font-family: "Source Han Sans CN Bold Bold";
+
+      &:before {
+        content: "*";
+        color: #f56c6c;
+        margin-right: 4px;
+      }
+    }
+
+    span {
+      flex-shrink: 0;
+      font-weight: bold;
+      font-size: 18px;
+      color: #222222;
+      line-height: 27px;
+      font-family: "Source Han Sans CN Bold Bold";
+    }
+  }
+
+  .header-title-left :first-child {
+    margin-top: 0;
+  }
+}
+
+.header-title:first-child {
+  margin-top: 0 !important;
+
+  .header-title-left {
+    margin-top: 0;
+  }
+}
+
+.item-title {
+  padding-left: 25px;
+
+  span {
+    flex-shrink: 0;
+    font-weight: bold;
+    font-size: 14px;
+    color: #222222;
+    line-height: 27px;
+    font-family: "Source Han Sans CN Bold Bold";
+    margin: 18px 0;
+
+    &:before {
+      content: "*";
+      color: #f56c6c;
+      margin-right: 4px;
+    }
+  }
+}
+
+.approval-dialog-approve {
+  img {
+    border: 2px dashed #049c9a;
+  }
+}
+
+.add-group {
+  padding-left: 25px;
+  margin-top: 14px;
+  display: flex;
+  align-items: center;
+  margin-bottom: 19px;
+
+  div {
+    color: #f56c6c;
+  }
+
+  span {
+    font-weight: 500;
+    font-size: 14px;
+    color: #222222;
+    line-height: 21px;
+    margin: 0 32px 0 8px;
+  }
+}
+
+.groupTable {
+  width: 85%;
+  padding-left: 40px;
+}
+
+.rwuTable {
+  width: 85%;
+  padding-left: 40px;
+}
+
+.member-list {
+  margin-top: 18px;
+  display: flex;
+  flex-wrap: wrap;
+  gap: 28px;
+  margin-left: 38px;
+
+  .member-list-card {
+    width: 340px;
+    height: 400px;
+    border-radius: 8px;
+    border: 1px solid #dcdfe6;
+
+    &:nth-child(1) {
+      background: linear-gradient(
+        to bottom,
+        rgba(4, 156, 154, 0.2) 0%,
+        rgba(5, 242, 194, 0) 70%
+      );
+    }
+
+    &:nth-child(2) {
+      background: linear-gradient(
+        to bottom,
+        rgba(5, 160, 193, 0.2) 0%,
+        rgba(5, 242, 194, 0) 70%
+      );
+    }
+
+    &:nth-child(3) {
+      background: linear-gradient(
+        to bottom,
+        rgba(255, 77, 79, 0.2) 0%,
+        rgba(255, 242, 194, 0) 70%
+      );
+    }
+
+    &:nth-child(4) {
+      background: linear-gradient(
+        to bottom,
+        rgba(250, 199, 20, 0.21) 0%,
+        rgba(255, 242, 194, 0) 70%
+      );
+    }
+
+    .member-item {
+      height: 100%;
+      display: flex;
+      flex-direction: column;
+
+      .member-title {
+        margin-top: 20px;
+        width: 100%;
+        font-family: "Source Han Sans CN Bold Bold";
+        font-weight: bold;
+        font-size: 16px;
+        color: rgba(0, 0, 0, 0.8);
+        line-height: 16px;
+        text-align: center;
+      }
+
+      .flex1 {
+        flex: 1;
+      }
+
+      .member-name-box {
+        flex: 1;
+        display: flex;
+        align-items: center;
+        justify-content: center;
+      }
+
+      .member-name-box-2 {
+        flex: 1;
+        padding: 0 20px;
+        padding-top: 40px;
+        display: grid;
+        grid-template-columns: repeat(4, 1fr);
+        gap: 20px;
+        justify-items: center;
+        align-items: start;
+      }
+
+      .member-name {
+        width: 60px;
+        height: 60px;
+        background: #7d8b79;
+        border-radius: 50%;
+        text-align: center;
+        line-height: 60px;
+        font-weight: 500;
+        font-size: 16px;
+        color: #ffffff;
+        margin: 0;
+      }
+
+      .member-change {
+        display: flex;
+        justify-content: center;
+        padding: 10px 0;
+        margin-top: auto;
+        cursor: pointer;
+
+        .member-change-btn {
+          background: #fff1f0;
+          border-radius: 4px;
+          border: 1px solid #ffccc7;
+          padding: 1px 8px;
+          font-weight: 400;
+          font-size: 12px;
+          color: #ff4d4f;
+        }
+      }
+    }
+  }
+}
+
+.step-list {
+  background: #eff8fa;
+  padding: 20px;
+
+  .step-list-item {
+    display: flex;
+    justify-content: space-between;
+    padding: 25px;
+    background: #ffffff;
+
+    .step-list-item-title {
+      font-weight: 500;
+      font-size: 14px;
+      color: rgba(0, 0, 0, 0.8);
+      line-height: 20px;
+      flex-wrap: wrap;
+      flex: 1;
+    }
+  }
+}
+
+.content-box {
+  padding: 0 25px;
+  margin-bottom: 20px;
+  width: 65%;
+  display: flex;
+
+  .content-box-left {
+    flex: 1;
+
+    div {
+      padding: 10px 0;
+    }
+  }
+
+  .content-box-right {
+    flex: 1;
+
+    div {
+      padding: 10px 0;
+    }
+  }
+}
+</style>
\ No newline at end of file
diff --git a/laboratory/src/views/dataManagement/testResultReport/detail.vue b/laboratory/src/views/dataManagement/testResultReport/detail.vue
index 91aa783..63ab526 100644
--- a/laboratory/src/views/dataManagement/testResultReport/detail.vue
+++ b/laboratory/src/views/dataManagement/testResultReport/detail.vue
@@ -153,7 +153,90 @@
           </template>
         </el-table-column>
       </Table>
+      <!-- 新增 -->
+      <div class="header-title flex">
+        <div class="header-title-left flex">
+          <span>原始检验记录列表</span>
+        </div>
+        <el-form :model="formMore" labelWidth="auto">
+          <el-form-item label="" style="margin-bottom: 0">
+            <el-input
+              v-model="formMore.createBy"
+              placeholder="请输入创建人"
+            ></el-input>
+          </el-form-item>
+          <el-form-item label="" style="margin-bottom: 0">
+            <el-input
+              v-model="formMore.termName"
+              placeholder="请输入检测项名称"
+            ></el-input>
+          </el-form-item>
 
+          <el-form-item label="" style="margin-bottom: 0">
+            <el-button type="default" @click="resetForm">重置</el-button>
+            <el-button
+              type="primary"
+              style="margin-left: 10px"
+              @click="handleSearch"
+              >查询</el-button
+            >
+          </el-form-item>
+        </el-form>
+      </div>
+
+      <TableCustom
+        :tableData="tableDataMore"
+        :total="totalMore"
+        :height="null"
+        @handlePageChange="handlePageChange"
+        @handleSizeChange="handleSizeChange"
+      >
+        <template #table>
+          <el-table-column
+            prop="projectName"
+            label="所属项目课题方案"
+          ></el-table-column>
+          <el-table-column
+            prop="originalCode"
+            label="原始检验记录编号"
+          ></el-table-column>
+          <el-table-column
+            prop="experimentCode"
+            label="所属实验编号"
+          ></el-table-column>
+          <el-table-column
+            prop="experimentName"
+            label="实验名称"
+          ></el-table-column>
+          <el-table-column prop="termCode" label="检测项编号"></el-table-column>
+          <el-table-column prop="termName" label="检测项名称"></el-table-column>
+          <el-table-column prop="createTime" label="创建时间"></el-table-column>
+          <el-table-column prop="createBy" label="创建人"></el-table-column>
+
+          <!-- <el-table-column prop="termInstrument" label="检测仪器"></el-table-column> -->
+          <!-- <el-table-column prop="termReagent" label="检测试剂"></el-table-column> -->
+          <!-- <el-table-column prop="termStandard" label="检测标准"></el-table-column> -->
+          <!-- <el-table-column prop="termStep" label="检测步骤"></el-table-column> -->
+          <!-- <el-table-column prop="termResult" label="检测结果"></el-table-column> -->
+          <el-table-column prop="status" label="状态">
+            <template slot-scope="scope">
+              <el-tag :type="getStatusTypeMore(scope.row.status)">
+                {{ getStatusTextMore(scope.row.status) }}
+              </el-tag>
+            </template>
+          </el-table-column>
+          <el-table-column label="操作" width="180">
+            <template slot-scope="scope">
+              <template>
+                <el-button type="text" @click="handleDetail(scope.row.id)"
+                  >详情</el-button
+                >
+              </template>
+            </template>
+          </el-table-column>
+        </template>
+      </TableCustom>
+      <!-- 新增 -->
       <div class="header-title">
         <div class="header-title-left">
           <img src="@/assets/public/headercard.png" />
@@ -364,6 +447,10 @@
       :type="'view'"
       :data="currentExperimentResult"
     />
+    <RecordDetail
+      :visible.sync="recordDetailVisible"
+      :data="currentRecordDetail"
+    />
   </Card>
 </template>
 
@@ -373,6 +460,7 @@
 import moment from "moment";
 import EvaluationDialog from "./components/evaluation-dialog.vue";
 import CheckoutResult from "./components/checkout-result.vue";
+import RecordDetail from "./components/record-detail.vue";
 import AiEditor from "@/components/AiEditor";
 // import AddComponentDialog from "@/components/AddComponentDialog";
 import {
@@ -381,6 +469,7 @@
   update,
   getDetail,
   evaluateProcess,
+  getOriginalPageListByDispatchId,
 } from "./service";
 import { mapState } from "vuex";
 export default {
@@ -391,6 +480,7 @@
     CheckoutResult,
     ExperimentResultDialog,
     AiEditor,
+    RecordDetail,
     // AddComponentDialog
   },
   data() {
@@ -449,6 +539,18 @@
       },
       currentEvaluationData: null, // 添加当前评价数据
       userRole: "",
+      // 原始检测项列表--新增
+      formMore: {
+        createBy: "",
+        termName: "",
+        dispatchId: "",
+        pageNum: 1,
+        pageSize: 10,
+      },
+      tableDataMore: [],
+      totalMore: 0,
+      currentRecordDetail: { id: "" },
+      recordDetailVisible: false,
     };
   },
   watch: {
@@ -798,10 +900,12 @@
 
         // 调用getOtherInfoByDispatchId接口
         this.getInfomationByDispatchId(selectedData[0]);
+        this.getOriginalPageList(selectedData[0]);
 
         this.$message.success("选择成功");
       }
     },
+
     getInfomationByDispatchId(selectedData) {
       getOtherInfoByDispatchId({ dispatchId: selectedData.id })
         .then((res) => {
@@ -1184,6 +1288,72 @@
       const isApprover = userInfo.roleType == 2; // 2是审批人
       return (isAdmin || isApprover) && this.form.status == 2; // 2是待评定状态
     },
+
+    //
+    getStatusTypeMore(status) {
+      const statusMap = {
+        "-1": "info",
+        1: "warning",
+        2: "success",
+      };
+      return statusMap[status] || "info";
+    },
+    getStatusTextMore(status) {
+      const statusMap = {
+        "-1": "草稿箱",
+        1: "未填写",
+        2: "已填写",
+      };
+      return statusMap[status] || "未知";
+    },
+    handleDetail(id) {
+      //打开详情弹窗
+      this.recordDetailVisible = true;
+      this.currentRecordDetail = {
+        id: id,
+      };
+    },
+    resetForm() {
+      this.formMore = {
+        createBy: "",
+        trueName: "",
+        dispatchId: this.formMore.dispatchId,
+        pageNum: 1,
+        pageSize: 10,
+      };
+    },
+    handleSearch() {
+      this.formMore.pageNum = 1;
+      this.getOriginalPageList();
+    },
+    handlePageChange(page) {
+      this.formMore.pageNum = page;
+      this.getOriginalPageList();
+    },
+    handleSizeChange(size) {
+      this.formMore.pageSize = size;
+      this.formMore.pageNum = 1;
+      this.getOriginalPageList();
+    },
+    getOriginalPageList(selectedData) {
+      if (selectedData || this.taskTableData.length > 0) {
+        this.formMore.dispatchId = selectedData.id || this.taskTableData[0].id;
+      } else {
+        return ;
+      }
+
+      getOriginalPageListByDispatchId({
+        ...this.formMore,
+      })
+        .then((res) => {
+          console.log("1111111111111", res);
+          this.tableDataMore = res.data.records;
+          this.totalMore = res.data.total;
+        })
+        .catch((err) => {
+          this.$message.error("获取原始记录列表失败");
+        });
+    },
   },
   computed: {
     isView() {
diff --git a/laboratory/src/views/dataManagement/testResultReport/list.vue b/laboratory/src/views/dataManagement/testResultReport/list.vue
index 53beeee..906b8d8 100644
--- a/laboratory/src/views/dataManagement/testResultReport/list.vue
+++ b/laboratory/src/views/dataManagement/testResultReport/list.vue
@@ -1,16 +1,32 @@
 <template>
   <div class="list">
-    <TableCustom :queryForm="form" :tableData="tableData" :total="total" :height="null" @handlePageChange="handlePageChange" @handleSizeChange="handleSizeChange">
+    <TableCustom
+      :queryForm="form"
+      :tableData="tableData"
+      :total="total"
+      :height="null"
+      @handlePageChange="handlePageChange"
+      @handleSizeChange="handleSizeChange"
+    >
       <template #search>
         <el-form :model="form" labelWidth="auto" inline>
           <el-form-item label="所属项目课题方案:">
-            <el-input v-model="form.projectName" placeholder="请输入"></el-input>
+            <el-input
+              v-model="form.projectName"
+              placeholder="请输入"
+            ></el-input>
           </el-form-item>
           <el-form-item label="实验编号:">
-            <el-input v-model="form.experimentCode" placeholder="请输入"></el-input>
+            <el-input
+              v-model="form.experimentCode"
+              placeholder="请输入"
+            ></el-input>
           </el-form-item>
           <el-form-item label="实验名称:">
-            <el-input v-model="form.experimentName" placeholder="请输入"></el-input>
+            <el-input
+              v-model="form.experimentName"
+              placeholder="请输入"
+            ></el-input>
           </el-form-item>
           <el-form-item label="创建日期:">
             <el-date-picker
@@ -34,7 +50,12 @@
           </el-form-item>
           <el-form-item label="">
             <el-button type="default" @click="resetForm">重置</el-button>
-            <el-button type="primary" style="margin-left: 10px;" @click="handleSearch">查询</el-button>
+            <el-button
+              type="primary"
+              style="margin-left: 10px"
+              @click="handleSearch"
+              >查询</el-button
+            >
           </el-form-item>
         </el-form>
       </template>
@@ -57,34 +78,69 @@
               草稿箱
             </div>
           </div>
-          <el-button v-if="isProcessEngineer" @click="handleAddResult" class="el-icon-plus" type="primary">
+          <el-button
+            v-if="isProcessEngineer"
+            @click="handleAddResult"
+            class="el-icon-plus"
+            type="primary"
+          >
             新增实验结果汇报
           </el-button>
         </div>
       </template>
       <template #table>
-        <el-table-column prop="projectName" label="所属项目课题方案"></el-table-column>
-        <el-table-column prop="experimentCode" label="实验编号"></el-table-column>
-        <el-table-column prop="experimentName" label="实验名称"></el-table-column>
-        <el-table-column prop="processEngineerName" label="工艺工程师"></el-table-column>
-        
-        <el-table-column prop="laboratoryChemistName" label="化验师"></el-table-column>
+        <el-table-column
+          prop="projectName"
+          label="所属项目课题方案"
+        ></el-table-column>
+        <el-table-column
+          prop="experimentCode"
+          label="实验编号"
+        ></el-table-column>
+        <el-table-column
+          prop="experimentName"
+          label="实验名称"
+        ></el-table-column>
+        <el-table-column
+          prop="processEngineerName"
+          label="工艺工程师"
+        ></el-table-column>
+
+        <el-table-column
+          prop="laboratoryChemistName"
+          label="化验师"
+        ></el-table-column>
         <el-table-column prop="laboratoryChemistEvaluate" label="是否评定">
           <template slot-scope="scope">
-            <el-tag :type="scope.row.laboratoryChemistEvaluate === 1 ? 'success' : 'danger'">
-              {{ scope.row.laboratoryChemistEvaluate === 1 ? '是' : '否' }}
+            <el-tag
+              :type="
+                scope.row.laboratoryChemistEvaluate === 1 ? 'success' : 'danger'
+              "
+            >
+              {{ scope.row.laboratoryChemistEvaluate === 1 ? "是" : "否" }}
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="experimenterName" label="实验员"></el-table-column>
+        <el-table-column
+          prop="experimenterName"
+          label="实验员"
+        ></el-table-column>
         <el-table-column prop="experimenterEvaluate" label="是否评定">
           <template slot-scope="scope">
-            <el-tag :type="scope.row.experimenterEvaluate === 1 ? 'success' : 'danger'">
-              {{ scope.row.experimenterEvaluate === 1 ? '是' : '否' }}
+            <el-tag
+              :type="
+                scope.row.experimenterEvaluate === 1 ? 'success' : 'danger'
+              "
+            >
+              {{ scope.row.experimenterEvaluate === 1 ? "是" : "否" }}
             </el-tag>
           </template>
         </el-table-column>
-        <el-table-column prop="createTime" label="创建日期" width="180"></el-table-column>
+        <el-table-column
+          prop="createTime"
+          label="创建日期"
+          width="180"
+        ></el-table-column>
         <el-table-column prop="status" label="状态">
           <template slot-scope="scope">
             <el-tag :type="getStatusType(scope.row.status)">
@@ -97,55 +153,92 @@
             <template v-if="currentType === 'list'">
               <template v-if="isProcessEngineer">
                 <template v-if="scope.row.status === 1">
-                  <el-button type="text" @click="handleSubmit(scope.row)">提交</el-button>
-                  <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
-                  <el-button type="text" @click="handleDetail(scope.row.id)">详情</el-button>
-                  <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
+                  <el-button type="text" @click="handleSubmit(scope.row)"
+                    >提交</el-button
+                  >
+                  <el-button type="text" @click="handleEdit(scope.row)"
+                    >编辑</el-button
+                  >
+                  <el-button type="text" @click="handleDetail(scope.row.id)"
+                    >详情</el-button
+                  >
+                  <el-button type="text" @click="handleDelete(scope.row)"
+                    >删除</el-button
+                  >
                 </template>
                 <!-- <template v-else-if="scope.row.status === 2">
                   <el-button type="text" @click="handleDetail(scope.row.id)">详情</el-button>
                 </template> -->
                 <template v-else>
-                  <el-button type="text" @click="handleDetail(scope.row.id)">详情</el-button>
+                  <el-button type="text" @click="handleDetail(scope.row.id)"
+                    >详情</el-button
+                  >
                 </template>
               </template>
               <template v-else>
-                <el-button type="text" @click="handleDetail(scope.row.id)">详情</el-button>
-                <el-button 
-                  v-if="scope.row.status === 2" 
-                  type="text" 
+                <el-button type="text" @click="handleDetail(scope.row.id)"
+                  >详情</el-button
+                >
+                <el-button
+                  v-if="scope.row.status === 2"
+                  type="text"
                   @click="handleEvaluate(scope.row)"
-                >评定</el-button>
+                  >评定</el-button
+                >
+                  <el-button
+                    slot="reference"
+                    v-if="scope.row.status === 2"
+                    type="text"
+                    @click="handleReturn(scope.row)"
+                    >驳回</el-button
+                  >
               </template>
             </template>
             <template v-else>
-              <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
-              <el-button type="text" @click="handleDelete(scope.row)">删除</el-button>
+              <el-button type="text" @click="handleEdit(scope.row)"
+                >编辑</el-button
+              >
+              <el-button type="text" @click="handleDelete(scope.row)"
+                >删除</el-button
+              >
             </template>
           </template>
         </el-table-column>
       </template>
     </TableCustom>
-    <ShowDelConfirm 
-      :title="changeStatusTitle" 
-      :tip="changeStatusTip" 
+    <ShowDelConfirm
+      :title="changeStatusTitle"
+      :tip="changeStatusTip"
       :show="changeStatus"
-      @close="changeStatus = false" 
-      @confirm="handleChangeStatusConfirm" 
+      @close="changeStatus = false"
+      @confirm="handleChangeStatusConfirm"
     />
     <!-- 评价弹窗 -->
-    <evaluation-dialog 
-      :modelValue="evaluationDialogVisible" 
+    <evaluation-dialog
+      :modelValue="evaluationDialogVisible"
       :type="'processEngineer'"
-      :viewJson="currentEvaluationData" 
+      :viewJson="currentEvaluationData"
       @update:modelValue="updateEvaluationDialogVisible"
-      @submit="handleEvaluationSubmit" 
+      @submit="handleEvaluationSubmit"
     />
+    <el-dialog top="40vh" :visible.sync="returnDialogVisible" :show-close="false" :append-to-body="true"
+            :close-on-click-modal="false" width="433px">
+            <div class="dialog-title" slot="title">驳回</div>
+            <el-form ref="form" :model="formReturn" label-width="80px">
+                <el-form-item label="驳回原因" :rules="[{required: true, message: '请输入驳回原因', trigger: 'blur'}]">
+                    <el-input type="textarea" v-model="formReturn.reason" placeholder="请输入驳回原因" />
+                </el-form-item>
+            </el-form>
+            <span slot="footer" class="dialog-footer">
+                <el-button @click="returnDialogVisible=false">取消</el-button>
+                <el-button type="primary" @click="handleChangeStatusConfirm" style="margin-left: 20px;">确定</el-button>
+            </span>
+        </el-dialog>
   </div>
 </template>
 
 <script>
-import { getList,deleteById,commit,evaluateProcess } from './service';
+import { getList, deleteById, commit, evaluateProcess ,rejectResult} from "./service";
 import ShowDelConfirm from "@/components/showDelConfirm/index.vue";
 import EvaluationDialog from "./components/evaluation-dialog.vue";
 import moment from "moment";
@@ -154,7 +247,7 @@
   name: "TestResultReport",
   components: {
     ShowDelConfirm,
-    EvaluationDialog
+    EvaluationDialog,
   },
   data() {
     return {
@@ -168,7 +261,7 @@
         endTime: "",
         status: "",
         pageNum: 1,
-        pageSize: 10
+        pageSize: 10,
       },
       tableData: [],
       total: 0,
@@ -177,17 +270,23 @@
       changeStatusTitle: "",
       changeStatusTip: "",
       currentOperationRow: null,
-      currentOperationType: '',
+      currentOperationType: "",
       // 评价弹窗相关数据
       evaluationDialogVisible: false,
       currentEvaluationData: null,
+
+      // 驳回
+      returnDialogVisible: false,
+      formReturn:{
+        reason: ""
+      }
     };
   },
   computed: {
     isProcessEngineer() {
-      const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
+      const userInfo = JSON.parse(sessionStorage.getItem("userInfo") || "{}");
       return userInfo.roleType === 3; // 3是工艺工程师
-    }
+    },
   },
   created() {
     this.getTableData();
@@ -202,7 +301,7 @@
         endTime: "",
         status: "",
         pageNum: 1,
-        pageSize: 10
+        pageSize: 10,
       };
       this.dateRange = [];
       this.getTableData();
@@ -213,42 +312,47 @@
     handleAddResult() {
       this.$router.push({
         path: "/dataManagement/testResultReport/detail",
-        query: { 
-          type: 'add'
-        }
+        query: {
+          type: "add",
+        },
       });
     },
     handleEdit(row) {
       this.$router.push({
         path: "/dataManagement/testResultReport/detail",
-        query: { 
+        query: {
           id: row.id,
-          type: 'edit'
-        }
+          type: "edit",
+        },
       });
     },
     handleDetail(id) {
       this.$router.push({
         path: "/dataManagement/testResultReport/detail",
-        query: { 
+        query: {
           id: id,
-          type: 'view'
-        }
+          type: "view",
+        },
       });
     },
     handleSubmit(row) {
       this.currentOperationRow = row;
-      this.currentOperationType = 'submit';
+      this.currentOperationType = "submit";
       this.changeStatusTitle = "确认提交?";
       this.changeStatusTip = "提交之后无法再次编辑";
       this.changeStatus = true;
     },
     handleDelete(row) {
       this.currentOperationRow = row;
-      this.currentOperationType = 'delete';
+      this.currentOperationType = "delete";
       this.changeStatusTitle = "确认要删除这条信息吗?";
       this.changeStatusTip = "删除后信息无法找回";
       this.changeStatus = true;
+    }, 
+    handleReturn(row) {
+      this.currentOperationRow = row;
+      this.currentOperationType = "return";
+      this.returnDialogVisible = true;
     },
     handleEvaluate(row) {
       this.currentOperationRow = row;
@@ -261,50 +365,52 @@
     getTableData() {
       const params = {
         ...this.form,
-        status: this.currentType === 'draft' ? -1 : this.form.status
+        status: this.currentType === "draft" ? -1 : this.form.status,
       };
-      
-      getList(params).then(res => {
-        if (res.code === 200) {
-          this.tableData = res.data.records || [];
-          this.total = res.data.total || 0;
-        } else {
-          // this.$message.error(res.msg || '获取数据失败');
-        }
-      }).catch(err => {
-        // this.$message.error('获取数据失败');
-      });
+
+      getList(params)
+        .then((res) => {
+          if (res.code === 200) {
+            this.tableData = res.data.records || [];
+            this.total = res.data.total || 0;
+          } else {
+            // this.$message.error(res.msg || '获取数据失败');
+          }
+        })
+        .catch((err) => {
+          // this.$message.error('获取数据失败');
+        });
     },
     handleDateChange(val) {
       if (val) {
         this.form.startTime = val[0];
         this.form.endTime = val[1];
       } else {
-        this.form.startTime = '';
-        this.form.endTime = '';
+        this.form.startTime = "";
+        this.form.endTime = "";
       }
     },
     getStatusType(status) {
       const statusMap = {
-        '-1': 'info',
-        '1': 'warning',
-        '2': 'warning',
-        '3': 'success',
-        '4': 'info',
-        '5': 'warning'
+        "-1": "info",
+        1: "warning",
+        2: "warning",
+        3: "success",
+        4: "info",
+        5: "warning",
       };
-      return statusMap[status] || 'info';
+      return statusMap[status] || "info";
     },
     getStatusText(status) {
       const statusMap = {
-        '-1': '草稿箱',
-        '1': '待提交',
-        '2': '待评定',
-        '3': '已评定',
-        '4': '已封存',
-        '5': '已解封'
+        "-1": "草稿箱",
+        1: "待提交",
+        2: "待评定",
+        3: "已评定",
+        4: "已封存",
+        5: "已解封",
       };
-      return statusMap[status] || '未知';
+      return statusMap[status] || "未知";
     },
     handlePageChange(pageNum) {
       this.form.pageNum = pageNum;
@@ -316,31 +422,53 @@
     },
     handleChangeStatusConfirm() {
       if (!this.currentOperationRow) return;
-      
-      if (this.currentOperationType === 'submit') {
-        commit({ id: this.currentOperationRow.id }).then(res => {
-          if (res) {
-            this.$message.success('提交成功');
-            this.changeStatus = false;
-            this.getTableData();
-          } else {
-            this.$message.error(res.msg || '提交失败');
-          }
-        }).catch(err => {
-          this.$message.error('提交失败');
-        });
-      } else if (this.currentOperationType === 'delete') {
-        deleteById({ id: this.currentOperationRow.id }).then(res => {
-          if (res) {
-            this.$message.success('删除成功');
-            this.changeStatus = false;
-            this.getTableData();
-          } else {
-            this.$message.error(res.msg || '删除失败');
-          }
-        }).catch(err => {
-          this.$message.error('删除失败');
-        });
+      if(this.currentOperationType === "return" && !this.formReturn.reason){
+        this.$message.error("请填写驳回理由");
+        return;
+      }
+
+      if (this.currentOperationType === "submit") {
+        commit({ id: this.currentOperationRow.id })
+          .then((res) => {
+            if (res) {
+              this.$message.success("提交成功");
+              this.changeStatus = false;
+              this.getTableData();
+            } else {
+              this.$message.error(res.msg || "提交失败");
+            }
+          })
+          .catch((err) => {
+            this.$message.error("提交失败");
+          });
+      } else if (this.currentOperationType === "delete") {
+        deleteById({ id: this.currentOperationRow.id })
+          .then((res) => {
+            if (res) {
+              this.$message.success("删除成功");
+              this.changeStatus = false;
+              this.getTableData();
+            } else {
+              this.$message.error(res.msg || "删除失败");
+            }
+          })
+          .catch((err) => {
+            this.$message.error("删除失败");
+          });
+      }else if (this.currentOperationType === "return") { 
+        rejectResult({ resultReportId: this.currentOperationRow.id,rejectRemark:this.formReturn.reason })
+          .then((res) => {
+            if (res) {
+              this.$message.success("驳回成功");
+              this.returnDialogVisible = false;
+              this.getTableData();
+            } else {
+              this.$message.error(res.msg || "驳回失败");
+            }
+          })
+          .catch((err) => {
+            this.$message.error("驳回失败");
+          });
       }
     },
     // 更新弹窗显示状态
@@ -362,23 +490,25 @@
         evaluateFour: this.getEvaluateValue(activeIndex[3].score),
         evaluateFive: this.getEvaluateValue(activeIndex[4].score),
         evaluateSix: this.getEvaluateValue(activeIndex[5].score),
-        evaluateTime: moment().format('YYYY-MM-DD HH:mm:ss'),
+        evaluateTime: moment().format("YYYY-MM-DD HH:mm:ss"),
         resultEvaluateJson: JSON.stringify(activeIndex),
         resultReportId: this.currentOperationRow.id,
         dispatchId: this.currentOperationRow.dispatchId,
-        status: 1
+        status: 1,
       };
-      evaluateProcess(evaluateData).then(res => {
-        if (res.code == 200) {
-          this.$message.success('评定成功');
-          this.evaluationDialogVisible = false;
-          this.getTableData(); // 重新获取列表数据
-        } else {
-          this.$message.error(res.msg || '评定失败');
-        }
-      }).catch(err => {
-        this.$message.error('评定失败');
-      });
+      evaluateProcess(evaluateData)
+        .then((res) => {
+          if (res.code == 200) {
+            this.$message.success("评定成功");
+            this.evaluationDialogVisible = false;
+            this.getTableData(); // 重新获取列表数据
+          } else {
+            this.$message.error(res.msg || "评定失败");
+          }
+        })
+        .catch((err) => {
+          this.$message.error("评定失败");
+        });
     },
     // 将分数转换为评定值
     getEvaluateValue(score) {
@@ -386,11 +516,11 @@
       const scoreMap = {
         2: 1, // 良好
         1: 2, // 正确
-        0: 3  // 失误
+        0: 3, // 失误
       };
       return scoreMap[score] || 3; // 默认返回失误
-    }
-  }
+    },
+  },
 };
 </script>
 
@@ -407,7 +537,8 @@
   padding-bottom: 20px;
   justify-content: space-between;
   align-items: center;
-  .title, .drafts {
+  .title,
+  .drafts {
     background: #fafafc;
     border-radius: 8px 8px 0px 0px;
     border: 1px solid #dcdfe6;
diff --git a/laboratory/src/views/dataManagement/testResultReport/service.js b/laboratory/src/views/dataManagement/testResultReport/service.js
index 5a2cbe3..58e8f06 100644
--- a/laboratory/src/views/dataManagement/testResultReport/service.js
+++ b/laboratory/src/views/dataManagement/testResultReport/service.js
@@ -27,7 +27,9 @@
 export const deleteByIds = (data) => {
   return axios.delete('/open/t-experiment-result-report/deleteByIds', { params:data })
 }
-
+export const rejectResult = (data) => {
+  return axios.post('/api/t-experiment-result-report/rejectResult', { ...data })
+}
 // 获取实验结果汇报评定列表-审批人使用
 export const evaluatePageList = (data) => {
   return axios.post('/api/t-experiment-result-report/evaluatePageList', { ...data })
@@ -49,4 +51,12 @@
 // 通过实验调度查询查询组别列表
 export const getGroupByDispatchId = (data) => {
   return axios.get('/open/t-experiment-scheme/getGroupByDispatchId', { params:data })
+}
+
+// 详情
+export const getRecordDetail = (data) => {
+  return axios.get('/open/t-test-method-confirm-sheet-original/getDetailById', { params:data })
+}// 详情
+export const getOriginalPageListByDispatchId = (data) => {
+  return axios.post('/api/t-experiment-result-report/getOriginalPageListByDispatchId', { ...data })
 }
\ No newline at end of file

--
Gitblit v1.7.1