Kaynağa Gözat

性能验证评价审核

zhonghuizhen 6 ay önce
ebeveyn
işleme
2e2fc82553

+ 1 - 0
src/views/business/performance/experimental.vue

@@ -22,6 +22,7 @@
       :class="readonly ? 'readonly-form' : ''"
       @submit.native.prevent
     >
+    <div>流程进来</div>
       <div v-if="loadCompleted" class="config-form-container">
         <div class="left">
           <experimental-desc

+ 999 - 957
src/views/business/performance/experimentalView.vue

@@ -1,1043 +1,1085 @@
 <template>
-    <el-dialog
-      v-loading="loading"
-      :visible.sync="localVisible"
-      :close-on-click-modal="false"
-      :close-on-press-escape="false"
-      :show-close="false"
-      append-to-body
-      fullscreen
-      class="dialog experimental-dialog"
-      top="0"
-      @open="loadData"
-      @close="closeDialog"
-    >
+  <el-dialog
+    v-loading="loading"
+    :visible.sync="localVisible"
+    :close-on-click-modal="false"
+    :close-on-press-escape="false"
+    :show-close="false"
+    append-to-body
+    fullscreen
+    class="dialog experimental-dialog"
+    top="0"
+    @open="loadData"
+    @close="closeDialog"
+  >
     <div>列表进来</div>
-      <el-form
-        ref="form"
-        :label-width="formLabelWidth"
-        :model.sync="form"
-        :rules="rules"
-        class="config-form"
-        :class="readonly ? 'readonly-form' : ''"
-        @submit.native.prevent
-      >
-        <div v-if="loadCompleted" class="config-form-container">
-          <div class="left">
-            <experimental-desc
-              :step="configData.step || ''"
-              :criterion="configData.criterion || ''"
-              :formulas="configData.formulas || []"
-              :references="configData.references || []"
-              :readonly="readonly"
-            />
-            <basic-info :info="form" :readonly="readonly" />
-            <reagent-info :info="form.reagentPoList" :readonly="readonly" />
-            <param-info
-              v-if="$utils.isNotEmpty(configData && configData.params)"
-              :form-id="formId"
-              :info="form.shiYanCanShu"
-              :config-data="configData.params || []"
-              :readonly="readonly"
-              @updateParams="handleUpdateParams"
-            />
-          </div>
-          <div class="right">
-            <experimental-data
-              :exp="form.jiSuanJieGuo"
-              :form-id="formId"
-              :readonly="readonly"
-              @export="handleExport"
-              @import="handleImport"
-            />
-            <precision
-              v-if="$utils.isNotEmpty(form.jiSuanJieGuo)"
-              :info="form.jiSuanJieGuo"
-              :readonly="readonly"
-              @recalculate="handleRecalculate"
-            />
-            <conclusion
-              :result="form.shiYanJieLun"
-              :files="form.fuJian"
-              :readonly="readonly"
-              @updateData="handleUpdateData"
-            />
-          </div>
-        </div>
-      </el-form>
-      <div slot="title" class="config-dialog-header">
-        <div class="title">{{ configData.methodName || '' }}</div>
-        <div class="operate">
-          <template v-for="btn in toolbars">
-            <el-button
-              v-if="!btn.hidden"
-              :key="btn.key"
-              :type="btn.type"
-              :icon="btn.icon"
-              :size="btn.size || 'mini'"
-              @click="handleActionEvent(btn.key)"
-            >
-              {{ typeof btn.label === "function" ? btn.label() : btn.label }}
-            </el-button>
-          </template>
-        </div>
-      </div>
-      <el-dialog
-        fullscreen
-        :show-close="false"
-        :modal="false"
-        :visible.sync="dialogFormVisible"
-      >
-        <el-form id="pdfDom">
-          <div
-            style="
-              text-align: center;
-              font-size: 20px;
-              font-weight: bold;
-              margin-bottom: 20px;
-            "
-          >
-            {{ configData.methodName || '' }}
-          </div>
+    <el-form
+      ref="form"
+      :label-width="formLabelWidth"
+      :model.sync="form"
+      :rules="rules"
+      class="config-form"
+      :class="readonly ? 'readonly-form' : ''"
+      @submit.native.prevent
+    >
+      <div v-if="loadCompleted" class="config-form-container">
+        <div class="left">
           <experimental-desc
             :step="configData.step || ''"
             :criterion="configData.criterion || ''"
             :formulas="configData.formulas || []"
             :references="configData.references || []"
-            :readonly="true"
+            :readonly="readonly"
           />
-          <basic-info :info="form" :readonly="true" />
-          <reagent-info :info="form.reagentPoList" :readonly="true" :pdf="pdf" />
+          <basic-info :info="form" :readonly="readonly" />
+          <reagent-info :info="form.reagentPoList" :readonly="readonly" />
           <param-info
             v-if="$utils.isNotEmpty(configData && configData.params)"
             :form-id="formId"
             :info="form.shiYanCanShu"
             :config-data="configData.params || []"
-            :readonly="true"
+            :readonly="readonly"
             @updateParams="handleUpdateParams"
           />
-  
+        </div>
+        <div class="right">
           <experimental-data
             :exp="form.jiSuanJieGuo"
             :form-id="formId"
-            :readonly="true"
-            :pdf="pdf"
+            :readonly="readonly"
             @export="handleExport"
             @import="handleImport"
           />
           <precision
             v-if="$utils.isNotEmpty(form.jiSuanJieGuo)"
             :info="form.jiSuanJieGuo"
-            :readonly="true"
-            :pdf="pdf"
+            :readonly="readonly"
             @recalculate="handleRecalculate"
           />
           <conclusion
             :result="form.shiYanJieLun"
             :files="form.fuJian"
-            :readonly="true"
-            :pdf="pdf"
+            :readonly="readonly"
             @updateData="handleUpdateData"
           />
-        </el-form>
-        <div slot="title" class="config-dialog-header">
-          <div class="title">{{ configData.methodName }}</div>
-          <div class="operate">
-            <template>
-              <el-button style="width: 80px" type="success" @click="getpdf()">
-                导出
-              </el-button>
-              <el-button
-                style="width: 80px"
-                type="danger"
-                @click="dialogFormVisible = false"
-              >
-                取消
-              </el-button>
-            </template>
-          </div>
         </div>
-      </el-dialog>
-      
-      <flow-diagram-dialog
-        :visible="flowDiagramVisible"
-        :def-id="params &&  (params.instanceId  || params.taskId)? '': '1430598730687447040'"
-        :task-id="params && params.taskId ? params.taskId : ''"
-        :inst-id="params && params.instanceId ? params.instanceId : ''"
-        @close="(visible) => (flowDiagramVisible = visible)"
-      />
+      </div>
+    </el-form>
+    <div slot="title" class="config-dialog-header">
+      <div class="title">{{ configData.methodName || '' }}</div>
+      <div class="operate">
+        <template v-for="btn in toolbars">
+          <el-button
+            v-if="!btn.hidden"
+            :key="btn.key"
+            :type="btn.type"
+            :icon="btn.icon"
+            :size="btn.size || 'mini'"
+            @click="handleActionEvent(btn.key)"
+          >
+            {{ typeof btn.label === "function" ? btn.label() : btn.label }}
+          </el-button>
+        </template>
+      </div>
+    </div>
+    <el-dialog
+      fullscreen
+      :show-close="false"
+      :modal="false"
+      :visible.sync="dialogFormVisible"
+    >
+      <el-form id="pdfDom">
+        <div
+          style="
+            text-align: center;
+            font-size: 20px;
+            font-weight: bold;
+            margin-bottom: 20px;
+          "
+        >
+          {{ configData.methodName || '' }}
+        </div>
+        <experimental-desc
+          :step="configData.step || ''"
+          :criterion="configData.criterion || ''"
+          :formulas="configData.formulas || []"
+          :references="configData.references || []"
+          :readonly="true"
+        />
+        <basic-info :info="form" :readonly="true" />
+        <reagent-info :info="form.reagentPoList" :readonly="true" :pdf="pdf" />
+        <param-info
+          v-if="$utils.isNotEmpty(configData && configData.params)"
+          :form-id="formId"
+          :info="form.shiYanCanShu"
+          :config-data="configData.params || []"
+          :readonly="true"
+          @updateParams="handleUpdateParams"
+        />
+        <experimental-data
+          :exp="form.jiSuanJieGuo"
+          :form-id="formId"
+          :readonly="true"
+          :pdf="pdf"
+          @export="handleExport"
+          @import="handleImport"
+        />
+        <precision
+          v-if="$utils.isNotEmpty(form.jiSuanJieGuo)"
+          :info="form.jiSuanJieGuo"
+          :readonly="true"
+          :pdf="pdf"
+          @recalculate="handleRecalculate"
+        />
+        <conclusion
+          :result="form.shiYanJieLun"
+          :files="form.fuJian"
+          :readonly="true"
+          :pdf="pdf"
+          @updateData="handleUpdateData"
+        />
+      </el-form>
+      <div slot="title" class="config-dialog-header">
+        <div class="title">{{ configData.methodName }}</div>
+        <div class="operate">
+          <template>
+            <el-button style="width: 80px" type="success" @click="getpdf()">
+              导出
+            </el-button>
+            <el-button
+              style="width: 80px"
+              type="danger"
+              @click="dialogFormVisible = false"
+            >
+              取消
+            </el-button>
+          </template>
+        </div>
+      </div>
     </el-dialog>
-  </template>
-  
-  <script>
-  import { formRules } from './constants/index'
-  import ActionUtils from '@/utils/action'
-  import {
-    getExperimental,
-    saveExperimental,
-    getConfigDetail,
-    recalculate,
-    exportTemplate,
-    importTemplate,
-  } from '@/api/business/pv'
-  import { startFlow,saveDraft } from '@/api/platform/bpmn/bpmInst'
- // import { agree, reject } from '@/api/platform/bpmn/bpmTask'
-  import html2Canvas from 'html2canvas'
-  import JsPDF from 'jspdf'
-  import FlowDiagramDialog from '@/business/platform/bpmn/components/flow-diagram/dialog'
-  export default {
+    
+    <flow-diagram-dialog
+      :visible="flowDiagramVisible"
+      :def-id="'1430598730687447040'"
+      :task-id="taskId"
+      :inst-id="instid"
+      @close="(visible) => (flowDiagramVisible = visible)"
+    />
+    <approval-history-dialog
+      :visible="approvalHistoryVisible"
+      :inst-id="instid"
+      @close="(visible) => (approvalHistoryVisible = visible)"
+    />
+  </el-dialog>
+</template>
 
-    components: {
-      ExperimentalDesc: () => import('./components/experimental-desc'),
-      BasicInfo: () => import('./components/basic-info'),
-      ReagentInfo: () => import('./components/reagent-info'),
-      ParamInfo: () => import('./components/param-info'),
-      ExperimentalData: () => import('./components/experimental-data'),
-      Conclusion: () => import('./components/conclusion'),
-      Precision: () => import('./report/precision'),
-      FlowDiagramDialog
+<script>
+import { formRules } from './constants/index'
+import ActionUtils from '@/utils/action'
+import {
+  getExperimental,
+  saveExperimental,
+  getConfigDetail,
+  recalculate,
+  exportTemplate,
+  importTemplate,
+} from '@/api/business/pv'
+import { startFlow,saveDraft } from '@/api/platform/bpmn/bpmInst'
+import { agree, reject,doEndProcess} from '@/api/platform/bpmn/bpmTask'
+import html2Canvas from 'html2canvas'
+import JsPDF from 'jspdf'
+import FlowDiagramDialog from '@/business/platform/bpmn/components/flow-diagram/dialog'
+import ApprovalHistoryDialog from '@/business/platform/bpmn/components/approval-history/dialog'
+
+export default {
+  components: {
+    ExperimentalDesc: () => import('./components/experimental-desc'),
+    BasicInfo: () => import('./components/basic-info'),
+    ReagentInfo: () => import('./components/reagent-info'),
+    ParamInfo: () => import('./components/param-info'),
+    ExperimentalData: () => import('./components/experimental-data'),
+    Conclusion: () => import('./components/conclusion'),
+    Precision: () => import('./report/precision'),
+    FlowDiagramDialog,
+    ApprovalHistoryDialog
+  },
+  props: {
+    visible: {
+      type: Boolean,
+      default: false
     },
-    props: {
-      visible: {
-        type: Boolean,
-        default: false
-      },
-      readonly: {
-        type: Boolean,
-        default: false
-      },
-      params: {
-        type: Object,
-        default: () => {}
-      }
+    readonly: {
+      type: Boolean,
+      default: false
     },
-    data() {
-      const { userId } = this.$store.getters || {}
-      return {
-        localVisible: this.visible, // 定义一个本地变量
-        dialogFormVisible: false,
-        flowDiagramVisible: false,
-        pdf: 'pdf',
-        formLabelWidth: '110px',
-        configData: { methodName: '' },
-        formId: this.params.recordId,
-        form: {
-          xingNengZhiBia: '',
-          fangAnLeiXing: '',
-          bianZhiBuMen: '',
-          shiYanXiangMu: '',
-          shiYanFangFa: '',
-          yangBenLeiXing: '',
-          shiYanYiQi: '',
-          yiQiBianHao: '',
-          kaiShiShiJian: '',
-          jieShuShiJian: '',
-          bianZhiRen: '',
-          createBy: userId,
-          jieGuoDanWei: '',
-          baoLiuXiaoShu: 3,
-          beiZhu: '',
-          reagentPoList: [],
-          shiYanCanShu: {},
-          shiYanShuJu: [],
-          jiSuanJieGuo: {},
-          shiYanJieLun: '',
-          shiFouGuoShen: '',
-          fuJian: ''
+    params: {
+      type: Object,
+      default: () => {}
+    }
+  },
+  data() {
+    const { userId } = this.$store.getters || {}
+    return {
+      localVisible: this.visible,
+      dialogFormVisible: false,
+      flowDiagramVisible: false,
+      approvalHistoryVisible: false,
+      pdf: 'pdf',
+      formLabelWidth: '110px',
+      configData: { methodName: '' },
+      formId: this.params.recordId,
+      instid:'',
+      taskId:'',
+      form: {
+        xingNengZhiBia: '',
+        fangAnLeiXing: '',
+        bianZhiBuMen: '',
+        shiYanXiangMu: '',
+        shiYanFangFa: '',
+        yangBenLeiXing: '',
+        shiYanYiQi: '',
+        yiQiBianHao: '',
+        kaiShiShiJian: '',
+        jieShuShiJian: '',
+        bianZhiRen: '',
+        createBy: userId,
+        jieGuoDanWei: '',
+        baoLiuXiaoShu: 3,
+        beiZhu: '',
+        reagentPoList: [],
+        shiYanCanShu: {},
+        shiYanShuJu: [],
+        jiSuanJieGuo: {},
+        shiYanJieLun: '',
+        shiFouGuoShen: '',
+        fuJian: ''
+      },
+      rules: formRules,
+      loading: false,
+      loadCompleted: false,
+      validateList: [
+        'specimensName',
+        'targetValue',
+        'allowableSDr',
+        'allowableSDl',
+        'claimValue'
+      ]
+    }
+  },
+  computed: {
+    toolbars() {
+      return [
+        {
+          key: 'flowChart',
+          icon: 'ibps-icon-picture',
+          label: '流程图',
+          type: 'primary',
+          hidden: this.showToolBarsBtn('flowChart')
         },
-        rules: formRules,
-        loading: false,
-        loadCompleted: false,
-        toolbars: [
         {
-            key: 'flowChart',
-            icon: 'ibps-icon-picture',
-            label: '流程图',
-            type: 'primary',
-            hidden: this.showToolBarsBtn('flowChart')
-          },
-          {
-            key: 'pdf',
-            icon: 'ibps-icon-cube',
-            label: '导出为PDF',
-            type: 'primary',
-            hidden: this.showToolBarsBtn('pdf')
-          },
-          // { key: 'test', icon: 'ibps-icon-gg', label: '测试', type: 'warning', hidden: this.readonly },
-          {
-            key: 'save',
-            icon: 'ibps-icon-save',
-            label: '保存',
-            type: 'primary',
-            hidden: this.showToolBarsBtn('save')
-          },
-          {
-            key: 'submit',
-            icon: 'el-icon-s-promotion',
-            label: '提交',
-            type: 'primary',
-            hidden: this.showToolBarsBtn('submit')
-          },
-          {
-            key: 'sendBack',
-            icon: 'ibps-icon-check-square-o',
-            label: '退回',
-            type: 'primary',
-            hidden: this.showToolBarsBtn('sendBack')
-          },
-          // { key: 'submit', icon: 'ibps-icon-send', label: '提交', type: 'primary', hidden: this.readonly },
-          // { key: 'generate', icon: 'ibps-icon-cube', label: '生成报告', type: 'success', hidden: this.readonly },
-          {
-            key: 'cancel',
-            icon: 'el-icon-close',
-            label: '关闭',
-            type: 'danger',
-            hidden: this.showToolBarsBtn('cancel')
-          }
-        ],
-        validateList: [
-          'specimensName',
-          'targetValue',
-          'allowableSDr',
-          'allowableSDl',
-          'claimValue'
-        ]
-      }
-    },
-    watch: {
-      visible: {
-        handler(val) {
-          this.localVisible = val; // 当父组件的 visible 改变时,同步更新 localVisible
+          key: 'approvalHistory',
+          icon: 'ibps-icon-picture',
+          label: '审批历史',
+          type: 'primary',
+          hidden: this.showToolBarsBtn('approvalHistory')
         },
-        immediate: true
-      }
-    },
-    created() {
-      // 如果从myRecord传来了shiFouGuoShen,则使用它
-      if (this.params && this.params.shiFouGuoShen) {
-        // 确保form对象存在
-        if (!this.form) {
-          this.form = {}
+        {
+          key: 'pdf',
+          icon: 'ibps-icon-cube',
+          label: '导出为PDF',
+          type: 'primary',
+          hidden: this.showToolBarsBtn('pdf')
+        },
+        {
+          key: 'save',
+          icon: 'ibps-icon-save',
+          label: '保存',
+          type: 'primary',
+          hidden: this.showToolBarsBtn('save')
+        },
+        {
+          key: 'submit',
+          icon: 'el-icon-s-promotion',
+          label: this.getSubmitLabel(),
+          type: 'primary',
+          hidden: this.showToolBarsBtn('submit')
+        },
+        {
+          key: 'sendBack',
+          icon: 'ibps-icon-check-square-o',
+          label: '退回',
+          type: 'primary',
+          hidden: this.showToolBarsBtn('sendBack')
+        },
+        {
+          key: 'doEndProcess',
+          icon: 'ibps-icon-picture',
+          label: '终止',
+          type: 'primary',
+          hidden: this.showToolBarsBtn('doEndProcess')
+        },
+        {
+          key: 'cancel',
+          icon: 'el-icon-close',
+          label: '关闭',
+          type: 'danger',
+          hidden: this.showToolBarsBtn('cancel')
         }
-        this.form.shiFouGuoShen = this.params.shiFouGuoShen
-      }
-      this.getConfigData(this.params)
-      if (!this.params.recordId) {
-        this.loadCompleted = true
-        return
-      }
-      if(this.params.recordId ){
-          this.loadData()      
-      }
-      
-    },
-    methods: {
-      async fetchInstanceId(dataId) { //获取当前单据对应流程
-        const instres = await this.$common.request('query', {
-          key: 'xnyzkspjcxdylc',
-          params: [dataId]
-        });
-        return instres.variables.data[0]?.id_ || '';
-      },
-      getpdf() {
-        const newDiv = document.querySelector('#pdfDom')
-        const title = this.params.methodKey
-        html2Canvas(newDiv, {
-          allowTaint: false,
-          taintTest: false,
-          logging: false,
-          useCORS: true,
-          dpi: window.devicePixelRatio * 4, // 将分辨率提高到特定的DPI 提高四倍
-          scale: 4 // 按比例增加分辨率
-        }).then(function (canvas) {
-          const contentWidth = canvas.width
-          const contentHeight = canvas.height
-          const pageHeight = (contentWidth / 592.28) * 841.89
-          var leftHeight = contentHeight
-          var position = 0
-          const imgWidth = 595.28
-          const imgHeight = (592.28 / contentWidth) * contentHeight
-          const pageData = canvas.toDataURL('image/jpeg', 1.0)
-          const PDF = new JsPDF('', 'pt', 'a4')
-          if (leftHeight < pageHeight) {
-            PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
-          } else {
-            while (leftHeight > 0) {
-              PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
-              leftHeight -= pageHeight
-              position -= 841.89
-              if (leftHeight > 0) {
-                PDF.addPage()
-              }
-            }
-          }
-          PDF.save(title + '.pdf')
-        })
+      ]
+    }
+  },
+  watch: {
+    visible: {
+      handler(val) {
+        this.localVisible = val;
       },
-      // 获取数据
-      loadData() {
-        this.loading = true
-        getExperimental({ id: this.params.recordId })
-          .then((res) => {
-            this.loading = false
-            const data = res.data
-            if (!data) {
-              return
+      immediate: true
+    }
+  },
+  created() {
+    this.getConfigData(this.params)
+    if (!this.params.recordId) {
+      this.loadCompleted = true
+      return
+    }
+    if(this.params.recordId ){
+        this.loadData()      
+    }
+  },
+  methods: {
+    async fetchInstanceId(dataId) {
+      const instres = await this.$common.request('query', {
+        key: 'xnyzkspjcxdylc',
+        params: [dataId]
+      });
+      return instres.variables.data[0]?.id_ || '';
+    },
+    async fetchTaskId(instid) {
+      const taskres = await this.$common.request('query', {
+        key: 'xnyzcxlcid',
+        params: [instid]
+      });
+      return taskres.variables.data[0]?.id_ || '';
+    },
+    getpdf() {
+      const newDiv = document.querySelector('#pdfDom')
+      const title = this.params.methodKey
+      html2Canvas(newDiv, {
+        allowTaint: false,
+        taintTest: false,
+        logging: false,
+        useCORS: true,
+        dpi: window.devicePixelRatio * 4,
+        scale: 4
+      }).then(function (canvas) {
+        const contentWidth = canvas.width
+        const contentHeight = canvas.height
+        const pageHeight = (contentWidth / 592.28) * 841.89
+        var leftHeight = contentHeight
+        var position = 0
+        const imgWidth = 595.28
+        const imgHeight = (592.28 / contentWidth) * contentHeight
+        const pageData = canvas.toDataURL('image/jpeg', 1.0)
+        const PDF = new JsPDF('', 'pt', 'a4')
+        if (leftHeight < pageHeight) {
+          PDF.addImage(pageData, 'JPEG', 0, 0, imgWidth, imgHeight)
+        } else {
+          while (leftHeight > 0) {
+            PDF.addImage(pageData, 'JPEG', 0, position, imgWidth, imgHeight)
+            leftHeight -= pageHeight
+            position -= 841.89
+            if (leftHeight > 0) {
+              PDF.addPage()
             }
-            data.shiYanCanShu = data.shiYanCanShu
-              ? JSON.parse(data.shiYanCanShu)
-              : {}
-            data.shiYanShuJu = data.shiYanShuJu
-              ? JSON.parse(data.shiYanShuJu)
-              : []
-            data.jiSuanJieGuo = data.jiSuanJieGuo
-              ? JSON.parse(data.jiSuanJieGuo)
-              : {}
-            this.form = Object.assign(this.form, data)
-            this.loadCompleted = true
-            console.log(this.form)
-          })
-          .catch(() => {
-            this.loading = false
-          })
-      },
-      getConfigData({ targetId, methodId }) {
-        getConfigDetail({ id: targetId }).then((res) => {
-          const {
-            target,
-            targetKey,
-            experimentalConfigDetailPoList: methods
-          } = res.data || {}
-          const method = methods.find((i) => i.id === methodId) || {}
-          this.configData = {
-            target,
-            targetKey,
-            ...method,
-            params: this.$utils.isNotEmpty(method.params)
-              ? JSON.parse(method.params)
-              : [],
-            formulas: this.$utils.isNotEmpty(method.formulas)
-              ? JSON.parse(method.formulas)
-              : []
           }
-          console.log(this.configData)
-        })
-      },
-      handleActionEvent(key) {
-        switch (key) {
-          case 'save':
-            this.handleSaveDraft(this.form);
-            break;
-          case 'submit':
-            this.handleStartFlow(this.form);
-            /*
-            if (this.getSubmitLabel() === '同意') {
-              this.handleAgree({ taskId: this.params.taskId, data: this.form });
-            } else {
-              this.handleStartFlow(this.form);
-            }*/
-            break;
-            /*
-          case 'sendBack':
-            this.handleReject({ taskId: this.params.taskId, data: this.form });
-            break;*/
-          case 'generate':
-            this.handleGenerate();
-            break;
-          case 'cancel':
-            this.handleCancel();
-            break;
-          case 'test':
-            this.handleTest();
-            break;
-          case 'pdf':
-            this.dialogFormVisible = true;
-            break;
-          case 'flowChart':
-            this.flowDiagramVisible = true;
-            break;
-          default:
-            break;
         }
-      },
-      validateFormData() {
-        return new Promise((resolve, reject) => {
-          this.$refs.form.validate((valid) => {
-            if (!valid) {
-              this.$message.warning('请完善表单必填项后再进行操作!');
-              reject('Validation failed');
-            } else {
-              const { shiYanXiangMu } = this.form;
-              const regex = /[\/\\]/g;
-              if (regex.test(shiYanXiangMu)) {
-                this.form.shiYanXiangMu = shiYanXiangMu.replace(regex, '_');
-                this.$message.warning('【实验项目】中的【\\】与【/】已被转化为【_】');
-              }
-              resolve();
-            }
-          });
-        });
-      },
-      saveExperimentalData(idval,statusval) {
-        const {
-          kaiShiShiJian,
-          jieShuShiJian,
-          shiYanCanShu,
-          shiYanShuJu,
-          jiSuanJieGuo,
-          ...rest
-        } = this.form || {};
-        const submitData = {
-          ...rest,
-          kaiShiShiJian,
-          jieShuShiJian,
-          shiFouGuoShen: statusval,
-          id: idval || this.formId,
-          shiYanCanShu: this.$utils.isNotEmpty(shiYanCanShu)
-            ? JSON.stringify(shiYanCanShu)
-            : null,
-          shiYanShuJu: this.$utils.isNotEmpty(shiYanShuJu)
-            ? JSON.stringify(shiYanShuJu)
-            : null,
-          jiSuanJieGuo: this.$utils.isNotEmpty(jiSuanJieGuo)
-            ? JSON.stringify(jiSuanJieGuo)
-            : null,
-          xingNengZhiBia: this.configData.target,
-          fangAnLeiXing: this.configData.methodName,
-          zhiBiaoId: this.params.targetId,
-          fangFaKey: this.params.methodKey,
-          fangFaId: this.params.methodId,
-          //id: this.formId
-        };
-        return saveExperimental(submitData).then((res) => {
-          this.formId = res.data;
-          //this.$message.success('保存成功');
-        }).catch(() => {
-          //this.$message.error('保存失败');
-        });
-      },
-      async handleSaveDraft(data) {
-        data.pk = data.id;
-        const instid = await this.fetchInstanceId(data.id);
-        saveDraft({ 
-              defId: '1430598730687447040',
-              version: '0',
-              data: JSON.stringify(data),
-              proInstId: instid || ''
-            }).then((res) => {
-          this.$message.success('保存成功');
-          const id = res.variables.bizKey || '';
-          this.saveExperimentalData(id,'已暂存')
-        }).catch(() => {
-          this.$message.error('保存失败');
-        });
-      },
-      handleStartFlow(data) {
-        this.validateFormData()
-          .then(async () => {
-            const instid = await this.fetchInstanceId(data.id);
-            return startFlow({
-              defId: '1430598730687447040',
-              version: '0',
-              data: JSON.stringify(data),
-              proInstId: instid || ''
-            });
-          })
-          .then((res) => {
-            this.$message.success('提交成功');
-            this.visible = false;
-            const id = res.variables.bizKey || '';
-            return this.saveExperimentalData(id,'已编制')
-          })
-          .catch((error) => {
-              this.$message.error('启动失败');
-          });
-      },
-      /*
-      handleAgree(data) {
-        agree(data).then(() => {
-          this.$message.success('操作成功');
-            return this.saveExperimentalData(id,'已编制')
-          })
-          .catch((error) => {
-              this.$message.error('启动失败');
-          });
-      },
-      /*
-      handleAgree(data) {
-        agree(data).then(() => {
-          this.$message.success('操作成功');
-        }).catch(() => {
-          this.$message.error('操作失败');
-        });
-      },
-      handleReject(data) {
-        reject(data).then(() => {
-          this.$message.success('退回成功');
-        }).catch(() => {
-          this.$message.error('退回失败');
-        });
-      },*/
-      handleSave(key, callback) {
-        this.submitForm(key, callback)
-      },
-      handleSubmit(key, showMsg, callback) {
-        this.$refs.form.validate((valid) => {
-          if (!valid) {
-            return this.$message.warning('请完善表单必填项后再进行操作!')
+        PDF.save(title + '.pdf')
+      })
+    },
+    loadData() {
+      this.loading = true
+      getExperimental({ id: this.params.recordId })
+        .then(async (res) => {
+          this.loading = false
+          const data = res.data
+          if (!data) {
+            return
           }
-          // Excel sheet 不支持正反斜杆,需提前转化
-          const { shiYanXiangMu } = this.form
-          const regex = /[\/\\]/g
-  
-          if (regex.test(shiYanXiangMu)) {
-            this.form.shiYanXiangMu = shiYanXiangMu.replace(regex, '_')
-            this.$message.warning('【实验项目】中的【\\】与【/】已被转化为【_】')
+          data.shiYanCanShu = data.shiYanCanShu
+            ? JSON.parse(data.shiYanCanShu)
+            : {}
+          data.shiYanShuJu = data.shiYanShuJu
+            ? JSON.parse(data.shiYanShuJu)
+            : []
+          data.jiSuanJieGuo = data.jiSuanJieGuo
+            ? JSON.parse(data.jiSuanJieGuo)
+            : {}
+          this.form = Object.assign(this.form, data)
+          this.instid = await this.fetchInstanceId(data.id);
+          if (this.instid) {
+            this.taskId = await this.fetchTaskId(this.instid);
           }
-          this.submitForm(key, showMsg, callback)
-          // this.$confirm('确定要提交数据吗?', '提示', {
-          //     confirmButtonText: '确定',
-          //     cancelButtonText: '取消',
-          //     type: 'warning',
-          //     showClose: false,
-          //     closeOnClickModal: false,
-          //     closeOnPressEscape: false
-          // }).then(() => {
-          //     this.submitForm('submit', callback)
-          // })
+          this.loadCompleted = true
+          console.log(this.form)
         })
-      },
-      handleGenerate() {
-        this.$message.info('waiting...')
-      },
-      judgeArrayData(data) {
-        if (!data || !data.length) {
-          return true
-        }
-        return (
-          data.length === data.filter((i) => this.$utils.isNotEmpty(i)).length
-        )
-      },
-      submitForm(key, showMsg, callback) {
+        .catch(() => {
+          this.loading = false
+        })
+    },
+    getConfigData({ targetId, methodId }) {
+      getConfigDetail({ id: targetId }).then((res) => {
         const {
-          kaiShiShiJian,
-          jieShuShiJian,
-          shiYanCanShu,
-          shiYanShuJu,
-          jiSuanJieGuo,
-          ...rest
-        } = this.form || {}
-        const { rangeValue } = shiYanCanShu || {}
-        shiYanCanShu.range = rangeValue
-          ? [
-              100 - parseFloat(rangeValue) * 100,
-              100 + parseFloat(rangeValue) * 100
-            ]
-          : []
-        // 校验数组数据
-        for (let i = 0; i <= this.validateList.length; i++) {
-          const item = this.validateList[i]
-          if (this.judgeArrayData(shiYanCanShu[item])) {
-            continue
-          }
-          const t = this.configData.params.find((p) => p.key === item)
-          const msg = t
-            ? `${t.label}填写不完整,请补充后再提交`
-            : '性能验证实验参数部分信息填写不完整,请补充后再提交'
-          return this.$message.warning(msg)
-        }
-        if (new Date(kaiShiShiJian) > new Date(jieShuShiJian)) {
-          return this.$message.warning('实验开始时间不能大于实验结束时间!')
+          target,
+          targetKey,
+          experimentalConfigDetailPoList: methods
+        } = res.data || {}
+        const method = methods.find((i) => i.id === methodId) || {}
+        this.configData = {
+          target,
+          targetKey,
+          ...method,
+          params: this.$utils.isNotEmpty(method.params)
+            ? JSON.parse(method.params)
+            : [],
+          formulas: this.$utils.isNotEmpty(method.formulas)
+            ? JSON.parse(method.formulas)
+            : []
         }
-        // 组装提交数据
-        const submitData = {
-          ...rest,
-          kaiShiShiJian,
-          jieShuShiJian,
-          shiYanCanShu: this.$utils.isNotEmpty(shiYanCanShu)
-            ? JSON.stringify(shiYanCanShu)
-            : null,
-          shiYanShuJu: this.$utils.isNotEmpty(shiYanShuJu)
-            ? shiYanShuJu instanceof Array
-              ? JSON.stringify(shiYanShuJu)
-              : shiYanShuJu
-            : null,
-          jiSuanJieGuo: this.$utils.isNotEmpty(jiSuanJieGuo)
-            ? JSON.stringify(jiSuanJieGuo)
-            : null,
-          xingNengZhiBia: this.configData.target,
-          fangAnLeiXing: this.configData.methodName,
-          zhiBiaoId: this.params.targetId,
-          fangFaKey: this.params.methodKey,
-          fangFaId: this.params.methodId,
-          id: this.formId
-        }
-        const isEdit = !!this.formId
-        // 提交数据
-        saveExperimental(submitData).then((res) => {
-          this.formId = res.data
-          if (showMsg) {
-            this.$message.success('保存成功')
-          }
-          if (callback) {
-            callback()
+        console.log(this.configData)
+      })
+    },
+    handleActionEvent(key) {
+      switch (key) {
+        case 'save':
+          this.handleSaveDraft(this.form);
+          break;
+        case 'submit':
+          if (this.getSubmitLabel() === '同意') {
+            if(this.taskId){
+              this.handleAgree(this.taskId, this.form);
+            }else{
+              this.$message.warning('暂无流程信息!');
+            } 
+          } else {
+            this.handleStartFlow(this.form);
           }
-          // 提交时且有实验数据时,重新计算
-          if (key === 'submit' && isEdit && this.$utils.isNotEmpty(shiYanShuJu)) {
-            recalculate({ id: this.formId }).then((res) => {
-              this.form.jiSuanJieGuo = res.data
-              this.form.shiYanJieLun = res.data.reportResult
-            })
+          break;
+        case 'sendBack':
+            if(this.taskId){
+              this.handleReject(this.taskId, this.form );
+            }else{
+              this.$message.warning('暂无流程信息!');
+            }
+          break;
+        case 'approvalHistory':
+            if(this.taskId){
+              this.handleapprovalHistory(this.taskId, this.form);
+            }else{
+              this.$message.warning('暂无审批历史!');
+            }
+          break;
+        case 'doEndProcess':
+            if(this.taskId){
+              this.handleDoEndProcess(this.taskId, this.form)
+            }else{
+              this.$message.warning('暂无流程信息!');
+            }
+          break;
+        case 'generate':
+          this.handleGenerate();
+          break;
+        case 'cancel':
+          this.handleCancel();
+          break;
+        case 'test':
+          this.handleTest();
+          break;
+        case 'pdf':
+          this.dialogFormVisible = true;
+          break;
+        case 'flowChart':
+          this.flowDiagramVisible = true;
+          break;
+        default:
+          break;
+      }
+    },
+    handleapprovalHistory() {
+      this.approvalHistoryVisible = true
+    },
+    validateFormData() {
+      return new Promise((resolve, reject) => {
+        this.$refs.form.validate((valid) => {
+          if (!valid) {
+            this.$message.warning('请完善表单必填项后再进行操作!');
+            reject('Validation failed');
+          } else {
+            const { shiYanXiangMu } = this.form;
+            const regex = /[\/\\]/g;
+            if (regex.test(shiYanXiangMu)) {
+              this.form.shiYanXiangMu = shiYanXiangMu.replace(regex, '_');
+              this.$message.warning('【实验项目】中的【\\】与【/】已被转化为【_】');
+            }
+            resolve();
           }
+        });
+      });
+    },
+    saveExperimentalData(idval,statusval) {
+      const {
+        kaiShiShiJian,
+        jieShuShiJian,
+        shiYanCanShu,
+        shiYanShuJu,
+        jiSuanJieGuo,
+        ...rest
+      } = this.form || {};
+      const submitData = {
+        ...rest,
+        kaiShiShiJian,
+        jieShuShiJian,
+        shiFouGuoShen: statusval,
+        id: idval || this.formId,
+        shiYanCanShu: this.$utils.isNotEmpty(shiYanCanShu)
+          ? JSON.stringify(shiYanCanShu)
+          : null,
+        shiYanShuJu: this.$utils.isNotEmpty(shiYanShuJu)
+          ? JSON.stringify(shiYanShuJu)
+          : null,
+        jiSuanJieGuo: this.$utils.isNotEmpty(jiSuanJieGuo)
+          ? JSON.stringify(jiSuanJieGuo)
+          : null,
+        xingNengZhiBia: this.configData.target,
+        fangAnLeiXing: this.configData.methodName,
+        zhiBiaoId: this.params.targetId,
+        fangFaKey: this.params.methodKey,
+        fangFaId: this.params.methodId,
+      };
+      return saveExperimental(submitData).then((res) => {
+        this.formId = res.data;
+      }).catch(() => {
+      });
+    },
+    async handleSaveDraft(data) {
+      data.pk = data.id;
+      const instid = await this.fetchInstanceId(data.id);
+      saveDraft({ 
+            defId: '1430598730687447040',
+            version: '0',
+            data: JSON.stringify(data),
+            proInstId: instid || ''
+          }).then((res) => {
+        this.$message.success('保存成功');
+        const id = res.variables.bizKey || '';
+        this.saveExperimentalData(id,'已暂存')
+      }).catch(() => {
+        this.$message.error('保存失败');
+      });
+    },
+    handleStartFlow(data) {
+      this.validateFormData()
+        .then(async () => {
+          const instid = await this.fetchInstanceId(data.id);
+          return startFlow({
+            defId: '1430598730687447040',
+            version: '0',
+            data: JSON.stringify(data),
+            proInstId: instid || ''
+          });
         })
-      },
-      handleCancel() {
+        .then((res) => {
+          this.$message.success('提交成功');
+          this.visible = false;
+          const id = res.variables.bizKey || '';
+          return this.saveExperimentalData(id,'已编制')
+        })
+        .catch((error) => {
+            this.$message.error('启动失败');
+        });
+    },
+    handleAgree(taskId,data) {
+      if(data.shiFouGuoShen === '已编制'){
+          data.shiFouGuoShen === '已审核'
+      }else if(data.shiFouGuoShen === '已审核'){
+        data.shiFouGuoShen === '已完成'
+      }
+      agree({ 
+        opinion: '同意',
+        taskId: taskId,
+        data: JSON.stringify(data)
+      }).then(() => {
+        this.$message.success('操作成功');
+        this.saveExperimentalData(data.id,data.shiFouGuoShen)
         this.closeDialog()
-      },
-      closeDialog() {
-        this.$emit('update:visible', false); // 通知父组件更新 visible
-        this.$emit('refresh');
-      },
-      handleUpdateParams(value) {
-        this.form.shiYanCanShu = value
-      },
-      handleUpdateData(value) {
-        this.form = {
-          ...this.form,
-          ...value
-        }
-      },
-      handleExport() {
-        this.handleSubmit('beforeExport', false, () => {
-          exportTemplate({ id: this.formId }).then((res) => {
-            ActionUtils.download(
-              res.data,
-              `${this.configData.methodName}-${this.form.shiYanXiangMu}.xlsx`
-            )
-          })
+      }).catch(() => {
+        this.$message.error('操作失败');
+      });
+    },
+    handleReject(taskId,data) {
+      data.shiFouGuoShen = '已退回'
+      reject({
+              backHandMode: 'normal',
+              destination: '',
+              opinion: '退回修改',
+              rejectMode: 'reject',
+              taskId: taskId,
+              data: JSON.stringify(data)
+            }).then(() => {
+              this.$message.success('退回成功');
+              this.saveExperimentalData(data.id,data.shiFouGuoShen)
+              this.closeDialog()
+      }).catch(() => {
+              this.$message.error('退回失败');
+      });
+    },
+    handleDoEndProcess(taskId,data){
+      data.shiFouGuoShen = '已终止'
+      doEndProcess({
+        taskId: taskId,
+        endReason: '流程终止'
+      })
+        .then((response) => {
+          this.$message.success('终止成功');
+          this.saveExperimentalData(data.id,data.shiFouGuoShen)
+          this.closeDialog()
         })
-      },
-      handleImport() {
-        this.handleSubmit('beforeImport', false, () => {
-          this.importData()
+        .catch((err) => {
+          this.$message.error('终止失败');
         })
-      },
-      importData() {
-        const input = document.createElement('input')
-        input.type = 'file'
-        input.accept = '.xlsx'
-        input.onchange = (event) => {
-          const file = event.target.files[0]
-          const reader = new FileReader()
-          reader.onload = (event) => {
-            const data = new FormData()
-            data.append('id', this.formId)
-            data.append('applyFiles', file)
-            importTemplate(data)
-              .then((res) => {
-                this.$message.success('实验数据导入成功')
-                this.form.jiSuanJieGuo = res.data
-                this.form.shiYanJieLun = res.data.reportResult
-                this.form.shiYanShuJu = res.data.shiYanShuJu
-              })
-              .catch(({ state, cause }) => {
-                const errMsg = JSON.parse(cause)
-                let msgContent = ''
-                Object.keys(errMsg).forEach((key) => {
-                  let msgItem = '<div >'
-                  errMsg[key].forEach((item) => {
-                    msgItem += `<div>${item}</div>`
-                  })
-                  msgContent += `<div><div style="font-weight: bold;">${key}:</div>${msgItem}<div>`
-                })
-                this.$confirm(
-                  `<div style="font-size: 14px;">${msgContent}</div>`,
-                  '数据校验失败,请根据以下提示完善您的数据!',
-                  {
-                    confirmButtonText: '确认',
-                    showClose: false,
-                    showCancelButton: false,
-                    closeOnClickModal: false,
-                    dangerouslyUseHTMLString: true,
-                    customClass: 'errorTips',
-                    type: 'error'
-                  }
-                )
-                  .then(() => {})
-                  .catch(() => {})
-              })
-          }
-          reader.readAsBinaryString(file)
-        }
-        input.click()
-      },
-      handleRecalculate() {
-        this.submitForm('save', () => {
-          recalculate({ id: this.formId }).then((res) => {
-            this.$message.success('重新计算成功')
-            this.form.jiSuanJieGuo = res.data
-            this.form.shiYanJieLun = res.data.reportResult
-            this.form.shiYanShuJu = res.data.shiYanShuJu
-          })
-        })
-      },
-      handleTest() {
-        const o = {
-          xingNengZhiBia: '精密度',
-          fangAnLeiXing: 'EP15-A3精密度评价',
-          bianZhiBuMen: '1166703356459089920',
-          shiYanXiangMu: '测试项目',
-          shiYanFangFa: '测试方法',
-          yangBenLeiXing: '测试样本类型',
-          shiYanYiQi: '测试实验仪器',
-          yiQiBianHao: 'jyk-test-001',
-          kaiShiShiJian: '2024-05-01 09:00',
-          jieShuShiJian: '2024-05-05 17:00',
-          bianZhiRen: '1166772479054577664',
-          createBy: '1166771426615623680',
-          jieGuoDanWei: 'mmol/L',
-          baoLiuXiaoShu: 3,
-          beiZhu: '测试数据',
-          reagentPoList: [
-            {
-              changJia: 'BIO-RIO',
-              leiBie: '质控品',
-              piHao: 'test001',
-              shiJiMingCheng: '生化质控品',
-              youXiaoQi: '2025-05-01'
-            },
-            {
-              changJia: 'BIO-RIO',
-              leiBie: '校准品',
-              piHao: 'test002',
-              shiJiMingCheng: '生化校准品',
-              youXiaoQi: '2025-06-01'
-            },
-            {
-              changJia: 'BIO-RIO',
-              leiBie: '标准物',
-              piHao: 'test001',
-              shiJiMingCheng: '标准物',
-              youXiaoQi: '2025-05-01'
-            }
-          ],
-          shenHeRen: '1166673437578493952',
-          baoGaoShiJian: '2024-05-06',
-          fuJian: '1239940596743798784'
-        }
-        const t = JSON.parse(JSON.stringify(o))
-        this.form = {
-          ...this.form,
-          ...t,
-          shiYanCanShu: this.form.shiYanCanShu
+    },
+    handleSave(key, callback) {
+      this.submitForm(key, callback)
+    },
+    handleSubmit(key, showMsg, callback) {
+      this.$refs.form.validate((valid) => {
+        if (!valid) {
+          return this.$message.warning('请完善表单必填项后再进行操作!')
         }
-      },
-      // 控制工具栏按钮显示
-      showToolBarsBtn(key) {
-        // 在查阅状态时,只显示流程图、导出PDF和关闭按钮
-        if (this.readonly) {
-          // 允许显示的按钮:flowChart(流程图)、pdf(导出PDF)、cancel(关闭)
-          return !['flowChart', 'pdf', 'cancel'].includes(key)
+        const { shiYanXiangMu } = this.form
+        const regex = /[\/\\]/g
+
+        if (regex.test(shiYanXiangMu)) {
+          this.form.shiYanXiangMu = shiYanXiangMu.replace(regex, '_')
+          this.$message.warning('【实验项目】中的【\\】与【/】已被转化为【_】')
         }
-        
-        // 非查阅状态,根据shiFouGuoShen状态字段控制按钮显示
-        const status = (this.form && this.form.shiFouGuoShen) || '已暂存'
-        
-        // 已暂存状态显示流程图,导出pdf,关闭,保存,提交按钮
-        if (status === '已暂存' || status === '已退回') {
-          return !['flowChart', 'pdf', 'cancel', 'save', 'submit'].includes(key)
+        this.submitForm(key, showMsg, callback)
+      })
+    },
+    handleGenerate() {
+      this.$message.info('waiting...')
+    },
+    judgeArrayData(data) {
+      if (!data || !data.length) {
+        return true
+      }
+      return (
+        data.length === data.filter((i) => this.$utils.isNotEmpty(i)).length
+      )
+    },
+    submitForm(key, showMsg, callback) {
+      const {
+        kaiShiShiJian,
+        jieShuShiJian,
+        shiYanCanShu,
+        shiYanShuJu,
+        jiSuanJieGuo,
+        ...rest
+      } = this.form || {}
+      const { rangeValue } = shiYanCanShu || {}
+      shiYanCanShu.range = rangeValue
+        ? [
+            100 - parseFloat(rangeValue) * 100,
+            100 + parseFloat(rangeValue) * 100
+          ]
+        : []
+      for (let i = 0; i <= this.validateList.length; i++) {
+        const item = this.validateList[i]
+        if (this.judgeArrayData(shiYanCanShu[item])) {
+          continue
         }
-        
-        // 已编制状态显示流程图,导出pdf,关闭,保存,退回,提交按钮
-        if (status === '已编制') {
-          return !['flowChart', 'pdf', 'cancel', 'save', 'sendBack', 'submit'].includes(key)
+        const t = this.configData.params.find((p) => p.key === item)
+        const msg = t
+          ? `${t.label}填写不完整,请补充后再提交`
+          : '性能验证实验参数部分信息填写不完整,请补充后再提交'
+        return this.$message.warning(msg)
+      }
+      if (new Date(kaiShiShiJian) > new Date(jieShuShiJian)) {
+        return this.$message.warning('实验开始时间不能大于实验结束时间!')
+      }
+      const submitData = {
+        ...rest,
+        kaiShiShiJian,
+        jieShuShiJian,
+        shiYanCanShu: this.$utils.isNotEmpty(shiYanCanShu)
+          ? JSON.stringify(shiYanCanShu)
+          : null,
+        shiYanShuJu: this.$utils.isNotEmpty(shiYanShuJu)
+          ? shiYanShuJu instanceof Array
+            ? JSON.stringify(shiYanShuJu)
+            : shiYanShuJu
+          : null,
+        jiSuanJieGuo: this.$utils.isNotEmpty(jiSuanJieGuo)
+          ? JSON.stringify(jiSuanJieGuo)
+          : null,
+        xingNengZhiBia: this.configData.target,
+        fangAnLeiXing: this.configData.methodName,
+        zhiBiaoId: this.params.targetId,
+        fangFaKey: this.params.methodKey,
+        fangFaId: this.params.methodId,
+        id: this.formId
+      }
+      const isEdit = !!this.formId
+      saveExperimental(submitData).then((res) => {
+        this.formId = res.data
+        if (showMsg) {
+          this.$message.success('保存成功')
         }
-        
-        // 已审核状态显示流程图,导出pdf,关闭,保存,退回,提交按钮
-        if (status === '已审核') {
-          return !['flowChart', 'pdf', 'cancel', 'save', 'sendBack', 'submit'].includes(key)
+        if (callback) {
+          callback()
         }
-        
-        // 已完成,已终止状态和查阅时显示一致
-        if (status === '已完成' || status === '已终止') {
-          return !['flowChart', 'pdf', 'cancel'].includes(key)
+        if (key === 'submit' && isEdit && this.$utils.isNotEmpty(shiYanShuJu)) {
+          recalculate({ id: this.formId }).then((res) => {
+            this.form.jiSuanJieGuo = res.data
+            this.form.shiYanJieLun = res.data.reportResult
+          })
         }
-        
-        // 默认显示流程图,导出pdf,关闭,保存,提交按钮
-        return !['flowChart', 'pdf', 'cancel', 'save', 'submit'].includes(key)
-      },
-      // 获取提交按钮的标签
-      getSubmitLabel() {
-        const status = (this.form && this.form.shiFouGuoShen) || '已暂存'
-        // 已编制和已审核状态下,提交按钮显示为"同意"
-        if (status === '已编制' || status === '已审核') {
-          return '同意'
+      })
+    },
+    handleCancel() {
+      this.closeDialog()
+    },
+    closeDialog() {
+      this.$emit('update:visible', false);
+      this.$emit('refresh');
+    },
+    handleUpdateParams(value) {
+      this.form.shiYanCanShu = value
+    },
+    handleUpdateData(value) {
+      this.form = {
+        ...this.form,
+        ...value
+      }
+    },
+    handleExport() {
+      this.handleSubmit('beforeExport', false, () => {
+        exportTemplate({ id: this.formId }).then((res) => {
+          ActionUtils.download(
+            res.data,
+            `${this.configData.methodName}-${this.form.shiYanXiangMu}.xlsx`
+          )
+        })
+      })
+    },
+    handleImport() {
+      this.handleSubmit('beforeImport', false, () => {
+        this.importData()
+      })
+    },
+    importData() {
+      const input = document.createElement('input')
+      input.type = 'file'
+      input.accept = '.xlsx'
+      input.onchange = (event) => {
+        const file = event.target.files[0]
+        const reader = new FileReader()
+        reader.onload = (event) => {
+          const data = new FormData()
+          data.append('id', this.formId)
+          data.append('applyFiles', file)
+          importTemplate(data)
+            .then((res) => {
+              this.$message.success('实验数据导入成功')
+              this.form.jiSuanJieGuo = res.data
+              this.form.shiYanJieLun = res.data.reportResult
+              this.form.shiYanShuJu = res.data.shiYanShuJu
+            })
+            .catch(({ state, cause }) => {
+              const errMsg = JSON.parse(cause)
+              let msgContent = ''
+              Object.keys(errMsg).forEach((key) => {
+                let msgItem = '<div >'
+                errMsg[key].forEach((item) => {
+                  msgItem += `<div>${item}</div>`
+                })
+                msgContent += `<div><div style="font-weight: bold;">${key}:</div>${msgItem}<div>`
+              })
+              this.$confirm(
+                `<div style="font-size: 14px;">${msgContent}</div>`,
+                '数据校验失败,请根据以下提示完善您的数据!',
+                {
+                  confirmButtonText: '确认',
+                  showClose: false,
+                  showCancelButton: false,
+                  closeOnClickModal: false,
+                  dangerouslyUseHTMLString: true,
+                  customClass: 'errorTips',
+                  type: 'error'
+                }
+              )
+                .then(() => {})
+                .catch(() => {})
+            })
         }
-        // 其他状态下显示为"提交"
-        return '提交'
+        reader.readAsBinaryString(file)
+      }
+      input.click()
+    },
+    handleRecalculate() {
+      this.submitForm('save', () => {
+        recalculate({ id: this.formId }).then((res) => {
+          this.$message.success('重新计算成功')
+          this.form.jiSuanJieGuo = res.data
+          this.form.shiYanJieLun = res.data.reportResult
+          this.form.shiYanShuJu = res.data.shiYanShuJu
+        })
+      })
+    },
+    handleTest() {
+      const o = {
+        xingNengZhiBia: '精密度',
+        fangAnLeiXing: 'EP15-A3精密度评价',
+        bianZhiBuMen: '1166703356459089920',
+        shiYanXiangMu: '测试项目',
+        shiYanFangFa: '测试方法',
+        yangBenLeiXing: '测试样本类型',
+        shiYanYiQi: '测试实验仪器',
+        yiQiBianHao: 'jyk-test-001',
+        kaiShiShiJian: '2024-05-01 09:00',
+        jieShuShiJian: '2024-05-05 17:00',
+        bianZhiRen: '1166772479054577664',
+        createBy: '1166771426615623680',
+        jieGuoDanWei: 'mmol/L',
+        baoLiuXiaoShu: 3,
+        beiZhu: '测试数据',
+        reagentPoList: [
+          {
+            changJia: 'BIO-RIO',
+            leiBie: '质控品',
+            piHao: 'test001',
+            shiJiMingCheng: '生化质控品',
+            youXiaoQi: '2025-05-01'
+          },
+          {
+            changJia: 'BIO-RIO',
+            leiBie: '校准品',
+            piHao: 'test002',
+            shiJiMingCheng: '生化校准品',
+            youXiaoQi: '2025-06-01'
+          },
+          {
+            changJia: 'BIO-RIO',
+            leiBie: '标准物',
+            piHao: 'test001',
+            shiJiMingCheng: '标准物',
+            youXiaoQi: '2025-05-01'
+          }
+        ],
+        shenHeRen: '1166673437578493952',
+        baoGaoShiJian: '2024-05-06',
+        fuJian: '1239940596743798784'
+      }
+      const t = JSON.parse(JSON.stringify(o))
+      this.form = {
+        ...this.form,
+        ...t,
+        shiYanCanShu: this.form.shiYanCanShu
       }
+    },
+    showToolBarsBtn(key) {
+      if (this.readonly) {
+        return !['flowChart','approvalHistory', 'pdf', 'cancel'].includes(key)
+      }
+      
+      const status = (this.form && this.form.shiFouGuoShen) || '已暂存'
+      
+      if (status === '已暂存' || status === '已退回') {
+        return !['flowChart','approvalHistory', 'pdf', 'cancel', 'save', 'submit'].includes(key)
+      }
+      
+      if (status === '已编制') {
+        return !['flowChart','approvalHistory', 'pdf', 'cancel', 'save', 'sendBack','doEndProcess', 'submit'].includes(key)
+      }
+      
+      if (status === '已审核') {
+        return !['flowChart','approvalHistory', 'pdf', 'cancel', 'save', 'sendBack','doEndProcess', 'submit'].includes(key)
+      }
+      
+      if (status === '已完成' || status === '已终止') {
+        return !['flowChart','approvalHistory', 'pdf', 'cancel'].includes(key)
+      }
+      
+      return !['flowChart', 'pdf', 'cancel', 'save', 'submit'].includes(key)
+    },
+    getSubmitLabel() {
+      const status = (this.form && this.form.shiFouGuoShen) || '已暂存'
+      if (status === '已编制' || status === '已审核') {
+        return '同意'
+      }
+      return '提交'
     }
   }
-  </script>
-  <style lang="scss" scoped>
-  .experimental-dialog {
-    ::v-deep {
-      .el-dialog__header {
-        padding: 15px 20px 16px;
-      }
+}
+</script>
+
+<style lang="scss" scoped>
+.experimental-dialog {
+  ::v-deep {
+    .el-dialog__header {
+      padding: 15px 20px 16px;
     }
-  
-    #pdfDom {
-      padding: 60px 100px;
-      box-sizing: border-box;
-  
-      .info-container {
-        margin-bottom: 20px !important;
-      }
-  
-      ::v-deep {
-        .info-item {
-          .title {
-            height: 20px;
-            line-height: 20px;
-            font-size: 16px;
-            font-weight: bold;
-            margin-bottom: 10px;
-  
-            .ibps-icon-star {
-              color: #fb9600;
-              margin-right: 5px;
-            }
-          }
-  
-          .el-form-item {
-            margin-bottom: 0 !important;
-  
-            &__label {
-              font-size: 14px !important;
-              color: #606266;
-            }
-  
-            &__content {
-              .el-input,
-              .el-select,
-              .el-input-number {
-                width: 100%;
-              }
-  
-              .el-textarea .el-input__count {
-                padding: 0 5px;
-                line-height: initial;
-              }
-  
-              .el-radio,
-              .el-checkbox {
-                margin-right: 10px;
-              }
-            }
+  }
+
+  #pdfDom {
+    padding: 60px 100px;
+    box-sizing: border-box;
+
+    .info-container {
+      margin-bottom: 20px !important;
+    }
+
+    ::v-deep {
+      .info-item {
+        .title {
+          height: 20px;
+          line-height: 20px;
+          font-size: 16px;
+          font-weight: bold;
+          margin-bottom: 10px;
+
+          .ibps-icon-star {
+            color: #fb9600;
+            margin-right: 5px;
           }
-  
-          .el-table th.el-table__cell > .cell,
-          .el-table td.el-table__cell {
-            color: #606266;
+        }
+
+        .el-form-item {
+          margin-bottom: 0 !important;
+
+          &__label {
             font-size: 14px !important;
+            color: #606266;
           }
-  
-          .el-button--mini {
-            padding: 5px 12px;
+
+          &__content {
+            .el-input,
+            .el-select,
+            .el-input-number {
+              width: 100%;
+            }
+
+            .el-textarea .el-input__count {
+              padding: 0 5px;
+              line-height: initial;
+            }
+
+            .el-radio,
+            .el-checkbox {
+              margin-right: 10px;
+            }
           }
         }
+
+        .el-table th.el-table__cell > .cell,
+        .el-table td.el-table__cell {
+          color: #606266;
+          font-size: 14px !important;
+        }
+
+        .el-button--mini {
+          padding: 5px 12px;
+        }
       }
     }
-    .config-dialog-header {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-      .title {
-        line-height: 24px;
-        font-size: 18px;
-        color: #303133;
-      }
+  }
+  .config-dialog-header {
+    display: flex;
+    justify-content: space-between;
+    align-items: center;
+    .title {
+      line-height: 24px;
+      font-size: 18px;
+      color: #303133;
     }
-    .config-form {
-      &-container {
-        position: relative;
-        width: 100%;
-        height: calc(100vh - 60px);
-        overflow: auto;
-        display: flex;
-        .left,
-        .right {
-          width: 50%;
-          // min-height: 100%;
-          height: 100%;
-          overflow-y: auto;
-          padding: 15px 20px;
-          box-sizing: border-box;
-          .info-container {
-            margin-bottom: 20px;
-            &:last-child {
-              margin-bottom: 0;
-            }
+  }
+  .config-form {
+    &-container {
+      position: relative;
+      width: 100%;
+      height: calc(100vh - 60px);
+      overflow: auto;
+      display: flex;
+      .left,
+      .right {
+        width: 50%;
+        height: 100%;
+        overflow-y: auto;
+        padding: 15px 20px;
+        box-sizing: border-box;
+        .info-container {
+          margin-bottom: 20px;
+          &:last-child {
+            margin-bottom: 0;
           }
-          ::v-deep {
-            .info-item {
-              .title {
-                height: 20px;
-                line-height: 20px;
-                font-size: 16px;
-                font-weight: bold;
-                margin-bottom: 10px;
-                .ibps-icon-star {
-                  color: #fb9600;
-                  margin-right: 5px;
-                }
-              }
-              .el-form-item {
-                margin-bottom: 0 !important;
-                &__label {
-                  font-size: 14px !important;
-                  color: #606266;
-                }
-                &__content {
-                  .el-input,
-                  .el-select,
-                  .el-input-number {
-                    width: 100%;
-                  }
-                  .el-textarea .el-input__count {
-                    padding: 0 5px;
-                    line-height: initial;
-                  }
-                  .el-radio,
-                  .el-checkbox {
-                    margin-right: 10px;
-                  }
-                }
+        }
+        ::v-deep {
+          .info-item {
+            .title {
+              height: 20px;
+              line-height: 20px;
+              font-size: 16px;
+              font-weight: bold;
+              margin-bottom: 10px;
+              .ibps-icon-star {
+                color: #fb9600;
+                margin-right: 5px;
               }
-              .el-table th.el-table__cell > .cell,
-              .el-table td.el-table__cell {
-                color: #606266;
+            }
+            .el-form-item {
+              margin-bottom: 0 !important;
+              &__label {
                 font-size: 14px !important;
+                color: #606266;
               }
-              .el-button--mini {
-                padding: 5px 12px;
+              &__content {
+                .el-input,
+                .el-select,
+                .el-input-number {
+                  width: 100%;
+                }
+                .el-textarea .el-input__count {
+                  padding: 0 5px;
+                  line-height: initial;
+                }
+                .el-radio,
+                .el-checkbox {
+                  margin-right: 10px;
+                }
               }
             }
+            .el-table th.el-table__cell > .cell,
+            .el-table td.el-table__cell {
+              color: #606266;
+              font-size: 14px !important;
+            }
+            .el-button--mini {
+              padding: 5px 12px;
+            }
           }
         }
-        .left {
-          &::before {
-            content: '';
-            width: 0;
-            height: 100%;
-            border-left: 1px dashed #dcdfe6;
-            position: absolute;
-            top: 0;
-            left: 50%;
-          }
+      }
+      .left {
+        &::before {
+          content: '';
+          width: 0;
+          height: 100%;
+          border-left: 1px dashed #dcdfe6;
+          position: absolute;
+          top: 0;
+          left: 50%;
         }
       }
     }
   }
-  </style>
+}
+</style>

+ 4 - 2
src/views/business/performance/myRecord.vue

@@ -63,7 +63,7 @@
       }))
       return {
         userOption,
-        title: '性能验证记录',
+        title: '我的快速评价',
         pkKey: 'id', // 主键  如果主键不是pk需要传主键
         loading: true,
         height: document.clientHeight,
@@ -79,8 +79,10 @@
         listConfig: {
           toolbars: [{ key: 'search' }, { key: 'remove' }],
           searchForm: {
-            model: this.searchFormData, // 新增:绑定数据模型
+            model: this.searchFormData, // 新增:绑定数据模型               
+            itemWidth: 250,
             forms: [
+
               { prop: 'Q^shi_yan_xiang_mu_^SL', label: '实验项目' },
               //{ prop: 'Q^xing_neng_zhi_bia^SL', label: '性能指标', fieldType: 'slot', slotName: 'xingNengZhiBiaSearch' },
               { prop: 'Q^xing_neng_zhi_bia^SL', label: '性能指标' },

+ 1 - 0
src/views/business/performance/record.vue

@@ -66,6 +66,7 @@ export default {
       listConfig: {
         toolbars: [{ key: 'search' }, { key: 'remove' }],
         searchForm: {
+          itemWidth: 250,
           forms: [
             // { prop: 'Q^name_^SL', label: '性能指标', fieldType: 'select', options: this.targetOption },
             // { prop: 'Q^fang_an_lei_xing_^SL', label: '方案类型', fieldType: 'select', options: this.methodOption },

+ 356 - 0
src/views/business/performance/recordVerify.vue

@@ -0,0 +1,356 @@
+<template>
+  <div class="main-container">
+    <ibps-crud
+      ref="crud"
+      :display-field="title"
+      :height="height"
+      :data="listData"
+      :toolbars="listConfig.toolbars"
+      :search-form="listConfig.searchForm"
+      :pk-key="pkKey"
+      :columns="listConfig.columns"
+      :row-handle="listConfig.rowHandle"
+      :pagination="pagination"
+      :loading="loading"
+      @action-event="handleAction"
+      @sort-change="handleSortChange"
+      @pagination-change="handlePaginationChange"
+      @row-dblclick="handleRowDblclick"
+    >
+      <template slot="time" slot-scope="scope">
+        <div>起:{{ scope.row.kaiShiShiJian }}</div>
+        <div>止:{{ scope.row.jieShuShiJian }}</div>
+      </template>
+      <!--
+      <template slot="xingNengZhiBiaSearch">
+        <ibps-link-data
+          v-model="searchFormData['Q^xing_neng_zhi_bia^SL']"
+          template-key="xnyzxnzbzly"
+          placeholder="请选择"
+          style="width: 100%"
+        />
+      </template>
+      -->
+    </ibps-crud>
+    <ExperimentalView
+      v-if="showConfig"
+      :visible.sync="showConfig"
+      :params="params"
+      :readonly="readonly"
+      @refresh="loadData"
+      @close="() => (showConfig = false)"
+    />
+  </div>
+</template>
+
+<script>
+import { queryExperimental, removeExperimental } from '@/api/business/pv'
+import ActionUtils from '@/utils/action'
+import FixHeight from '@/mixins/height'
+import IbpsLinkData from '@/business/platform/data/templaterender/link-data'
+
+export default {
+  components: {
+    ExperimentalView: () => import('./experimentalView'),
+    'ibps-link-data': IbpsLinkData
+  },
+  mixins: [FixHeight],
+  data() {
+    const { userList = [] } = this.$store.getters || {}
+    const userOption = userList.map((item) => ({
+      label: item.userName,
+      value: item.userId
+    }))
+    return {
+      userOption,
+      title: '快速评价审核',
+      pkKey: 'id', // 主键  如果主键不是pk需要传主键
+      loading: true,
+      height: document.clientHeight,
+      listData: [],
+      pagination: {},
+      sorts: {},
+      searchFormData: {}, // 新增:为搜索表单创建独立的数据模型
+      showConfig: false,
+      readonly: false,
+      params: {},
+      targetOption: [],
+      methodOption: [],
+      listConfig: {
+        toolbars: [{ key: 'search' }, { key: 'remove' }],
+        searchForm: {
+          model: this.searchFormData, // 新增:绑定数据模型
+          itemWidth: 250,
+          forms: [
+            { prop: 'Q^shi_yan_xiang_mu_^SL', label: '实验项目' },
+            //{ prop: 'Q^xing_neng_zhi_bia^SL', label: '性能指标', fieldType: 'slot', slotName: 'xingNengZhiBiaSearch' },
+            { prop: 'Q^xing_neng_zhi_bia^SL', label: '性能指标' },
+            { prop: 'Q^fang_an_lei_xing_^SL', label: '方案类型' },
+            { prop: 'Q^shi_yan_fang_fa_^SL', label: '实验方法' },
+            { prop: 'Q^yang_ben_lei_xing^SL', label: '样本类型' },
+            {
+              prop: 'Q^shi_fou_guo_shen_^SL',
+              label: '状态',
+              fieldType: 'select',
+              options: [
+                { label: '已编制', value: '已编制' },
+                { label: '已审核', value: '已审核' }
+              ]
+            },
+            {
+              prop: ['Q^create_time_^DL', 'Q^create_time_^DG'],
+              label: '创建时间',
+              fieldType: 'daterange'
+            }
+          ]
+        },
+        // 表格字段配置
+        columns: [
+          { prop: 'xingNengZhiBia', label: '性能指标', tags: [], width: 120 },
+          {
+            prop: 'fangAnLeiXing',
+            label: '方案类型',
+            tags: [],
+            minWidth: 125
+          },
+          
+          { prop: 'shiYanXiangMu', label: '实验项目', width: 120 },
+          { prop: 'shiYanFangFa', label: '实验方法', width: 120 },
+          { prop: 'yangBenLeiXing', label: '样本类型', width: 100 },
+          { prop: 'shiYanYiQi', label: '实验仪器', width: 120 },
+          {
+            prop: 'timeRange',
+            label: '实验时间',
+            slotName: 'time',
+            width: 140
+          },
+          { prop: 'shiFouGuoShen', label: '状态', width: 80 },
+          {
+            prop: 'bianZhiRen',
+            label: '实验人',
+            tags: userOption,
+            width: 90
+          },
+          { prop: 'createBy', label: '评价人', tags: userOption, width: 90 },
+          {
+            prop: 'createTime',
+            label: '创建时间',
+            dateFormat: 'yyyy-MM-dd HH:mm',
+            sortable: 'custom',
+            width: 130
+          }
+        ],
+        rowHandle: {
+          effect: 'display',
+          width: 90,
+          actions: [
+            {
+              key: 'edit',
+              label: '审核',
+              type: 'primary',
+              icon: 'ibps-icon-edit'
+            }
+          
+          ]
+        }
+      }
+    }
+  },
+  created() {
+    this.loadData()
+  },
+  methods: {
+    // 加载数据
+    loadData() {
+      this.loading = true
+      queryExperimental(this.getSearchFormData())
+        .then((res) => {
+          ActionUtils.handleListData(this, res.data)
+          this.loading = false
+        })
+        .catch(() => {
+          this.loading = false
+        })
+    },
+    /**
+     * 获取格式化参数
+     */
+     getSearchFormData() {
+      const searchParam = this.$refs['crud'] ? this.$refs['crud'].getSearcFormData() : {}
+       
+      const userRole = this.$store.getters.userInfo.role || []
+      const jsfzrFlag = userRole.some(role => role.alias === 'jsfzr') 
+      const zcFlag = userRole.some(role => role.alias === 'zhsfzr') 
+     // 技术负责人,看到已审核的数据
+      if (jsfzrFlag) {
+         searchParam['Q^shi_fou_guo_shen_^S'] = '已审核'
+         return ActionUtils.formatParams(searchParam, this.pagination, this.sorts)
+      }
+      if (zcFlag) {// 专业组组长,看到自己主部门已编制的数据
+         searchParam['Q^shi_fou_guo_shen_^S'] = '已编制'
+         const { mainPosition } = this.$store.getters    //主部门数据
+         if (mainPosition) {
+            searchParam['Q^bian_zhi_bu_men_^S'] = mainPosition.id
+         }
+         return ActionUtils.formatParams(searchParam, this.pagination, this.sorts)
+      }
+      //系统管理员  看到所有已编制\已审核数据
+  
+      let parameters = [     //默认查询
+        {
+            parameters: [
+            {
+              relation: 'OR',
+              parameters: [
+                {
+                  key: 'Q^shi_fou_guo_shen_^S',
+                  value: '已编制',
+                  param: 'status'
+                },
+                {
+                  key: 'Q^shi_fou_guo_shen_^S',
+                  value: '已审核',
+                  param: 'status1'
+                }
+              ]
+            }
+          ]
+        }
+      ]
+      if (Object.keys(searchParam).length) { // 搜索栏查询
+        // 查询条件不为空,则加入parameters
+        const statusArr = Object.keys(searchParam).filter((key) =>
+          key.includes('shi_fou_guo_shen_')
+        )
+        const notstatusArr = Object.keys(searchParam).filter(
+          (key) => key.includes('shi_fou_guo_shen_') === false
+        )
+        if (statusArr.length > 0) {
+          // 加入搜索栏状态查询
+          parameters[0].parameters[0] = {
+            key: statusArr[0],
+            value: searchParam[statusArr[0]],
+            param: 'status'
+          }
+        }
+        if (notstatusArr.length > 0) {  
+          // 加入搜索栏其他查询
+          notstatusArr.forEach((el) => {
+            parameters[0].parameters.push({
+              key: el,
+              value: searchParam[el]
+            })
+          })
+        }
+      }
+      const param = {
+        parameters: parameters,
+        ...ActionUtils.formatParams(null, this.pagination, this.sorts)
+      }
+      return param
+     // parameters[0].parameters.push({
+     //   key: 'Q^di_dian_^S',
+      //  value: second || first
+     // }) 
+    },
+    /**
+     * 处理分页事件
+     */
+    handlePaginationChange(page) {
+      ActionUtils.setPagination(this.pagination, page)
+      this.loadData()
+    },
+    /**
+     * 处理排序
+     */
+    handleSortChange(sort) {
+      ActionUtils.setSorts(this.sorts, sort)
+      this.loadData()
+    },
+    /**
+     * 查询
+     */
+    search() {
+      this.loadData()
+    },
+    /**
+     * 处理按钮事件
+     */
+    handleAction(command, position, selection, data) {
+      switch (command) {
+        case 'search':
+          ActionUtils.setFirstPagination(this.pagination)
+          this.search()
+          break
+        case 'edit':
+        case 'detail': // 新增查阅只读
+          this.handleEdit(data, command)
+          break
+        case 'report':
+          this.handleReport(data)
+          break
+        case 'remove':
+          ActionUtils.removeRecord(selection)
+            .then((ids) => {
+              this.handleRemove(ids)
+            })
+            .catch(() => {})
+          break
+        default:
+          break
+      }
+    },
+    /**
+     * 处理编辑
+     */
+    async handleEdit(data, key) {
+      const { id, zhiBiaoId, fangFaId, fangFaKey, shiFouGuoShen } = data || {}
+      this.params = {
+        targetId: zhiBiaoId,
+        methodId: fangFaId,
+        methodKey: fangFaKey,
+        recordId: id,
+        shiFouGuoShen: shiFouGuoShen
+      }
+      this.readonly = key === 'detail'
+      this.showConfig = true // Ensure only experimentalView is opened
+    },
+    handleReport(data) {
+      console.log('wwww')
+    },
+    /**
+     * 处理删除
+     */
+    handleRemove(ids) {
+      // return this.$message.warning('避免误删测试数据,联系开发删除')
+      removeExperimental({ ids })
+        .then(() => {
+          ActionUtils.removeSuccessMessage()
+          this.search()
+        })
+        .catch(() => {})
+    },
+    handleRowDblclick(row) {
+      this.handleEdit(row, 'detail')
+    }
+  }
+}
+</script>
+<style lang="scss">
+.attachment-uploader-dialog {
+  .el-dialog__body {
+    height: calc(57vh - 100px) !important;
+  }
+}
+</style>
+<style lang="scss" scoped>
+.main-container ::v-deep .el-table__body-wrapper {
+.el-table__row {
+  td:last-child {
+    .cell {
+      text-align: center;
+    }
+  }
+}
+}
+</style>