From c85d2427b749c5e7236f0474f9215e5936cdfa7c Mon Sep 17 00:00:00 2001
From: 董国庆 <364620639@qq.com>
Date: 星期三, 21 五月 2025 17:08:21 +0800
Subject: [PATCH] 原始检验记录

---
 /dev/null                                                                       |  149 ---------
 laboratory/src/views/dataManagement/originalRecordTest/detail.vue               |  418 ++++++++++++++++++++-----
 laboratory/src/views/dataManagement/originalRecordTest/service.js               |   15 
 laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue |  154 ++++++---
 laboratory/src/views/dataManagement/originalRecordTest/list.vue                 |  212 ++++++++----
 5 files changed, 582 insertions(+), 366 deletions(-)

diff --git a/laboratory/src/views/dataManagement/SampleDeliveryRecord/components/receiveConfirmDialog.vue b/laboratory/src/views/dataManagement/SampleDeliveryRecord/components/receiveConfirmDialog.vue
deleted file mode 100644
index cb08149..0000000
--- a/laboratory/src/views/dataManagement/SampleDeliveryRecord/components/receiveConfirmDialog.vue
+++ /dev/null
@@ -1,149 +0,0 @@
-<template>
-  <el-dialog
-    title="发送签字确认"
-    :visible.sync="visible"
-    width="500px"
-    :close-on-click-modal="false"
-    @close="handleClose"
-  >
-    <div class="receive-dialog">
-      <div class="receive-tip">
-        您已选中 <span class="sample-count">{{ sampleCount }}</span> 条样品发送,请签字确认
-      </div>
-      
-      <div class="approval-dialog-approve">
-        <div class="add-group">
-          <div>*</div>
-          <span>签字确认</span>
-          <el-button type="primary" class="el-icon-plus" @click="openSignature">签名</el-button>
-        </div>
-        <img
-          v-if="imgSrc"
-          style="width: 200px; height: 100px; margin-left: 25px"
-          :src="imgSrc"
-          fit="fit"
-        />
-      </div>
-    </div>
-
-    <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>
-    </div>
-
-    <SignatureCanvas
-      :visible="signatureDialogVisible"
-      @confirm="handleSignatureConfirm"
-      @close="signatureDialogVisible = false"
-    />
-  </el-dialog>
-</template>
-
-<script>
-import SignatureCanvas from "@/components/SignatureCanvas.vue";
-
-export default {
-  name: "ReceiveConfirmDialog",
-  components: {
-    SignatureCanvas,
-  },
-  props: {
-    visible: {
-      type: Boolean,
-      default: false,
-    },
-    sampleCount: {
-      type: Number,
-      default: 1,
-    },
-  },
-  data() {
-    return {
-      signatureDialogVisible: false,
-      imgSrc: "",
-    };
-  },
-  methods: {
-    handleClose() {
-      this.$emit("update:visible", false);
-      this.imgSrc = "";
-    },
-    openSignature() {
-      this.signatureDialogVisible = true;
-    },
-    handleSignatureConfirm(imageData) {
-      this.signatureDialogVisible = false;
-      this.imgSrc = imageData;
-    },
-    handleConfirm() {
-      if (!this.imgSrc) {
-        this.$message.warning("请先完成签名确认");
-        return;
-      }
-      this.$emit("confirm", this.imgSrc);
-      this.handleClose();
-    },
-  },
-};
-</script>
-
-<style lang="less" scoped>
-::v-deep .el-dialog__header {
-  border-bottom: 1px solid #e4e7ed;
-}
-
-.receive-dialog {
-  padding: 20px;
-
-  .receive-tip {
-    font-size: 14px;
-    color: #333;
-    margin-bottom: 20px;
-
-    .sample-count {
-      color: #409EFF;
-      font-weight: bold;
-    }
-  }
-}
-
-.approval-dialog-approve {
-  margin-top: 26px;
-
-  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;
-  }
-}
-
-.dialog-footer {
-  align-items: center;
-  display: flex;
-  justify-content: center;
-
-  button {
-    width: 150px;
-  }
-}
-</style> 
\ No newline at end of file
diff --git a/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue b/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue
index 886e35a..deb06d6 100644
--- a/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue
+++ b/laboratory/src/views/dataManagement/originalRecordTest/components/addDialog.vue
@@ -1,6 +1,6 @@
 <template>
   <el-dialog
-    title="新增检测数据"
+    :title="isEdit ? '编辑检测数据' : '新增检测数据'"
     :visible.sync="dialogVisible"
     width="60%"
     :close-on-click-modal="false"
@@ -17,17 +17,17 @@
           >
             <el-row :gutter="20">
               <el-col :span="12">
-                <el-form-item label="检测样编号" prop="sampleCode">
+                <el-form-item label="数据编号" prop="dataCode">
                   <el-input
-                    v-model="form.sampleCode"
-                    placeholder="请输入检测样编号"
+                    v-model="form.dataCode"
+                    placeholder="请输入数据编号"
                   />
                 </el-form-item>
               </el-col>
               <el-col :span="12">
-                <el-form-item label="检测数据" prop="testData">
+                <el-form-item label="检测数据" prop="dataTitle">
                   <el-input
-                    v-model="form.testData"
+                    v-model="form.dataTitle"
                     placeholder="请输入检测数据"
                   />
                 </el-form-item>
@@ -36,10 +36,10 @@
 
             <el-row :gutter="20">
               <el-col :span="24">
-                <el-form-item label="检测类型" prop="testTypes">
-                  <el-checkbox-group v-model="form.testTypes">
-                    <el-checkbox label="photo">拍照</el-checkbox>
-                    <el-checkbox label="spectrum">图谱</el-checkbox>
+                <el-form-item label="检测类型" prop="dataType">
+                  <el-checkbox-group v-model="form.dataType">
+                    <el-checkbox label="1">拍照</el-checkbox>
+                    <el-checkbox label="2">图谱</el-checkbox>
                   </el-checkbox-group>
                 </el-form-item>
               </el-col>
@@ -62,7 +62,6 @@
                     :on-change="handlePhotoChange"
                   >
                     <i class="el-icon-plus"></i>
-                    <!-- <div class="el-upload__tip" slot="tip">支持 jpg、png 格式文件</div> -->
                   </el-upload>
                 </el-form-item>
               </el-col>
@@ -109,26 +108,32 @@
     visible: {
       type: Boolean,
       default: false
+    },
+    isEdit: {
+      type: Boolean,
+      default: false
     }
   },
   data() {
     return {
       isIPad: /iPad/i.test(navigator.userAgent),
       form: {
-        sampleCode: "",
-        testData: "",
-        testTypes: ["photo"], // 默认选中拍照
+        dataCode: "",
+        dataTitle: "",
+        dataType: ["1"],
+        dataFiles: "",
+        dataPictures: "",
         photos: [],
         spectrums: []
       },
       rules: {
-        sampleCode: [
-          { required: true, message: "请输入检测样编号", trigger: "blur" }
+        dataCode: [
+          { required: true, message: "请输入数据编号", trigger: "blur" }
         ],
-        testData: [
+        dataTitle: [
           { required: true, message: "请输入检测数据", trigger: "blur" }
         ],
-        testTypes: [
+        dataType: [
           { 
             type: 'array',
             required: true, 
@@ -142,7 +147,7 @@
             message: "请上传检测照片", 
             trigger: "change",
             validator: (rule, value, callback) => {
-              if (this.form.testTypes.includes('photo') && (!this.photoList || !this.photoList.length)) {
+              if (this.form.dataType.includes('1') && (!this.photoList || !this.photoList.length)) {
                 callback(new Error('请上传检测照片'));
               } else {
                 callback();
@@ -156,7 +161,7 @@
             message: "请上传检测图谱", 
             trigger: "change",
             validator: (rule, value, callback) => {
-              if (this.form.testTypes.includes('spectrum') && (!this.spectrumList || !this.spectrumList.length)) {
+              if (this.form.dataType.includes('2') && (!this.spectrumList || !this.spectrumList.length)) {
                 callback(new Error('请上传检测图谱'));
               } else {
                 callback();
@@ -179,37 +184,52 @@
       }
     },
     showPhotoUpload() {
-      return this.form.testTypes.includes('photo');
+      return this.form.dataType.includes('1');
     },
     showSpectrumUpload() {
-      return this.form.testTypes.includes('spectrum');
+      return this.form.dataType.includes('2');
     }
   },
   methods: {
     setFormData(data) {
+      console.log('data',data)
+
       // 设置基础表单数据
-      this.form.sampleCode = data.sampleCode;
-      this.form.testData = data.testData;
-      this.form.testTypes = data.testTypes;
+      this.form.dataCode = data.dataCode;
+      this.form.dataTitle = data.dataTitle;
+      // 处理 dataType,确保它是数组格式
+      this.form.dataType = Array.isArray(data.dataType) ? data.dataType : (data.dataType ? data.dataType.split(',') : []);
 
       // 设置照片列表
-      if (data.photos && data.photos.length) {
-        this.photoList = data.photos.map(photo => ({
-          name: photo.name,
-          url: photo.url,
-          status: 'success'
-        }));
+      if (data.dataPictures) {
+        try {
+          const pictures = typeof data.dataPictures === 'string' ? JSON.parse(data.dataPictures) : data.dataPictures;
+          this.photoList = pictures.map(photo => ({
+            name: photo.name,
+            url: photo.url,
+            status: 'success'
+          }));
+        } catch (e) {
+          console.error('解析照片数据失败:', e);
+          this.photoList = [];
+        }
       } else {
         this.photoList = [];
       }
 
       // 设置图谱列表
-      if (data.spectrums && data.spectrums.length) {
-        this.spectrumList = data.spectrums.map(spectrum => ({
-          name: spectrum.name,
-          url: spectrum.url,
-          status: 'success'
-        }));
+      if (data.dataFiles) {
+        try {
+          const files = typeof data.dataFiles === 'string' ? JSON.parse(data.dataFiles) : data.dataFiles;
+          this.spectrumList = files.map(file => ({
+            name: file.name,
+            url: file.url,
+            status: 'success'
+          }));
+        } catch (e) {
+          console.error('解析图谱数据失败:', e);
+          this.spectrumList = [];
+        }
       } else {
         this.spectrumList = [];
       }
@@ -225,9 +245,11 @@
       this.photoList = [];
       this.spectrumList = [];
       this.form = {
-        sampleCode: "",
-        testData: "",
-        testTypes: ["photo"],
+        dataCode: "",
+        dataTitle: "",
+        dataType: ["1"],
+        dataFiles: "",
+        dataPictures: "",
         photos: [],
         spectrums: []
       };
@@ -237,19 +259,33 @@
         if (valid) {
           const submitData = {
             ...this.form,
-            photos: this.photoList,
-            spectrums: this.spectrumList
+            // 确保 dataType 在提交时转换为字符串
+            dataType: Array.isArray(this.form.dataType) ? this.form.dataType.join(',') : this.form.dataType,
+            dataFiles: JSON.stringify(this.spectrumList),
+            dataPictures: JSON.stringify(this.photoList)
           };
           this.$emit("success", submitData);
         }
       });
     },
     handlePhotoChange(file, fileList) {
-      this.photoList = fileList;
+      // 模拟上传成功
+      const mockFile = {
+        name: file.name || '测试图片.jpg',
+        url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
+        status: 'success'
+      };
+      this.photoList = [...this.photoList, mockFile];
       this.$refs.form.validateField('photos');
     },
     handleSpectrumChange(file, fileList) {
-      this.spectrumList = fileList;
+      // 模拟上传成功
+      const mockFile = {
+        name: file.name || '测试图谱.pdf',
+        url: 'https://example.com/test.pdf',
+        status: 'success'
+      };
+      this.spectrumList = [...this.spectrumList, mockFile];
       this.$refs.form.validateField('spectrums');
     },
     handleSpectrumRemove(file) {
@@ -257,16 +293,34 @@
     },
     // iPad 相关方法
     handleIPadPhoto() {
-      // TODO: 调用 iPad 拍照功能
-      console.log('调用 iPad 拍照功能');
+      // 模拟 iPad 拍照功能
+      const mockFile = {
+        name: 'iPad拍照.jpg',
+        url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
+        status: 'success'
+      };
+      this.photoList = [...this.photoList, mockFile];
+      this.$refs.form.validateField('photos');
     },
     handleIPadUpload() {
-      // TODO: 调用 iPad 上传功能
-      console.log('调用 iPad 上传功能');
+      // 模拟 iPad 上传功能
+      const mockFile = {
+        name: 'iPad上传图片.jpg',
+        url: 'https://fuss10.elemecdn.com/e/5d/4a731a90594a4af544c0c25941171jpeg.jpeg',
+        status: 'success'
+      };
+      this.photoList = [...this.photoList, mockFile];
+      this.$refs.form.validateField('photos');
     },
     handleIPadSpectrum() {
-      // TODO: 调用 iPad 选择图谱功能
-      console.log('调用 iPad 选择图谱功能');
+      // 模拟 iPad 选择图谱功能
+      const mockFile = {
+        name: 'iPad图谱.pdf',
+        url: 'https://example.com/test.pdf',
+        status: 'success'
+      };
+      this.spectrumList = [...this.spectrumList, mockFile];
+      this.$refs.form.validateField('spectrums');
     }
   }
 };
diff --git a/laboratory/src/views/dataManagement/originalRecordTest/detail.vue b/laboratory/src/views/dataManagement/originalRecordTest/detail.vue
index 817602c..c28c7db 100644
--- a/laboratory/src/views/dataManagement/originalRecordTest/detail.vue
+++ b/laboratory/src/views/dataManagement/originalRecordTest/detail.vue
@@ -8,9 +8,10 @@
       label-position="top"
     >
       <div style="padding-left: 25px">
-        <el-form-item prop="recordNo" label="原始检验记录编号">
-          <el-input v-model="form.recordNo" placeholder="请输入" />
+        <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">
@@ -20,57 +21,93 @@
         </div>
       </div>
       <div style="padding-left: 25px">
-        <el-form-item prop="testItemName" label="检测项名字">
-          <el-input v-model="form.testItemName" placeholder="请输入" />
+        <el-form-item prop="termName" label="检测项名字">
+          <el-input v-model="form.termName" placeholder="请输入" disabled />
         </el-form-item>
-        <el-form-item prop="testItemNo" label="检测项编号">
-          <el-input v-model="form.testItemNo" placeholder="请输入" />
+        <el-form-item prop="termCode" label="检测项编号">
+          <el-input v-model="form.termCode" placeholder="请输入" disabled />
         </el-form-item>
-        <el-form-item prop="testMethodName" label="检测方法名字">
-          <el-input v-model="form.testMethodName" placeholder="请输入" />
+        <el-form-item prop="termMethod" label="检测方法名字">
+          <el-input v-model="form.termMethod" placeholder="请输入" disabled />
         </el-form-item>
-        <el-form-item prop="testMethodNo" label="检测方法编号">
-          <el-input v-model="form.testMethodNo" placeholder="请输入" />
+        <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" />
-          <span>一 、检测标准</span>
+          <div>一 、检测标准</div>
         </div>
       </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 class="header-title" style="margin-bottom: 38px">
-        <div class="header-title-left">
-          <img src="@/assets/public/headercard.png" />
-          <span>三 、检测试剂</span>
-        </div>
-      </div>
-      <div class="header-title" style="margin-bottom: 38px">
-        <div class="header-title-left">
-          <img src="@/assets/public/headercard.png" />
-          <span>四 、检测步骤</span>
-        </div>
-      </div>
+      <AiEditor
+        ref="standardEditor"
+        :value="editorContents.termStandard"
+        height="200px"
+        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" />
-          <span>五 、检测数据及参照</span>
+          <div>二 、检测仪器</div>
         </div>
-        <el-button type="primary" class="el-icon-plus" @click="handleAddTask">添加检测数据</el-button>
+      </div>
+      <AiEditor
+        ref="instrumentEditor"
+        :value="editorContents.termInstrument"
+        height="200px"
+        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="200px"
+        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="200px"
+        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="0" :height="null" 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">
@@ -107,8 +144,8 @@
             <span v-else>无图谱</span>
           </template>
         </el-table-column>
-        <el-table-column prop="createTime" label="添加时间" width="180"></el-table-column>
-        <el-table-column label="操作" width="150">
+        
+        <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>
@@ -119,29 +156,38 @@
       <div class="header-title">
         <div class="header-title-left">
           <img src="@/assets/public/headercard.png" />
-          <span>六 、检测结果预算</span>
+          <div>六 、检测结果运算</div>
         </div>
       </div>
+      <AiEditor
+        ref="resultCalculationEditor"
+        :value="editorContents.termResult"
+        height="200px"
+        style="margin: 20px 0;"
+        placeholder="请输入检测结果运算..."
+        :readOnly="isDetail"
+      />
       <Table :data="taskTableData" :total="0" :height="null" 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 label="检测结果" >
           <template slot-scope="scope">
-            <el-input v-model="scope.row.testResult" placeholder="请输入检测结果"></el-input>
+            <el-input v-model="scope.row.resultText" placeholder="请输入检测结果" :disabled="isDetail"></el-input>
           </template>
         </el-table-column>
       </Table>
 
-      <div class="add-project-footer">
-        <el-button type="primary" class="save-btn">发送</el-button>
-        <el-button>存草稿</el-button>
+      <div class="add-project-footer" v-if="!isDetail">
+        <el-button type="primary" class="save-btn" @click="handleSubmit(false)">填写完毕</el-button>
+        <el-button @click="handleSaveDraft">存草稿</el-button>
       </div>
     </el-form>
     <!-- 添加检测数据弹窗 -->
     <add-dialog 
       ref="addDialog"
       :visible.sync="dialogVisible" 
+      :is-edit="isEdit"
       @success="handleTaskSubmit" 
     />
   </Card>
@@ -149,36 +195,100 @@
   
 <script>
 import AddDialog from './components/addDialog.vue'
+import AiEditor from '@/components/AiEditor'
 import moment from 'moment'
+import { getDetail, update } from './service'
 
 export default {
   name: "AddProject",
   components: {
-    AddDialog
+    AddDialog,
+    AiEditor
   },
   data() {
     return {
       dialogVisible: false,
       isEdit: false,
       currentEditIndex: -1,
+      isDetail: this.$route.query.type === 'detail',
       form: {
-        recordNo: '',
-        testItemName: '',
-        testItemNo: '',
-        testMethodName: '',
-        testMethodNo: ''
+        id: '',
+        originalCode: '',
+        termName: '',
+        termCode: '',
+        termMethod: '',
+        termMethodCode: '',
+        status: 1,
+        termStandard: '',
+        termInstrument: '',
+        termReagent: '',
+        termStep: '',
+        termResult: ''
+      },
+      editorContents: {
+        termStandard: '',
+        termInstrument: '',
+        termReagent: '',
+        termStep: '',
+        termResult: ''
       },
       rules: {
-        recordNo: [{ required: true, message: "请输入原始检验记录编号", trigger: "blur" }],
-        testItemName: [{ required: true, message: "请输入检测项名字", trigger: "blur" }],
-        testItemNo: [{ required: true, message: "请输入检测项编号", trigger: "blur" }],
-        testMethodName: [{ required: true, message: "请输入检测方法名字", trigger: "blur" }],
-        testMethodNo: [{ required: true, message: "请输入检测方法编号", trigger: "blur" }]
+        termName: [{ required: true, message: "请输入检测项名字", trigger: "blur" }],
+        termCode: [{ required: true, message: "请输入检测项编号", trigger: "blur" }],
+        experimentName: [{ required: true, message: "请输入检测方法名字", trigger: "blur" }],
+        experimentCode: [{ required: true, message: "请输入检测方法编号", trigger: "blur" }]
       },
       taskTableData: []
     };
   },
   methods: {
+    // 获取详情
+    getDetail() {
+      const id = this.$route.query.id;
+      if (id) {
+        getDetail({ 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.taskTableData = 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')
+              }));
+            }
+          }
+        }).catch(err => {
+          console.error('获取详情失败:', err);
+          this.$message.error('获取详情失败');
+        });
+      }
+    },
     handleAddTask() {
       this.isEdit = false;
       this.currentEditIndex = -1;
@@ -189,28 +299,22 @@
       this.currentEditIndex = this.taskTableData.findIndex(item => item === row);
       
       const editData = {
-        sampleCode: row.sampleCode,
-        testData: row.testData,
-        testTypes: [],
+        dataCode: row.sampleCode,
+        dataTitle: row.testData,
+        dataType: [],
+        dataFiles: '',
+        dataPictures: '',
         photos: [],
         spectrums: []
       };
 
       if (row.photos && row.photos.length > 0) {
-        editData.testTypes.push('photo');
-        editData.photos = row.photos.map(photo => ({
-          name: photo.name,
-          url: photo.url,
-          raw: null
-        }));
+        editData.dataType.push('1');
+        editData.dataPictures = row.photos;
       }
       if (row.spectrums && row.spectrums.length > 0) {
-        editData.testTypes.push('spectrum');
-        editData.spectrums = row.spectrums.map(spectrum => ({
-          name: spectrum.name,
-          url: spectrum.url,
-          raw: null
-        }));
+        editData.dataType.push('2');
+        editData.dataFiles = row.spectrums;
       }
 
       this.$nextTick(() => {
@@ -250,42 +354,16 @@
         .catch(() => {});
     },
     handleTaskSubmit(formData) {
-      const photos = formData.photos.map(file => ({
-        name: file.name,
-        url: file.url || URL.createObjectURL(file.raw)
-      }));
-
-      const spectrums = formData.spectrums.map(file => ({
-        name: file.name,
-        url: file.url || URL.createObjectURL(file.raw)
-      }));
-
       const newData = {
-        sampleCode: formData.sampleCode,
-        testData: formData.testData,
-        testResult: '',
-        photos,
-        spectrums,
+        sampleCode: formData.dataCode,
+        testData: formData.dataTitle,
+        resultText: this.isEdit && this.currentEditIndex > -1 ? this.taskTableData[this.currentEditIndex].resultText : '',
+        photos: formData.dataPictures ? JSON.parse(formData.dataPictures) : [],
+        spectrums: formData.dataFiles ? JSON.parse(formData.dataFiles) : [],
         createTime: this.isEdit ? this.taskTableData[this.currentEditIndex].createTime : moment().format('YYYY-MM-DD HH:mm:ss')
       };
 
       if (this.isEdit && this.currentEditIndex > -1) {
-        const oldData = this.taskTableData[this.currentEditIndex];
-        if (oldData.photos) {
-          oldData.photos.forEach(photo => {
-            if (photo.url.startsWith('blob:') && !photos.find(p => p.url === photo.url)) {
-              URL.revokeObjectURL(photo.url);
-            }
-          });
-        }
-        if (oldData.spectrums) {
-          oldData.spectrums.forEach(spectrum => {
-            if (spectrum.url.startsWith('blob:') && !spectrums.find(s => s.url === spectrum.url)) {
-              URL.revokeObjectURL(spectrum.url);
-            }
-          });
-        }
-        
         this.taskTableData.splice(this.currentEditIndex, 1, newData);
         this.$message.success('更新成功');
       } else {
@@ -299,12 +377,148 @@
     },
     getPhotoUrls(photos) {
       return photos.map(photo => photo.url);
+    },
+    // 获取所有编辑器的内容
+    getAllEditorContent() {
+      return {
+        termStandard: this.$refs.standardEditor.getContent(),
+        termInstrument: this.$refs.instrumentEditor.getContent(),
+        termReagent: this.$refs.reagentEditor.getContent(),
+        termStep: this.$refs.stepsEditor.getContent(),
+        termResult: this.$refs.resultCalculationEditor.getContent()
+      }
+    },
+    // 验证所有编辑器内容
+    validateEditors() {
+      const editors = {
+        termStandard: this.$refs.standardEditor.getContent(),
+        termInstrument: this.$refs.instrumentEditor.getContent(),
+        termReagent: this.$refs.reagentEditor.getContent(),
+        termStep: this.$refs.stepsEditor.getContent(),
+        termResult: this.$refs.resultCalculationEditor.getContent()
+      };
+
+      // 判断内容是否为空(排除<p></p>)
+      const isEmptyContent = (content) => {
+        return !content || content === '<p></p>' || content.trim() === '<p></p>';
+      };
+
+      const emptyFields = [];
+      if (isEmptyContent(editors.termStandard)) emptyFields.push('检测标准');
+      if (isEmptyContent(editors.termInstrument)) emptyFields.push('检测仪器');
+      if (isEmptyContent(editors.termReagent)) emptyFields.push('检测试剂');
+      if (isEmptyContent(editors.termStep)) emptyFields.push('检测步骤');
+      if (isEmptyContent(editors.termResult)) emptyFields.push('检测结果运算');
+
+      if (emptyFields.length > 0) {
+        this.$message.warning(`请填写${emptyFields.join('、')}`);
+        return false;
+      }
+      return true;
+    },
+
+    // 获取编辑器对应的标签名
+    getEditorLabel(key) {
+      const labels = {
+        termStandard: '检测标准',
+        termInstrument: '检测仪器',
+        termReagent: '检测试剂',
+        termStep: '检测步骤',
+        termResult: '检测结果运算'
+      };
+      return labels[key] || '';
+    },
+
+    // 验证表格数据
+    validateTableData() {
+      if (!this.taskTableData || this.taskTableData.length === 0) {
+        this.$message.error('请至少添加一条检测数据');
+        return false;
+      }
+      return true;
+    },
+
+    // 提交表单
+    async handleSubmit(isDraft) {
+      try {
+        // 如果不是草稿,需要验证所有必填项
+        if (!isDraft) {
+          // 验证编辑器内容
+          if (!this.validateEditors()) {
+            return;
+          }
+
+          // 验证表格数据
+          if (!this.validateTableData()) {
+            return;
+          }
+        }
+
+        // 获取所有编辑器内容
+        const editorContents = {
+          termStandard: this.$refs.standardEditor.getContent(),
+          termInstrument: this.$refs.instrumentEditor.getContent(),
+          termReagent: this.$refs.reagentEditor.getContent(),
+          termStep: this.$refs.stepsEditor.getContent(),
+          termResult: this.$refs.resultCalculationEditor.getContent()
+        };
+
+        // 构建提交数据
+        const submitData = {
+          id: this.form.id,
+          status: isDraft ? -1 : 2,
+          ...editorContents,
+          testMethodConfirmSheetOriginalDataList: this.taskTableData.map(item => ({
+            dataCode: item.sampleCode,
+            dataTitle: item.testData,
+            dataType: item.photos && item.spectrums ? '1,2' : 
+                     item.photos ? '1' : 
+                     item.spectrums ? '2' : '',
+            dataFiles: JSON.stringify(item.spectrums || []),
+            dataPictures: (item.photos || []).map(photo => photo.url).join(','),
+            originalId: this.form.id,
+            resultText: item.resultText || ''
+          }))
+        };
+
+        console.log('提交数据:', submitData);
+        
+        // 调用更新接口
+        const res = await update(submitData);
+        if (res.code === 200) {
+          // 根据 isDraft 显示不同的成功提示
+          if (isDraft) {
+            this.$message.success('保存草稿成功');
+          } else {
+            this.$message.success('填写完毕');
+          }
+          // 返回上一页
+          this.$router.back();
+        } else {
+          this.$message.error(res.msg || '提交失败');
+        }
+      } catch (error) {
+        console.error('提交失败:', error);
+        this.$message.error('提交失败');
+      }
+    },
+
+    // 存草稿
+    handleSaveDraft() {
+      this.handleSubmit(true);
     }
+  },
+  created() {
+    this.getDetail();
   }
 };
 </script>
   
 <style scoped lang="less">
+.ai-editor-container{
+  margin-left: 40px;
+  width: 85%;
+}
 .el-form--inline .el-form-item {
   margin-right: 83px;
 }
@@ -315,6 +529,7 @@
   flex-wrap: wrap;
   gap: 13px;
   margin-top: 38px;
+  margin-bottom: 38px;
   
   .header-title-left {
     display: flex;
@@ -334,6 +549,19 @@
       line-height: 27px;
       font-family: "Source Han Sans CN Bold Bold";
     }
+    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;
+      }
+    }
   }
 }
 
diff --git a/laboratory/src/views/dataManagement/originalRecordTest/list.vue b/laboratory/src/views/dataManagement/originalRecordTest/list.vue
index 18b067e..862b42c 100644
--- a/laboratory/src/views/dataManagement/originalRecordTest/list.vue
+++ b/laboratory/src/views/dataManagement/originalRecordTest/list.vue
@@ -1,13 +1,16 @@
 <template>
   <div class="list">
-    <TableCustom :queryForm="form" :tableData="tableData" :total="total" :height="null">
+    <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-form-item>
           <el-form-item label="所属实验编号:">
-            <el-input v-model="form.planCode" placeholder="请输入"></el-input>
+            <el-input v-model="form.experimentCode" placeholder="请输入"></el-input>
           </el-form-item>
           <el-form-item label="创建人:">
-            <el-input v-model="form.creator" placeholder="请输入"></el-input>
+            <el-input v-model="form.createBy" placeholder="请输入"></el-input>
           </el-form-item>
           <el-form-item label="创建时间:">
             <el-date-picker
@@ -17,17 +20,27 @@
               start-placeholder="开始日期"
               end-placeholder="结束日期"
               value-format="yyyy-MM-dd"
+              :default-time="['00:00:00', '23:59:59']"
+              @change="handleDateChange"
             ></el-date-picker>
           </el-form-item>
-          <el-form-item label="审批人:">
+          <!-- <el-form-item label="审批人:">
             <el-input v-model="form.approver" placeholder="请输入"></el-input>
+          </el-form-item> -->
+          <el-form-item label="状态:">
+            <el-select v-model="form.status" placeholder="请选择">
+              <el-option label="全部" value=""></el-option>
+              <el-option label="未填写" value="1"></el-option>
+              <el-option label="已填写" value="2"></el-option>
+            </el-select>
           </el-form-item>
           <el-form-item label="">
             <el-button type="default" @click="resetForm">重置</el-button>
-            <el-button type="primary" @click="handleSearch">查询</el-button>
+            <el-button type="primary" @click="handleSearch" style="margin-left: 10px;">查询</el-button>
           </el-form-item>
         </el-form>
       </template>
+      
       <template #setting>
         <div class="tableTitle">
           <div class="flex a-center">
@@ -36,22 +49,41 @@
         </div>
       </template>
       <template #table>
-        <el-table-column prop="projectPlan" label="所属项目课题方案"></el-table-column>
-        <el-table-column prop="experimentNo" label="实验编号"></el-table-column>
+        <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="creator" 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="scope.row.status === '已填写' ? 'success' : 'warning'">
-              {{ scope.row.status }}
+            <el-tag :type="getStatusType(scope.row.status)">
+              {{ getStatusText(scope.row.status) }}
             </el-tag>
           </template>
         </el-table-column>
         <el-table-column label="操作" width="150">
           <template slot-scope="scope">
-            <el-button type="text" @click="handleEdit(scope.row)">编辑</el-button>
-            <el-button type="text" @click="handleDetail(scope.row.id)">详情</el-button>
+            <template v-if="isLabTechnician">
+              <el-button 
+                type="text" 
+                @click="handleEdit(scope.row)"
+               
+              >编辑</el-button>
+             
+            </template>
+            <template v-else>
+              <el-button type="text" @click="handleDetail(scope.row.id)">详情</el-button>
+            </template>
           </template>
         </el-table-column>
       </template>
@@ -60,64 +92,36 @@
 </template>
 
 <script>
+import { getList } from './service';
+
 export default {
   name: "OriginalRecordTest",
+  computed: {
+    /**
+     * 判断当前用户是否为化验师
+     * @returns {boolean} 是否为化验师
+     */
+    isLabTechnician() {
+      const userInfo = JSON.parse(sessionStorage.getItem('userInfo') || '{}');
+      return userInfo.roleType == 4; // 4是化验师
+    }
+  },
   data() {
     return {
+      // 查询表单数据
       form: {
-        planCode: "",
-        creator: "",
-        createTime: [],
-        approver: ""
+        projectName: "", // 项目课题方案名称
+        experimentCode: "", // 所属实验编号
+        createBy: "", // 创建人
+        createTime: [], // 创建时间范围
+        startTime: "", // 开始时间
+        endTime: "", // 结束时间
+        status: "", // 状态
+        pageNum: 1, // 当前页码
+        pageSize: 10 // 每页条数
       },
-      tableData: [
-        {
-          id: '1',
-          projectPlan: 'DD250218-JL01',
-          experimentNo: '31423764',
-          experimentName: '化学成分分析实验',
-          creator: '张三',
-          createTime: '2025-1-8 17:56:11',
-          status: '未填写'
-        },
-        {
-          id: '2',
-          projectPlan: 'DD250218-JL02',
-          experimentNo: '31423765',
-          experimentName: '物理性能测试实验',
-          creator: '李四',
-          createTime: '2025-1-8 18:00:00',
-          status: '未填写'
-        },
-        {
-          id: '3',
-          projectPlan: 'DD250218-JL03',
-          experimentNo: '31423766',
-          experimentName: '材料强度测试',
-          creator: '王五',
-          createTime: '2025-1-8 18:30:00',
-          status: '已填写'
-        },
-        {
-          id: '4',
-          projectPlan: 'DD250218-JL04',
-          experimentNo: '31423767',
-          experimentName: '耐久性测试实验',
-          creator: '赵六',
-          createTime: '2025-1-8 19:00:00',
-          status: '已填写'
-        },
-        {
-          id: '5',
-          projectPlan: 'DD250218-JL05',
-          experimentNo: '31423768',
-          experimentName: '环境适应性测试',
-          creator: '孙七',
-          createTime: '2025-1-8 19:30:00',
-          status: '未填写'
-        }
-      ],
-      total: 5
+      tableData: [], // 表格数据
+      total: 0 // 总条数
     };
   },
   created() {
@@ -126,28 +130,92 @@
   methods: {
     resetForm() {
       this.form = {
-        planCode: "",
-        creator: "",
+        projectName: "",
+        experimentCode: "",
+        createBy: "",
         createTime: [],
-        approver: ""
+        startTime: "",
+        endTime: "",
+        status: "",
+        pageNum: 1,
+        pageSize: 10
       };
     },
     handleSearch() {
+      this.form.pageNum = 1;
       this.getTableData();
     },
     handleEdit(row) {
-      console.log("编辑数据:", row);
+      this.$router.push({
+        path: "/dataManagement/originalRecordTest/detail",
+        query: { 
+          id: row.id,
+          type: 'edit'
+        }
+      });
     },
     handleDetail(id) {
       this.$router.push({
         path: "/dataManagement/originalRecordTest/detail",
-        query: { id }
+        query: { 
+          id,
+          type: 'detail'
+        }
       });
     },
+    handlePageChange(page) {
+      this.form.pageNum = page;
+      this.getTableData();
+    },
+    handleSizeChange(size) {
+      this.form.pageSize = size;
+      this.form.pageNum = 1;
+      this.getTableData();
+    },
+    handleDateChange(val) {
+      if (val) {
+        this.form.startTime = val[0];
+        this.form.endTime = val[1];
+      } else {
+        this.form.startTime = "";
+        this.form.endTime = "";
+      }
+    },
     getTableData() {
-      // TODO: 调用接口获取数据
-    //   this.tableData = [];
-    //   this.total = 0;
+      const params = {
+        pageNum: this.form.pageNum,
+        pageSize: this.form.pageSize,
+        createBy: this.form.createBy,
+        projectName: this.form.projectName,
+        experimentCode: this.form.experimentCode,
+        status: this.form.status,
+        startTime: this.form.startTime,
+        endTime: this.form.endTime
+      };
+      console.log('params',params)
+      
+      getList(params).then(res => {
+        if (res.code == 200) {
+          this.tableData = res.data.records || [];
+          this.total = res.data.total || 0;
+        }
+      });
+    },
+    getStatusType(status) {
+      const statusMap = {
+        '-1': 'info',
+        '1': 'warning',
+        '2': 'success'
+      };
+      return statusMap[status] || 'info';
+    },
+    getStatusText(status) {
+      const statusMap = {
+        '-1': '草稿箱',
+        '1': '未填写',
+        '2': '已填写'
+      };
+      return statusMap[status] || '未知';
     }
   }
 };
diff --git a/laboratory/src/views/dataManagement/originalRecordTest/service.js b/laboratory/src/views/dataManagement/originalRecordTest/service.js
new file mode 100644
index 0000000..4fc53e7
--- /dev/null
+++ b/laboratory/src/views/dataManagement/originalRecordTest/service.js
@@ -0,0 +1,15 @@
+import axios from '@/utils/request';
+
+// 列表
+export const getList = (data) => {
+  return axios.post('/api/t-test-method-confirm-sheet-original/pageList', { ...data })
+}
+// 详情
+export const getDetail = (data) => {
+  return axios.get('/open/t-test-method-confirm-sheet-original/getDetailById', { params:data })
+}
+
+//修改
+export const update = (data) => {
+  return axios.post('/api/t-test-method-confirm-sheet-original/update', { ...data })
+}

--
Gitblit v1.7.1