zouyu
2025-03-17 b34c4bfb96b9517ca489982e94abf66e3d7c4b66
检验任务代码迁移
已添加2个文件
已修改7个文件
4095 ■■■■ 文件已修改
src/api/cnas/resourceDemand/device.js 45 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/system/dict/type.js 8 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/components/Table/lims-table.vue 246 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/router/index.js 25 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/thread/worker.js 2069 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/utils/thread/worker0.js 154 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/inspectionTask/Inspection.vue 716 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/business/inspectionTask/index.vue 62 ●●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/views/standard/standardLibrary/index.vue 770 ●●●● 补丁 | 查看 | 原始文档 | blame | 历史
src/api/cnas/resourceDemand/device.js
@@ -65,6 +65,51 @@
  });
}
// æ¸©åº¦å¾ªçŽ¯æ•°é‡‡
export function temDataAcquisition(data) {
  return request({
    url: "/deviceScope/temDataAcquisition",
    method: "post",
    data: data,
  });
}
// æ¸©åº¦å¾ªçŽ¯æ•°é‡‡æ€»ä½“
export function temDataAcquisition2(data) {
  return request({
    url: "/deviceScope/temDataAcquisition2",
    method: "post",
    data: data,
  });
}
// åˆ¤æ–­è¯¥è®¾å¤‡æ˜¯å¦å¯ä»¥æ•°é‡‡
export function determineWhetherToCollectData(data) {
  return request({
    url: "/deviceScope/determineWhetherToCollectData",
    method: "get",
    params: data,
  });
}
// æ•°é‡‡-数据采集
export function dataCollection(data) {
  return request({
    url: "/deviceScope/dataCollection",
    method: "get",
    params: data,
  });
}
// é€šè¿‡é¡¹ç›®èŽ·å–è®¾å¤‡åˆ—è¡¨
export function selectDeviceByCategory(data) {
  return request({
    url: "/deviceScope/selectDeviceByCategory",
    method: "get",
    params: data,
  });
}
// ç»´æŠ¤æ•°é‡‡é…ç½®
export function numberCollect(data) {
  return request({
src/api/system/dict/type.js
@@ -17,6 +17,14 @@
  })
}
// æ ¹æ®å­—典名称查询字典数据
export function selectDictDataByName(dictName) {
  return request({
    url: '/system/dict/type/selectDictDataByName/' + dictName,
    method: 'get'
  })
}
// æ–°å¢žå­—典类型
export function addType(data) {
  return request({
src/components/Table/lims-table.vue
@@ -1,31 +1,85 @@
<template>
  <div>
    <!-- è¡¨æ ¼ -->
    <el-table ref="multipleTable" v-loading="tableLoading" element-loading-text="加载中..."
      element-loading-spinner="el-icon-loading" :border="border" :data="tableData"
      :header-cell-style="{ background: '#f8f8f9', color: '#515a6e' }" :height="height"
      :highlight-current-row="highlightCurrentRow" :row-class-name="rowClassName" :row-style="rowStyle"
      :row-key="rowKey" :span-method="spanMethod" :stripe="stripe" style="width: 100%" tooltip-effect="dark"
      @row-click="rowClick" @current-change="currentChange" @selection-change="handleSelectionChange"
      class="lims-table">
      <el-table-column align="center" type="selection" width="55" v-if="isSelection" />
      <el-table-column align="center" label="序号" type="index" width="60" :index="indexMethod" />
    <el-table
      ref="multipleTable"
      v-loading="tableLoading"
      element-loading-text="加载中..."
      element-loading-spinner="el-icon-loading"
      :border="border"
      :data="tableData"
      :header-cell-style="{ background: '#f8f8f9', color: '#515a6e' }"
      :height="height"
      :highlight-current-row="highlightCurrentRow"
      :row-class-name="rowClassName"
      :row-style="rowStyle"
      :row-key="rowKey"
      :span-method="spanMethod"
      :stripe="stripe"
      style="width: 100%"
      tooltip-effect="dark"
      @row-click="rowClick"
      @current-change="currentChange"
      @selection-change="handleSelectionChange"
      class="lims-table"
    >
      <el-table-column
        align="center"
        type="selection"
        width="55"
        v-if="isSelection"
      />
      <el-table-column
        align="center"
        label="序号"
        type="index"
        width="60"
        :index="indexMethod"
      />
      <el-table-column v-for="(item, index) in column" :key="index" :column-key="item.columnKey"
        :filter-method="item.filterHandler" :filter-multiple="item.filterMultiple" :filtered-value="item.filteredValue"
        :filters="item.filters" :fixed="item.fixed" :label="item.label" :min-width="item.minWidth" :prop="item.prop"
        :show-overflow-tooltip="item.dataType === 'action' || item.dataType === 'slot' ? false : true
          " :sortable="item.sortable ? true : false" :type="item.type" align="center"
        :width="item.dataType == 'action' ? btnWidth : item.width">
      <el-table-column
        v-for="(item, index) in column"
        :key="index"
        :column-key="item.columnKey"
        :filter-method="item.filterHandler"
        :filter-multiple="item.filterMultiple"
        :filtered-value="item.filteredValue"
        :filters="item.filters"
        :fixed="item.fixed"
        :label="item.label"
        :min-width="item.minWidth"
        :prop="item.prop"
        :show-overflow-tooltip="
          item.dataType === 'action' || item.dataType === 'slot' ? false : true
        "
        :sortable="item.sortable ? true : false"
        :type="item.type"
        align="center"
        :width="item.dataType == 'action' ? btnWidth : item.width"
      >
        <!-- <div class="123" v-if="item.type == ''"> -->
        <template v-if="item.hasOwnProperty('colunmTemplate')" :slot="item.colunmTemplate" slot-scope="scope">
          <slot v-if="item.theadSlot" :index="index" :name="item.theadSlot" :row="scope.row" />
        <template
          v-if="item.hasOwnProperty('colunmTemplate')"
          :slot="item.colunmTemplate"
          slot-scope="scope"
        >
          <slot
            v-if="item.theadSlot"
            :index="index"
            :name="item.theadSlot"
            :row="scope.row"
          />
        </template>
        <template slot-scope="scope">
          <!-- æ’æ§½ -->
          <div v-if="item.dataType == 'slot'">
            <slot v-if="item.slot" :index="scope.$index" :name="item.slot" :row="scope.row" />
            <slot
              v-if="item.slot"
              :index="scope.$index"
              :name="item.slot"
              :row="scope.row"
            />
          </div>
          <!-- è¿›åº¦æ¡ -->
          <div v-else-if="item.dataType == 'progress'">
@@ -33,73 +87,141 @@
          </div>
          <!-- å›¾ç‰‡ -->
          <div v-else-if="item.dataType == 'image'">
            <img :src="javaApi + '/img/' + scope.row[item.prop]" alt=""
              style="width: 40px; height: 40px; margin-top: 10px" />
            <img
              :src="javaApi + '/img/' + scope.row[item.prop]"
              alt=""
              style="width: 40px; height: 40px; margin-top: 10px"
            />
          </div>
          <!-- tag -->
          <div v-else-if="item.dataType == 'tag'">
            <el-tag v-if="
            <el-tag
              v-if="
              typeof dataTypeFn(scope.row[item.prop], item.formatData) ==
              'string'
            " :title="scope.row[item.prop] | formatters(item.formatData)"
              :type="formatType(scope.row[item.prop], item.formatType)">{{ scope.row[item.prop] |
                formatters(item.formatData) }}</el-tag>
            <el-tag v-for="(tag, index) in dataTypeFn(
              "
              :title="scope.row[item.prop] | formatters(item.formatData)"
              :type="formatType(scope.row[item.prop], item.formatType)"
              >{{ scope.row[item.prop] | formatters(item.formatData) }}</el-tag
            >
            <el-tag
              v-for="(tag, index) in dataTypeFn(
              scope.row[item.prop],
              item.formatData
            )" v-else-if="
              )"
              v-else-if="
              typeof dataTypeFn(scope.row[item.prop], item.formatData) ==
              'object'
            " :key="index" :title="scope.row[item.prop] | formatters(item.formatData)"
              :type="formatType(tag, item.formatType)">{{
              "
              :key="index"
              :title="scope.row[item.prop] | formatters(item.formatData)"
              :type="formatType(tag, item.formatType)"
              >{{
                item.tagGroup
                  ? tag[item.tagGroup.label]
                    ? tag[item.tagGroup.label]
                    : tag
                  : tag
              }}</el-tag>
            <el-tag v-else :title="scope.row[item.prop] | formatters(item.formatData)"
              :type="formatType(scope.row[item.prop], item.formatType)">{{ scope.row[item.prop] |
                formatters(item.formatData) }}</el-tag>
              }}</el-tag
            >
            <el-tag
              v-else
              :title="scope.row[item.prop] | formatters(item.formatData)"
              :type="formatType(scope.row[item.prop], item.formatType)"
              >{{ scope.row[item.prop] | formatters(item.formatData) }}</el-tag
            >
          </div>
          <!-- æŒ‰é’® -->
          <div v-else-if="item.dataType == 'action'" :style="`width:${getWidth(item.operation, scope.row)}`">
          <div
            v-else-if="item.dataType == 'action'"
            :style="`width:${getWidth(item.operation, scope.row)}`"
          >
            <template v-for="(o, key) in item.operation">
              <el-button v-show="o.type != 'upload'" size="mini" v-if="o.showHide ? o.showHide(scope.row) : true"
                :disabled="o.disabled ? o.disabled(scope.row) : false" :icon="iconFn(o)" :plain="o.plain"
                :style="{ color: o.name === '删除' ? '#f56c6c' : o.color }" :type="o.type | typeFn(scope.row)"
                @click="o.clickFun(scope.row)" :key="key">
              <el-button
                v-show="o.type != 'upload'"
                size="mini"
                v-if="o.showHide ? o.showHide(scope.row) : true"
                :disabled="o.disabled ? o.disabled(scope.row) : false"
                :icon="iconFn(o)"
                :plain="o.plain"
                :style="{ color: o.name === '删除' ? '#f56c6c' : o.color }"
                :type="o.type | typeFn(scope.row)"
                @click="o.clickFun(scope.row)"
                :key="key"
              >
                {{ o.name }}
              </el-button>
              <el-upload :action="javaApi + o.url" size="mini" ref="upload" :multiple="o.multiple ? o.multiple : false"
                :disabled="o.disabled ? o.disabled(scope.row) : false" :accept="o.accept
              <el-upload
                :action="javaApi + o.url"
                size="mini"
                ref="upload"
                :multiple="o.multiple ? o.multiple : false"
                :disabled="o.disabled ? o.disabled(scope.row) : false"
                :accept="
                  o.accept
                  ? o.accept
                  : '.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar'
                  " v-if="o.type == 'upload' && o.url" style="display: inline-block; width: 50px"
                :data="o.data ? o.data(scope.row) : {}" :before-upload="o.beforeUpload ? o.beforeUpload(scope.row) : () => true
                  " v-show="o.showHide ? o.showHide(scope.row) : true" :headers="uploadHeader" :on-error="onError"
                :on-exceed="onExceed" :on-success="handleSuccessUp" :show-file-list="false" :key="key">
                <el-button :size="o.size ? o.size : 'small'" type="text"
                  :disabled="o.disabled ? o.disabled(scope.row) : false">{{ o.name }}</el-button>
                "
                v-if="o.type == 'upload' && o.url"
                style="display: inline-block; width: 50px"
                :data="o.data ? o.data(scope.row) : {}"
                :before-upload="
                  o.beforeUpload ? o.beforeUpload(scope.row) : () => true
                "
                v-show="o.showHide ? o.showHide(scope.row) : true"
                :headers="uploadHeader"
                :on-error="onError"
                :on-exceed="onExceed"
                :on-success="handleSuccessUp"
                :show-file-list="false"
                :key="key"
              >
                <el-button
                  :size="o.size ? o.size : 'small'"
                  type="text"
                  :disabled="o.disabled ? o.disabled(scope.row) : false"
                  >{{ o.name }}</el-button
                >
              </el-upload>
              <el-upload action="#" :on-change="(file, fileList) => o.clickFun(scope.row, file, fileList)
                " :multiple="o.multiple ? o.multiple : false" :limit="o.limit ? o.limit : 1"
                :disabled="o.disabled ? o.disabled(scope.row) : false" :accept="o.accept
              <el-upload
                action="#"
                :on-change="
                  (file, fileList) => o.clickFun(scope.row, file, fileList)
                "
                :multiple="o.multiple ? o.multiple : false"
                :limit="o.limit ? o.limit : 1"
                :disabled="o.disabled ? o.disabled(scope.row) : false"
                :accept="
                  o.accept
                  ? o.accept
                  : '.jpg,.jpeg,.png,.gif,.doc,.docx,.xls,.xlsx,.ppt,.pptx,.pdf,.zip,.rar'
                  " v-if="o.type == 'upload' && !o.url" style="display: inline-block; width: 50px"
                v-show="o.showHide ? o.showHide(scope.row) : true" :auto-upload="false" :on-exceed="onExceed"
                :show-file-list="false" :key="key">
                <el-button :size="o.size ? o.size : 'small'" type="text"
                  :disabled="o.disabled ? o.disabled(scope.row) : false">{{ o.name }}</el-button>
                "
                v-if="o.type == 'upload' && !o.url"
                style="display: inline-block; width: 50px"
                v-show="o.showHide ? o.showHide(scope.row) : true"
                :auto-upload="false"
                :on-exceed="onExceed"
                :show-file-list="false"
                :key="key"
              >
                <el-button
                  :size="o.size ? o.size : 'small'"
                  type="text"
                  :disabled="o.disabled ? o.disabled(scope.row) : false"
                  >{{ o.name }}</el-button
                >
              </el-upload>
            </template>
          </div>
          <!-- å¯ç‚¹å‡»çš„æ–‡å­— -->
          <div v-else-if="item.dataType == 'link'" class="cell" style="width: 100%"
            @click="goLink(scope.row, item.linkEvent)">
          <div
            v-else-if="item.dataType == 'link'"
            class="cell"
            style="width: 100%"
            @click="goLink(scope.row, item.linkEvent)"
          >
            <span class="link" v-if="!item.formatData">
              {{ scope.row[item.prop] }}
            </span>
@@ -114,8 +236,16 @@
        </template>
      </el-table-column>
    </el-table>
    <pagination v-if="page" v-show="page.total > 0" :total="page.total" :layout="page.layout" :page.sync="page.current"
      :limit.sync="page.size" @pagination="pagination" style="background-color: #fff" />
    <pagination
      v-if="page"
      v-show="page.total > 0"
      :total="page.total"
      :layout="page.layout"
      :page.sync="page.current"
      :limit.sync="page.size"
      @pagination="pagination"
      style="background-color: #fff"
    />
  </div>
</template>
@@ -481,7 +611,7 @@
}
>>>.el-table__body-wrapper::-webkit-scrollbar {
  height: 14px;
  height: 6px;
  /* è®¾ç½®æ»šåŠ¨æ¡å®½åº¦ */
}
</style>
src/router/index.js
@@ -93,7 +93,7 @@
// åŠ¨æ€è·¯ç”±ï¼ŒåŸºäºŽç”¨æˆ·æƒé™åŠ¨æ€åŽ»åŠ è½½
export const dynamicRoutes = [
  {
    // ä¸‹å•页面
    // æ£€éªŒä¸‹å•页面
    path: '/inspectionOrder',
    component: Layout,
    hidden: true,
@@ -116,6 +116,29 @@
    ]
  },
  {
    // æ£€éªŒä»»åŠ¡é¡µé¢
    path: '/inspectionTask',
    component: Layout,
    hidden: true,
    permissions: ['business:inspection'],
    children: [
      {
        // ä»»åŠ¡æ£€éªŒé¡µé¢
        path: 'inspection',
        component: () => import('@/views/business/inspectionTask/Inspection'),
        name: 'inspection',
        meta: { title: '委托单检验', activeMenu: '/business/inspectionTask' }
      },
      // {
      //   // æŸ¥çœ‹å§”托单详情页面
      //   path: 'showDetails',
      //   component: () => import('@/views/business/inspectionOrder/add'),
      //   name: 'showDetails',
      //   meta: { title: '委托单详情', activeMenu: '/business/inspectionOrder' }
      // }
    ]
  },
  {
    // ç”¨æˆ·ç®¡ç†
    path: "/system/user-auth",
    component: Layout,
src/utils/thread/worker.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,2069 @@
// å¤šçº¿ç¨‹é‡Œé¢éœ€è¦ä¿å­˜çš„æ•°æ®
'use strict';//为js脚本开启严格模式
let code = ''
// è¡¨æ ¼æ•°æ®ï¼ˆæ¸²æŸ“)
let tableList = null
// æ–¹æ³•列表
let excelMethodList = []
// excel坐标比较列表
let comparisonList = []
// å½“前样品信息
let currentSample = {}
// å¥—管
let bushing = ''
// å¤šçº¿ç¨‹ä¼ é€’到主线程的数据
let result = {
  method:'',
  value:null
}
let modelType = ''
// ä¿å­˜æ—¶ä¼ åˆ°åŽç«¯å‚æ•°
let param = null
// å½“前的模板
let currentTable = ''
// ä¼˜åŒ–数采较多数据时-记录最后一个检验项的id
let getDataTypeId = null
//当前检验项
let currentInsItem = null
// æŽ¥æ”¶åˆ°ä¸»çº¿ç¨‹å¤„理逻辑的消息
self.onmessage = function(event) {
  // ä¿å­˜ä¸»çº¿ç¨‹ä¼ è¿‡æ¥çš„值
  const data = JSON.parse(event.data);
  if(currentTable!=data.currentTable){
    // æ£€éªŒæ¨¡æ¿æ”¹å˜åŽéœ€è¦åˆ·æ–°è¡¨æ ¼
    tableList = data.tableList;
  }
  currentTable = data.currentTable;
  if(data.type&&data.type=='saveData'){
    // æ›´æ–°è¡¨æ ¼æ•°æ®å’Œä¼ é€’到后端的参数
    tableList = data.tableList;
    param = data.param;
    return
  }
  if(data.bushing&&(data.bushing!=bushing)&&data.type=='saveData'){
    // æ›´æ–°è¡¨æ ¼æ•°æ®ã€ä¼ é€’到后端的参数和套管数据
    tableList = data.tableList;
    param = data.param;
    bushing = data.bushing;
    return
  }
  modelType = data.modelType
  code = data.code;
  if(data.getDataTypeId){
    // è®°å½• ä¼˜åŒ–数采较多数据时-记录最后一个检验项的id
    getDataTypeId = data.getDataTypeId
  }else{
    getDataTypeId = null
  }
  if(tableList){
    // å¦‚果表格数据存在,则更新当前修改检验项的表格数据
    let str = code.split('-')
    let r = str[1]
    let c = str[2]
    tableList[0].arr.forEach((item,index)=>{
      item.forEach((m,i)=>{
        if(m.c==c&&m.r==r){
          tableList[0].arr[index] = data.tableList[0].arr[index]
        }
      })
    })
  }else{
    // å¦‚果初始化表格数据不存在,直接赋值
    tableList = data.tableList;
  }
  if(param){
    // å¦‚果传递到后端的参数存在,则更新当前修改检验项的传递到后端的参数
    let str = code.split('-')
    let pId = str[3]
    param[pId] = data.param[pId]
  }else{
    // åˆå§‹åŒ–传递到后端的参数
    param = data.param;
  }
  if(data.currentInsItem){
    currentInsItem = data.currentInsItem
  }
  // æ›´æ–°æ–¹æ³•列表、坐标比较列表、当前样品信息、项目
  excelMethodList = JSON.parse(JSON.stringify(data.excelMethodList));
  comparisonList = JSON.parse(JSON.stringify(data.comparisonList));
  currentSample = JSON.parse(JSON.stringify(data.currentSample));
  // æ‰§è¡Œè®¡ç®—方法
  changeInput('', code);
};
/**
 *
 * @returns èŽ·å–chrome浏览器版本
 */
function getChromeVersion(){
    var ua = navigator.userAgent;
    var match = ua.match(/Chrome\/(\d+)/);
    if (match && match[1]) {
        return parseInt(match[1], 10);
    }
    return -1
}
/**
 * è‡ªå®šä¹‰Object.values方法,解决低版本浏览器没有该API问题
 * @param {*} obj
 * @returns
 */
function customValues(obj){
  return Object.keys(obj).map(function(key){
    return obj[key];
  });
}
function changeInput(m, code){
  let str = code.split('-')
  let r = str[1]//当前行
  let c = str[2]//当前列
  let id = str[0]
  let pId = str[3]//当前检验项id,param[pId]为当前检验项的所有值,包含:过程值insValue、计算值comValue、设备编码equipValue、设备名称equipName、最终值resValue、结论insResult
  var list = []//一个双层数组,里面保存有当前页面渲染的所有数据
  // èµ‹å€¼å½“前模板的表格数据
  for (let a in tableList) {
    if (tableList[a].templateId == id) {
      list = tableList[a].arr
      break
    }
  }
  let isToExponential = ''//是否为科学计数法
  let list2 = [] //一个数组,里面保存有当前检验项的所有参数值
  let isPoint = '' //是否为小数点
  // å¾ªçŽ¯æ‰€æœ‰excel方法,找到当前行、列的检验项,如果此单元格(r,c)是某个excel方法里面的参数,则执行此方法
  excelMethodList.forEach(item => {
    // item.valueList  æ˜¯å½“前excel方法的参数列表,找到当前填入的值是否是参数
    if (item.valueList&&item.valueList.length>0&&item.valueList.find(m => m.r == r && m.c == c)) {
      // å¦‚果是,则定义一个参数的对象集合,用于保存当前excel方法参数的值
      var comValue = {}
      item.valueList.forEach(a => {
        list.forEach(b => {
          if (b[0].r == a.r) {
            b.forEach(c => {
              if (c.c == a.c) {
                // èŽ·å–å½“å‰å‚æ•°çš„Execl行坐标(ABCD)等等
                var tableCode = ''
                for (var d in comparisonList) {
                  if (c.c == comparisonList[d].dictValue) {
                    tableCode = comparisonList[d].dictLabel
                    break
                  }
                }
                list2.push(c.v.v)
                // ç»„装参数的对象集合并赋值,列如{A3:12,B4:15}
                if(getInspectionValueType(item.i)==1&&!isNaN(parseFloat(c.v.v))){
                  // å¦‚果是数字输入框
                  let n = String(c.v.v)
                  if(n.includes('/')){
                    // å¦‚果是分数,则赋值
                    comValue[(tableCode + (c.r + 1))] = c.v.v
                  }else{
                    comValue[(tableCode + (c.r + 1))] = parseFloat(c.v.v).toFixed(6)
                  }
                }else{
                  // å¦‚果是文本、下拉框等等
                  comValue[(tableCode + (c.r + 1))] = c.v.v
                }
              }
            })
          }
        })
      })
      // å¦‚果此excel方法是结论判断方法,则执行此方法
      if (item.v.ps != undefined && item.v.ps.value == '结论') {
        try {
          if (currentSample.insProduct.find(m => m.id == item.i)) {
            // å¦‚果当前检验项是产品检验项,则执行此方法,找到此检验项的要求值
          let ask = currentSample.insProduct.find(m => m.id == item.i).ask?currentSample.insProduct.find(m => m.id == item.i).ask.split('&'):null;
          const chromeVersion = getChromeVersion()
          console.log(getChromeVersion())
          let res = null
          // èŽ·å–å½“å‰ç»“è®ºçš„å‚æ•°ï¼Œä¹Ÿå°±æ˜¯å½“å‰æ£€éªŒé¡¹çš„æœ€ç»ˆå€¼
          if(chromeVersion>0 && chromeVersion>=75){
            res = Object.values(comValue)[0]
          }else{
            res = customValues(comValue)[0]
          }
          let comp = []
          // åˆ¤æ–­å½“前结论的参数(当前检验项的最终值)是否为空,如果为空,则直接赋值
          if(res===''||res===null||res===undefined||res==='Infinity'){
            item.v.v = null
            list.forEach(a => {
              if (a[0].r == item.r) {
                for (let  b=0; b<a.length; b++) {
                  if (a[b].c == item.c) {
                    a[b].v.v = null
                    break
                  }
                }
              }
            })
          }else{
            // å¦‚果不为空,则判断当前结论就需要进行判断
            //要求值为-,/,—,则结论设置为不判定,结论赋值为3
            if(ask[0]=='-' || ask[0]=='/' || ask[0]=='—'){
              item.v.v = 3
              list.forEach(a => {
                if (a[0].r == item.r) {
                  for (let  b=0; b<a.length; b++) {
                    if (a[b].c == item.c) {
                      a[b].v.v = 3
                      break
                    }
                  }
                }
              })
            }else{
              // è¦æ±‚值不为-,/,—,则进行判断
              if(ask){
                // å¾ªçŽ¯è¦æ±‚å€¼åˆ—è¡¨ï¼Œåˆ¤æ–­å½“å‰ç»“è®ºçš„å‚æ•°æ˜¯å¦ç¬¦åˆè¦æ±‚
                comp = ask.map((m, i) => {
                  //如果要求值为纯数字,在开头插入=
                  if(m!=null && m!=='' && !isNaN(m)){
                    m='='+m
                  }
                  if(m.includes('~')) {
                    m = m.replace('~', '~')
                  }
                  // å¦‚æžœask包含D,则用规格型号替换
                  // if(m.includes('D')) {
                  //   m = m.replace('D',modelType.split('-')[1])
                  // }
                  // è£…备特有的判断方法(需要科学计数法的),要求值进行替换
                  if (m.includes('RTS')) {
                    m = m.replace('RTS*', '')
                  }
                  // å¦‚果要求值包含=,则判断当前结论的参数是否等于要求值,
                  // ä»¥ä¸‹åˆ¤æ–­åŸºæœ¬ä¸€è‡´ï¼Œåªæ˜¯åˆ¤æ–­ç±»åž‹ä¸ä¸€æ ·ï¼Œå°±ä¸åšæ³¨é‡Šäº†
                  if (m.includes('=')) {
                    // å¤„理要求值
                    let str = handleFraction(m.split('=')[1])
                    if(typeof res == 'string'&&typeof str == 'string'){
                      // å¦‚果要求值和当前结论的参数都是字符串,则执行
                      if(res.includes('/')){
                        // å¦‚果结论的参数是分数,则判断
                        if (m.includes('/')) {
                          // å¦‚果要求值是分数,则判断
                          return  eval(res) == eval(str)
                        } else {
                          // å¦‚果要求值不是分数,则判断
                          return handleMoreParam(res,m.split('=')[1],'=')
                        }
                      }else{
                        // å¦‚果结论的参数不是分数,则判断
                        //判断结论和要求值是不是数字
                        if(isNaN(res) || isNaN(str)){
                          return  res.trim().replace(/[.,。、;:'";??“,]/g, '') == str.trim().replace(/[.,。、;:'";??“,]/g, '')
                        }else{
                          let resNum = parseFloat(res.trim().replace(/[,。、;:'";??“,]/g, ''));
                          let strNum = parseFloat(str.trim().replace(/[,。、;:'";??“,]/g, ''));
                          return resNum == strNum;
                        }
                      }
                    }else{
                      // å¦‚果要求值和当前结论的参数有一个是数字,则执行
                      return  eval(res) == eval(str)
                    }
                  } else if (m.includes('≥')) {
                    if(typeof res =='string'&&res.includes('/')){
                      if (m.includes('/')) {
                        let str = handleFraction(m.split('≥')[1])
                        return eval(res) >= eval(str)
                      } else {
                        return handleMoreParam(res,m.split('≥')[1],'≥')
                      }
                    }else{
                      let str = handleFraction(m.split('≥')[1])
                      return eval(res) >= eval(str)
                    }
                  }else if (m.includes('≤')) {
                    if(typeof res =='string'&&res.includes('/')){
                      if (m.includes('/')) {
                        let str = handleFraction(m.split('≤')[1])
                        return eval(res) <= eval(str)
                      } else {
                        return handleMoreParam(res,m.split('≤')[1],'≤')
                      }
                    }else{
                      let str = handleFraction(m.split('≤')[1])
                      console.log('str',str);
                      return eval(res) <= eval(str)
                    }
                  }else if (m.includes('<')) {
                    if(typeof res =='string'&&res.includes('/')){
                      if (m.includes('/')) {
                        let str = handleFraction(m.split('<')[1])
                        return  eval(res) < eval(str)
                      } else {
                        return handleMoreParam(res,m.split('<')[1],'<')
                      }
                    }else{
                      let str = handleFraction(m.split('<')[1])
                      console.log('111',m);
                      console.log('***',str);
                      return  eval(res) < eval(str)
                    }
                  }else if (m.includes('>')) {
                    if(typeof res =='string'&&res.includes('/')){
                      if (m.includes('/')) {
                        let str = handleFraction(m.split('>')[1])
                        return  eval(res) > eval(str)
                      } else {
                        return handleMoreParam(res,m.split('>')[1],'>')
                      }
                    }else{
                      let str = handleFraction(m.split('>')[1])
                      return  eval(res) > eval(str)
                    }
                  }else if (m.includes('~')) {
                    if(typeof res =='string'&&res.includes('/')){
                      if (m.includes('/')) {
                        let k = m.split('~')
                        return  eval(res) >= eval(handleFraction((k[0]))) && eval(res) <= eval(handleFraction(k[1]))
                      } else {
                        return handleMoreParam(res,m,'~')
                      }
                    }else{
                      const regex = /(-?\d*\.?\d+)/;
                      let k = m.split('~')
                      k[0] = k[0].match(regex)[1]
                      k[1] = k[1].match(regex)[1]
                      return  eval(res) >= eval(handleFraction((k[0]))) && eval(res) <= eval(handleFraction(k[1]))
                    }
                  }else if(m.includes('-')){
                    if(typeof res =='string'&&res.includes('/')){
                      if (m.includes('/')) {
                        let k = m.split('-')
                        return  eval(res) >= eval(handleFraction(k[0])) && eval(res) <= eval(handleFraction(k[1]))
                      } else {
                        return handleMoreParam(res,m,'-')
                      }
                    }else{
                      let k = m.split('-')
                      // console.log(k,eval(res),eval(res) >= eval(handleFraction(k[0])) && eval(res) <= eval(handleFraction(k[1])))
                      return  eval(res) >= eval(handleFraction(k[0])) && eval(res) <= eval(handleFraction(k[1]))
                    }
                  }else if(m.includes('±')){
                    if(modelType.includes('φ-')) {
                      const regex = /φ-([\d.]+)/;
                      const found = modelType.match(regex);
                      if(m.indexOf('±') == 0) {
                          if(found) {
                            m = found[1] + m
                          }
                        }
                    }
                    if(typeof res =='string'&&res.includes('/')){
                      if (m.includes('/')) {
                        let k = m.split('±')
                        return  eval(res) >= eval((handleFraction(k[0]) - handleFraction(k[1]))) && eval(res) <= eval(Number(handleFraction(k[0])) + Number(handleFraction(k[1])))
                      } else {
                        return handleMoreParam(res,m,'±')
                      }
                    }else{
                      let k = m.split('±')
                      if(k[0] != '' && k[0] != null) {
                        // åŒ¹é…æ•°å€¼
                      const regex = /(-?\d+\.?\d*)/
                      k[0] = k[0].match(regex)[0]
                      // åˆ¤æ–­æ˜¯å¦å«æœ‰%的情况
                      if(k[1].includes('%')) {
                        k[1] =Number(k[0]).toFixed(6) * Number(k[1].match(regex)[0]).toFixed(6) / 100
                      }else{
                        k[1] = k[1].match(regex)[0]
                      }
                      }
                      return  eval(res) >= eval((handleFraction(k[0]) - handleFraction(k[1]))) && eval(res) <= eval(Number(handleFraction(k[0])) + Number(handleFraction(k[1])))
                    }
                  }else if(m.includes('>')){
                    if(typeof res =='string'&&res.includes('/')){
                      if (m.includes('/')) {
                        let str = handleFraction(m.split('>')[1])
                        return  eval(res) > eval(str)
                      } else {
                        return handleMoreParam(res,m.split('>')[1],'>')
                      }
                    }else{
                      let str = handleFraction(m.split('>')[1])
                      return  eval(res) > eval(str)
                    }
                  }else if(m.includes('<')){
                    if(typeof res =='string'&&res.includes('/')){
                      if (m.includes('/')) {
                        let str = handleFraction(m.split('<')[1])
                        return  eval(res) < eval(str)
                      } else {
                        return handleMoreParam(res,m.split('<')[1],'<')
                      }
                    }else{
                      let str = handleFraction(m.split('<')[1])
                      return  eval(res) < eval(str)
                    }
                  }
                })
              }
              // å¦‚果要求值的每个条件都符合,则给结论赋值为1,合格
              if (comp.every(m => m)) {
                item.v.v = 1
                list.forEach(a => {
                  if (a[0].r == item.r) {
                    for (let  b=0; b<a.length; b++) {
                      if (a[b].c == item.c) {
                        a[b].v.v = 1
                        break
                      }
                    }
                  }
                })
              }else {
                // å¦åˆ™ç»™ç»“论赋值为0,不合格
                item.v.v = 0
                list.forEach(a => {
                  if (a[0].r == item.r) {
                    for (let  b=0; b<a.length; b++) {
                      if (a[b].c == item.c) {
                        a[b].v.v = 0
                        break
                      }
                    }
                  }
                })
              }
            }
          }
          let getDataType0 = false
          // ä¼˜åŒ–数采较多数据时-记录最后一个检验项的id,如果当前检验项的id与记录的id相同,则多传一个参数到主线程,进行数据保存,否则数采就不进行保存
          if(item.i==getDataTypeId){
            getDataType0 = true
          }
          // èµ‹å€¼ä¼ é€’到主线程的数据,method:saveInsContext表示此消息需要保存数据
          console.log("iii---->>>>",item)
          result = {
            method:'saveInsContext',
            value:{
              tableList,// è¡¨æ ¼æ•°æ®
              param:getParam(),//传给后端的参数
              getDataTypeId:getDataType0?getDataTypeId:'',
              currentInsItemId: item.i
            }
          }
          // å‘消息给主线程
          self.postMessage(JSON.stringify(result))
        }
        } catch (error) {
          console.log('error---', error)
        }
      } else {
        // å¦‚果是函数方法,则执行此方法
        let comResult = ''//初始化计算结果
        try {
          if(getInspectionValueType(item.i)==1){
            // å¦‚果检验值类型是数字输入框
            let tell = currentSample.insProduct.find(m => m.id == item.i).tell?currentSample.insProduct.find(m => m.id == item.i).tell.split('&'):null;
            // æ ¹æ®è¾“入的数值,进行计算
            comResult = compute(item.v.f.replace(/=/g, ' '),comValue, false)
            let list3 = list2.map(item=>item+'')
            // åˆ¤æ–­æ˜¯å¦ä¸ºç§‘学计数法,如果为科学计数法,则进行转化
            isToExponential = list3.some(val => val.includes('e+')||val.includes('e-'))
            // æ£€éªŒå€¼è½¬åŒ–
            let findProduct = currentSample.insProduct.find(i=>i.inspectionItem=='体积电阻率')
            // åˆ¤æ–­æ£€éªŒé¡¹æ˜¯å¦ä¸ºä½“积电阻率,如果为体积电阻率且大于100000,则进行转化
            if (findProduct && isToExponential && comResult>=100000) {
              let num2 = new Big(comResult)
              comResult = num2.toExponential(1)
            }
          }else{
            // å¦‚果检验值类型是文本输入框、下拉框
            let valueList = [];
            // å¤„理excel函数参数列表
            item.valueList.forEach(a => {
              valueList.push({
                name: `${comparisonList.find(e=>e.dictValue==a.c).dictLabel}${a.r+1}`,
                value: 0,
              })
            })
            // ç»™excel函数参数赋文本值
            for (var a in comValue) {
              valueList.forEach(b => {
                if (b.name == a) {
                  b.value = comValue[a]
                }
              })
            }
            // è®¡ç®—公式,去掉excel函数的等号,并替换参数,列如:=A1  å˜æˆ A1 å˜æˆ â€˜æ–‡æœ¬è¾“入的值’
            let str = item.v.f.replace(/=/g, ' ')
            valueList.forEach(b => {
              str = str.replace(b.name, b.value)
            })
            // è®¡ç®—结果赋值
            comResult = str
          }
        } catch (error) {
          console.log('error---', error)
        }
        try {
          // å¾ªçŽ¯è¡¨æ ¼æ•°æ®ï¼Œç»™è¡¨æ ¼æ•°æ®è¿›è¡Œèµ‹å€¼
          list.forEach(a => {
            if (a[0].r == item.r && comResult !== '') {
              // åˆ¤æ–­å½“前行是否为当前检验项所在行,如果为当前行,则给表格数据赋值
              for (var b in a) {
                if (a[b].c == item.c) {
                  try{
                    if(comResult==0){
                      // åˆ¤æ–­è®¡ç®—结果是否为0,如果为0,则给表格数据赋值为0
                      a[b].v.v = 0
                    }else if(a[b].v.ct&&a[b].v.ct.fa&&typeof a[b].v.ct.fa == 'string'&&a[b].v.ct.fa.includes('.')){
                      // åˆ¤æ–­å½“前单元格是否保留小数点,如果为保留小数点,则给表格数据赋值为保留小数点,这个是根据模板配置小数点来的
                      let num = 0
                      let str = a[b].v.ct.fa.split('.')[1]
                      num = str.length
                      a[b].v.v = comResult?Number(comResult).toFixed(num):comResult
                    }else if(typeof comResult == 'string' && (comResult.includes('e+')|| comResult.includes('e-'))){
                      // åˆ¤æ–­è®¡ç®—结果是否为科学计数法,如果为科学计数法,则给表格数据赋值为科学计数法
                      a[b].v.v = comResult
                    }else{
                      // åˆ¤æ–­è®¡ç®—结果是否为数字,如果为数字,则给表格数据赋值为数字
                      let val = parseFloat(Number(comResult).toFixed(6))
                      a[b].v.v = isNaN(val) ? comResult : val
                    }
                  }catch(error){
                    // å¦‚果以上判断都不支持,则直接赋值
                    a[b].v.v = comResult
                    console.log('error---', error)
                  }
                  break
                }
              }
            }
          })
          // å¦‚果此计算结果所属单元格,同时也是另一个excel函数的参数,那么就需要递归进行计算
          changeInput(comResult, `${id}-${item.r}-${item.c}-${pId}`) //改变最终值
        } catch (error) {
          console.log('error---', error)
        }
      }
    }
  })
  // èµ‹å€¼å¤šçº¿ç¨‹ä¼ è¾“数据
  result = {
    method:'tableList',
    value:tableList
  }
  // å‘送主线程数据
  self.postMessage(JSON.stringify(result))
  try {
    // èµ‹å€¼å¤šçº¿ç¨‹ä¼ è¾“数据
    result = {
      method:'getCurrentInsProduct',
      value:pId
    }
    // å‘送主线程数据
    self.postMessage(JSON.stringify(result))
  } catch (error) {
    console.log('error---', error)
  }
}
/**
 * èŽ·å–æ£€æµ‹å€¼ç±»åž‹
 *
 * @param id æ£€æµ‹å€¼ç±»åž‹å¯¹åº”çš„id
 * @returns è¿”回检测值类型
 */
function getInspectionValueType(id) {
  for (var a in currentSample.insProduct) {
    if (currentSample.insProduct[a].id == id) {
      return currentSample.insProduct[a].inspectionValueType
    }
  }
}
/**
 * å¤„理分数或带有乘法和乘方的字符串
 *
 * @param str å­—符串类型,表示要处理的分数或乘方表达式
 * @returns è¿”回一个数字或原字符串,如果字符串为有效的分数或乘方表达式,则返回计算结果;否则返回原字符串
 */
function handleFraction(str){
  if(str&&typeof(str)=='string'&&str.includes('/')&&str.includes('*')) {
    // åˆ¤æ–­å“ªä¸ªç¬¦å·åœ¨å‰é¢
    // å¦‚æžœ/在*前面,则先计算除法,再计算乘法
    if(str.indexOf('/') < str.indexOf('*')) {
      let num1 = str.split('/')[0]
      let num2 = str.split('/')[1].split('*')[0]
      let num3 = str.split('/')[1].split('*')[1]
      return eval(num1/num2)*num3
    }else {
      // å¦‚æžœ*在/前面,则先计算乘法,再计算除法
      let num1 = str.split('*')[0]
      let num2 = str.split('*')[1].split('/')[0]
      let num3 = str.split('*')[1].split('/')[1]
      return eval(num1*num2)/num3
    }
  }
  if(str&&typeof(str)=='string'&&str.includes('/')){
    // å¤„理分数
    return eval(str.split('/')[0]/str.split('/')[1])
  } else if (str && typeof(str) == 'string' && str.includes('*') && str.includes('^')) {
    // è®¡ç®—乘方
    const num1 = str.split('*')
    const num2 = num1[1].split('^')
    let num3 = new Big(num2[0]);
    let num4 = new Big(num2[1]);
    let num5 = Math.pow(num3, num4) // è®¡ç®—次方
    return num1[0] * num5 // æœ€åŽè®¡ç®—乘法
  } else{
    return str
  }
}
/**
 * å¤„理带有多个参数的函数
 *
 * @param res å­—符串,需要被分割并处理的字符串
 * @param str å­—符串,与res中的每一项进行比较的字符串,可能是分数或者带有比较符号的字符串
 * @param comp å­—符串,表示比较类型的字符(如 '>'、'<'、'='、'≥'、'≤'、'±'、'~'、'-')
 * @returns è¿”回布尔值,如果res中每一项都满足与str的比较条件,则返回true,否则返回false
 */
function handleMoreParam(res,str,comp){
    let arr = res.split('/')
    let arr0 = arr.every(item=>{
      switch (comp){
        case '>':
          return item > handleFraction(str)
        case '<':
          return item < handleFraction(str)
        case '=':
          return item == handleFraction(str)
        case '≥':
          return item >= handleFraction(str)
        case '≤':
          return item <= handleFraction(str)
        case '±':
          let k = str.split('±')
          return  item >= eval((handleFraction(k[0]) - handleFraction(k[1]))) && item <= eval(Number(handleFraction(k[0])) + Number(handleFraction(k[1])))
        case '~':
          let j = str.split('~')
          return  item >= eval(handleFraction((j[0]))) && item <= eval(handleFraction(j[1]))
          case '-':
            let o = str.split('-')
            return  item >= eval(handleFraction(o[0])) && item <= eval(handleFraction(o[1]))
      }
    })
    if(arr0){
      return true
    }else{
      return false
    }
  }
/**
 * èŽ·å–å‚æ•°
 *
 * @returns è¿”回处理后的参数对象
 */
function getParam(){
  tableList[0].arr.forEach(a=>{
    a.forEach(b=>{
      // åˆå§‹åŒ–传递到后端的参数
      if(param[b.i]){
        param[b.i].insValue = []
        param[b.i].comValue = []
        param[b.i].equipValue = []
        param[b.i].equipName = []
        param[b.i].resValue = null
        param[b.i].insResult = null
      }
    })
  })
  console.log('78978');
  tableList[0].arr.forEach(a => {
    a.forEach(b=>{
      // æ ¹æ®è¡¨æ ¼æ•°æ®ï¼Œèµ‹å€¼ä¼ é€’到后端的参数
      if (b.v.ps != undefined &&typeof b.v.ps.value =='string'&& b.v.ps.value.includes('检验值')) {
        // èµ‹å€¼æ£€éªŒå€¼
        b.i &&b.v.v&& param[b.i].insValue.push(b)
      }
      if (b.v.ps != undefined && b.v.ps.value === '计算值') {
        // èµ‹å€¼è®¡ç®—值
        if (typeof b.v.v == "number" && isNaN(b.v.v)) {
          b.v.v = 0;
        }
        b.i &&b.v.v&&b.valueList&&b.valueList.length>0&& param[b.i].comValue.push(b)
      }
      if (b.v.ps != undefined && b.v.ps.value === '设备编码') {
        // èµ‹å€¼è®¾å¤‡ç¼–码
        b.i &&b.v&& param[b.i].equipValue.push(b)
      }
      if (b.v.ps != undefined && b.v.ps.value === '设备名称') {
        // èµ‹å€¼è®¾å¤‡åç§°
        b.i &&b.v&& param[b.i].equipName.push(b)
      }
      if (b.v.ps != undefined && b.v.ps.value === '最终值') {
        // èµ‹å€¼æœ€ç»ˆå€¼  æœ‰å€¼å°±ä¸åœ¨ç»§ç»­èµ‹å€¼
        if(!(param[b.i].resValue && param[b.i].resValue.v && param[b.i].resValue.v.v)){
          // è®¡ç®—值 æ£€éªŒå‘˜å…¨éƒ¨è¾“å…¥0
          if (typeof b.v.v == "number" && isNaN(b.v.v)) {
            b.v.v = 0
          }
          b.i &&b.v&&b.valueList&&b.valueList.length>0&& (param[b.i].resValue = b)
        }
      }
      if (b.v.ps != undefined && b.v.ps.value === '结论') {
        if(b.i &&(b.v.v||b.v.v===0||b.v.v==='0')){
          if(b.v.v != '合格'&&b.v.v != '不合格'){
            // èµ‹å€¼ç»“论
            if(param[b.i].insResult == '' || param[b.i].insResult == null || param[b.i].insResult == undefined){
              param[b.i].insResult = b
            }
          }
        }
      }
    })
  })
  return param
}
/**
 * è®¡ç®—多个数值的和
 *
 * @param val æ•°å€¼åž‹å‚数,可变长参数列表
 * @returns è¿”回所有参数的和,如果参数列表为空或参数类型非数值型,则返回null
 */
function SUM(...val){
  try {
    let num = null;
    if(val!=null&&val!=undefined&&val!='undefined'&&val!='NaN'&&val.length>0){
      val.forEach(item=>{
        num+=item;
      })
    }
    return num;
  } catch (error) {
    console.log('error---', error)
  }
}
/**
 * è®¡ç®—传入参数中的最大值
 *
 * @param ...val å¯å˜å‚数列表,用于计算最大值的数值或可转换为数值的类型
 * @returns è¿”回最大值,如果参数列表为空或为null/undefined/'',则返回null
 */
function MAX(...val){
  try {
    let max = null;
    if(val!=null&&val!=undefined&&val!='undefined'&&val!='NaN'&&val.length>0){
      val = val.filter(item=>item!=null&&item!=='')
      if(val.length>0){
        max = Math.max(...val)
      }else{
        max = null;
      }
    }
    return max;
  } catch (error) {
    console.log('error---', error)
  }
}
/**
 * è®¡ç®—传入参数中的最小值
 *
 * @param val å¯å˜å‚数,用于计算最小值的数值数组
 * @returns è¿”回传入参数中的最小值,如果传入参数为空或所有值均为null或空字符串,则返回null
 */
function MIN(...val){
  try {
    let min = null;
    if(val!=null&&val!=undefined&&val!='undefined'&&val!='NaN'&&val.length>0){
      val = val.filter(item=>item!=null&&item!=='')
      if(val.length>0){
        min = Math.min(...val)
      }
    }
    return min;
  } catch (error) {
    console.log('error---', error)
  }
}
/**
 * è®¡ç®—给定数值的平均值
 *
 * @param val æ•°å€¼åˆ—表,可包含任意个参数
 * @returns è¿”回平均值,如果数值列表为空或包含非数值项,则返回null
 */
function AVERAGE(...val){
  try {
    let num = null;
    let arr = [];
    if(val!=null&&val!=undefined&&val!='undefined'&&val!='NaN'&&val.length>0){
      arr = val.filter(item=>item!==null&&item!==''&&item!=undefined)
      arr.forEach(item=>{
        num+=item;
      })
      if(arr.length>0){
        return num/arr.length;
      }else{
        return null;
      }
    }else{
      return null;
    }
  } catch (error) {
    console.log('error---', error)
  }
}
/**
 * è®¡ç®—一个数的绝对值
 *
 * @param val ä»»æ„æ•°å€¼
 * @returns è¿”回该数值的绝对值
 */
function ABS(val){
  try {
    return Math.abs(val);
  } catch (error) {
    console.log('error---', error)
  }
}
/**
 * è®¡ç®—一组数字的中位数
 *
 * @param val ä»»æ„ä¸ªå‚数,需要计算中位数的数字
 * @returns å¦‚果参数中有有效的数字,则返回计算出的中位数;否则返回null
 */
function MEDIAN(...val){
  try {
    let arr = [];
    if(val&&val.length>0){
      arr = val.filter(item=>item!=null&&item!=='')
      const sortedArr = arr.sort((a, b) => a - b);
      // è®¡ç®—中位数
      const half = Math.floor(sortedArr.length / 2);
      if(arr.length>0){
        // å¦‚果数组长度是奇数,直接取中间的元素
        if (sortedArr.length % 2 === 1) {
          return sortedArr[half];
        } else { // å¦‚果数组长度是偶数,取中间两个元素的平均值
          return (sortedArr[half - 1] + sortedArr[half]) / 2;
        }
      }else{
        return null;
      }
    }else{
      return null;
    }
  } catch (error) {
    console.log('error---', error)
  }
}
/**
 * è®¡ç®—幂
 *
 * @param str å­—符串形式的幂表达式,例如"2^3"
 * @returns è¿”回计算后的幂值,如果表达式无效则返回null
 */
function CalculatePower(str){
  try {
    if(str&&str.includes('^')){
      let arr = str.split('^');
      if(arr&&arr.length>1){
        return Math.pow(arr[0],arr[1]);
      }else{
        return null;
      }
    }
  } catch (error) {
    console.log('error---', error)
  }
}
/**
 * æ ¹æ®åæ ‡èŽ·å–åˆ—å
 * @param {Object} cellId
 */
function getColumnNameFromId(cellId){
  try{
    if (! Array.isArray(cellId)) {
      cellId = cellId.split('-');
    }
    var i = cellId[0];
    var letter = '';
    if (i > 701) {
      letter += String.fromCharCode(64 + parseInt(i / 676));
      letter += String.fromCharCode(64 + parseInt((i % 676) / 26));
    } else if (i > 25) {
      letter += String.fromCharCode(64 + parseInt(i / 26));
    }
    letter += String.fromCharCode(65 + (i % 26));
    return letter + (parseInt(cellId[1]) + 1);
  }catch(e){
    console.log('error',e)
  }
}
/**
 * æ ¹æ®åˆ—名获取坐标
 * @param {Object} id
 * @param {Object} arr
 */
function getIdFromColumnName(id, arr) {
  try{
    // Get the letters
    var t = /^[a-zA-Z]+/.exec(id);
    if (t) {
      // Base 26 calculation
      var code = 0;
      for (var i = 0; i < t[0].length; i++) {
        code += parseInt(t[0].charCodeAt(i) - 64) * Math.pow(26, (t[0].length - 1 - i));
      }
      code--;
      // Make sure jexcel starts on zero
      if (code < 0) {
        code = 0;
      }
      // Number
      var number = parseInt(/[0-9]+$/.exec(id));
      if (number > 0) {
        number--;
      }
      if (arr == true) {
        id = [ code, number ];
      } else {
        // id = code + '-' + number;
        id = {
          c:code,
          r:number
        }
      }
    }
    return id;
  }catch(e){
    console.log('error',e)
  }
}
/**
 * æ›´æ”¹å‚æ•°
 *
 * @param f å‚数列表
 * @returns è¿”回一个包含坐标信息的数组
 */
function changeParameter(f){
  try {
    let arr = getABCList(f)
    let arr2 = []
    arr.forEach(item=>{
      // åˆ¤æ–­æ˜¯å¦ä¸ºèŒƒå›´ï¼Œåˆ—如MAX(A1:B2)
      if(item.includes(':')){
        let r0 = getIdFromColumnName(item.split(':')[0]).r;
        let c0 = getIdFromColumnName(item.split(':')[0]).c;
        let r1 = getIdFromColumnName(item.split(':')[1]).r;
        let c1 = getIdFromColumnName(item.split(':')[1]).c;
        for (let i = Number(r0); i <= Number(r1); i++) {
          for (let u = Number(c0); u <= Number(c1); u++) {
            arr2.push({
              r: i,
              c: u
            })
          }
        }
      }else{
        // æ²¡æœ‰åˆ™ç›´æŽ¥èŽ·å–
        arr2.push(getIdFromColumnName(item))
      }
    })
    return arr2;
  } catch (error) {
    console.log('error',error)
  }
}
/**
 * èŽ·å–åŒ…å« ABC å­—符的列表
 *
 * @param f å­—符串,包含需要解析的公式或表达式
 * @returns åŒ…含 ABC å­—符的数组列表
 */
function getABCList(f){
  try {
    let regex = /[=\+\-\*\%\(\)\/\^\s]/g;
    // ä¸Šé¢è®¡ç®—函数新增后,这里也要同步增加
    let fouList = [
      "SUM",
      'MAX',
      'MIN',
      'AVERAGE',
      'ABS',
    ]
    // æ›¿æ¢ç‰¹æ®Šå­—符
    f = f.replace(regex, ',').replace(new RegExp('"&', 'g'),'').replace(new RegExp('&"', 'g'),'')
    fouList.forEach(item=>{
      f = f.replace(new RegExp(item, 'g'),',')
    })
    let arr = f.split(',').filter(item=>{
      return item&& /[a-zA-Z]/.test(item)&&item!='undefined'&&item!='null'
    });
    return arr;
  } catch (error) {
    console.log('error',error)
  }
}
/**
 * èŽ·å–æ‰€æœ‰å•å…ƒæ ¼
 *
 * @param f è¡¨æ ¼æ•°æ®æˆ–相关参数
 * @returns è¿”回一个对象,其键为单元格的唯一标识符(由列和行ID拼接而成),值为null
 */
function getAllCell(f){
  try {
    let arr = changeParameter(f)
    let arr0 = {}
    arr.forEach(item=>{
      arr0[getColumnNameFromId(`${item.c}`+'-'+`${item.r}`)] = null
    })
    return arr0;
  } catch (error) {
    console.log('error',error)
  }
}
/**
 * è®¡ç®—函数
 *
 * @param f å­—符串类型,表示待计算的公式
 * @param comValue å¯¹è±¡ç±»åž‹ï¼Œè¡¨ç¤ºè¦æ›¿æ¢çš„单元格值,键为单元格名称,值为替换后的值
 * @returns è¿”回计算后的结果,如果计算失败则返回0
 */
function compute(f,comValue, isPoint){
  try {
    let str = f
    // èŽ·å–å•å…ƒæ ¼å¯¹åº”å€¼
    let arr = getAllCell(f)
    for (var a in comValue) {
      if(comValue[a]!=='undefined'&&comValue[a]!=='null'&&comValue[a]!==undefined){
        if(typeof(comValue[a])=='string'&&comValue[a].includes('^')){
          // è®¡ç®—幂次
          arr[a] = CalculatePower(comValue[a])
        } else{
          arr[a] = comValue[a]
        }
      }
    }
    // è§£æžå…¬å¼å‚数,特别是带:的
    let arr0 = getABCList(f)
    let obj = {}
    arr0.forEach(item=>{
      if(item.includes(':')){
        let arr1 = []
        let r0 = getIdFromColumnName(item.split(':')[0]).r;
        let c0 = getIdFromColumnName(item.split(':')[0]).c;
        let r1 = getIdFromColumnName(item.split(':')[1]).r;
        let c1 = getIdFromColumnName(item.split(':')[1]).c;
        for (let i = Number(r0); i <= Number(r1); i++) {
          for (let u = Number(c0); u <= Number(c1); u++) {
            arr1.push({
              r: i,
              c: u
            })
          }
        }
        let arr2 = []
        arr1.forEach(m=>{
          arr2.push(getColumnNameFromId(`${m.c}`+'-'+`${m.r}`))
        })
        obj[item.split(':').join('-')] = arr2.join(',')
      }else{
        obj[item] = item
      }
    })
    str = str.replace(new RegExp(':', 'g'),'-')
    // æ›¿æ¢å‚æ•°
    for (var a in obj) {
      str = str.replace(new RegExp(a, 'g'),obj[a])
    }
    // è®¡ç®—
    for (var a in arr) {
      str = str.replace(new RegExp(a, 'g'),arr[a])
    }
    if(str.includes(',,')){
      str = str.replace(new RegExp(',,', 'g'),',')
    }
    if(str.includes(',,')){
      str = str.replace(new RegExp(',,', 'g'),',')
    }
    if(str.includes(',,')){
      str = str.replace(new RegExp(',,', 'g'),',')
    }
    if(str.includes(',,')){
      str = str.replace(new RegExp(',,', 'g'),',')
    }
    if(str.includes(',,')){
      str = str.replace(new RegExp(',,', 'g'),',')
    }
    // console.log('str', str)
    if(str.includes('&"/"&')){
      // è®¡ç®—带斜杠的
      return str.replace(new RegExp('&"/"&', 'g'),'/').replace(new RegExp('//', 'g'),'')
    } else if (isPoint) {
      // è®¡ç®—带小数点的
      return str.replace('ABS', '').replace(/\(|\)/g, '')
    }else {
      console.log('str', str)
      // è®¡ç®—常规的
      return eval(str)
    }
  } catch (error) {
    console.log('error',error)
  }
}
/*
 *  big.js v5.2.2
 *  A small, fast, easy-to-use library for arbitrary-precision decimal arithmetic.
 *  Copyright (c) 2018 Michael Mclaughlin <M8ch88l@gmail.com>
 *  https://github.com/MikeMcl/big.js/LICENCE
 */
;(function (GLOBAL) {
  'use strict';
  var Big,
/************************************** EDITABLE DEFAULTS *****************************************/
    // The default values below must be integers within the stated ranges.
    /*
     * The maximum number of decimal places (DP) of the results of operations involving division:
     * div and sqrt, and pow with negative exponents.
     */
    DP = 20,          // 0 to MAX_DP
    /*
     * The rounding mode (RM) used when rounding to the above decimal places.
     *
     *  0  Towards zero (i.e. truncate, no rounding).       (ROUND_DOWN)
     *  1  To nearest neighbour. If equidistant, round up.  (ROUND_HALF_UP)
     *  2  To nearest neighbour. If equidistant, to even.   (ROUND_HALF_EVEN)
     *  3  Away from zero.                                  (ROUND_UP)
     */
    RM = 1,             // 0, 1, 2 or 3
    // The maximum value of DP and Big.DP.
    MAX_DP = 1E6,       // 0 to 1000000
    // The maximum magnitude of the exponent argument to the pow method.
    MAX_POWER = 1E6,    // 1 to 1000000
    /*
     * The negative exponent (NE) at and beneath which toString returns exponential notation.
     * (JavaScript numbers: -7)
     * -1000000 is the minimum recommended exponent value of a Big.
     */
    NE = -7,            // 0 to -1000000
    /*
     * The positive exponent (PE) at and above which toString returns exponential notation.
     * (JavaScript numbers: 21)
     * 1000000 is the maximum recommended exponent value of a Big.
     * (This limit is not enforced or checked.)
     */
    PE = 21,            // 0 to 1000000
/**************************************************************************************************/
    // Error messages.
    NAME = '[big.js] ',
    INVALID = NAME + 'Invalid ',
    INVALID_DP = INVALID + 'decimal places',
    INVALID_RM = INVALID + 'rounding mode',
    DIV_BY_ZERO = NAME + 'Division by zero',
    // The shared prototype object.
    P = {},
    UNDEFINED = void 0,
    NUMERIC = /^-?(\d+(\.\d*)?|\.\d+)(e[+-]?\d+)?$/i;
  /*
   * Create and return a Big constructor.
   *
   */
  function _Big_() {
    /*
     * The Big constructor and exported function.
     * Create and return a new instance of a Big number object.
     *
     * n {number|string|Big} A numeric value.
     */
    function Big(n) {
      var x = this;
      // Enable constructor usage without new.
      if (!(x instanceof Big)) return n === UNDEFINED ? _Big_() : new Big(n);
      // Duplicate.
      if (n instanceof Big) {
        x.s = n.s;
        x.e = n.e;
        x.c = n.c.slice();
      } else {
        parse(x, n);
      }
      /*
       * Retain a reference to this Big constructor, and shadow Big.prototype.constructor which
       * points to Object.
       */
      x.constructor = Big;
    }
    Big.prototype = P;
    Big.DP = DP;
    Big.RM = RM;
    Big.NE = NE;
    Big.PE = PE;
    Big.version = '5.2.2';
    return Big;
  }
  /*
   * Parse the number or string value passed to a Big constructor.
   *
   * x {Big} A Big number instance.
   * n {number|string} A numeric value.
   */
  function parse(x, n) {
    var e, i, nl;
    // Minus zero?
    if (n === 0 && 1 / n < 0) n = '-0';
    else if (!NUMERIC.test(n += '')) throw Error(INVALID + 'number');
    // Determine sign.
    x.s = n.charAt(0) == '-' ? (n = n.slice(1), -1) : 1;
    // Decimal point?
    if ((e = n.indexOf('.')) > -1) n = n.replace('.', '');
    // Exponential form?
    if ((i = n.search(/e/i)) > 0) {
      // Determine exponent.
      if (e < 0) e = i;
      e += +n.slice(i + 1);
      n = n.substring(0, i);
    } else if (e < 0) {
      // Integer.
      e = n.length;
    }
    nl = n.length;
    // Determine leading zeros.
    for (i = 0; i < nl && n.charAt(i) == '0';) ++i;
    if (i == nl) {
      // Zero.
      x.c = [x.e = 0];
    } else {
      // Determine trailing zeros.
      for (; nl > 0 && n.charAt(--nl) == '0';);
      x.e = e - i - 1;
      x.c = [];
      // Convert string to array of digits without leading/trailing zeros.
      for (e = 0; i <= nl;) x.c[e++] = +n.charAt(i++);
    }
    return x;
  }
  /*
   * Round Big x to a maximum of dp decimal places using rounding mode rm.
   * Called by stringify, P.div, P.round and P.sqrt.
   *
   * x {Big} The Big to round.
   * dp {number} Integer, 0 to MAX_DP inclusive.
   * rm {number} 0, 1, 2 or 3 (DOWN, HALF_UP, HALF_EVEN, UP)
   * [more] {boolean} Whether the result of division was truncated.
   */
  function round(x, dp, rm, more) {
    var xc = x.c,
      i = x.e + dp + 1;
    if (i < xc.length) {
      if (rm === 1) {
        // xc[i] is the digit after the digit that may be rounded up.
        more = xc[i] >= 5;
      } else if (rm === 2) {
        more = xc[i] > 5 || xc[i] == 5 &&
          (more || i < 0 || xc[i + 1] !== UNDEFINED || xc[i - 1] & 1);
      } else if (rm === 3) {
        more = more || !!xc[0];
      } else {
        more = false;
        if (rm !== 0) throw Error(INVALID_RM);
      }
      if (i < 1) {
        xc.length = 1;
        if (more) {
          // 1, 0.1, 0.01, 0.001, 0.0001 etc.
          x.e = -dp;
          xc[0] = 1;
        } else {
          // Zero.
          xc[0] = x.e = 0;
        }
      } else {
        // Remove any digits after the required decimal places.
        xc.length = i--;
        // Round up?
        if (more) {
          // Rounding up may mean the previous digit has to be rounded up.
          for (; ++xc[i] > 9;) {
            xc[i] = 0;
            if (!i--) {
              ++x.e;
              xc.unshift(1);
            }
          }
        }
        // Remove trailing zeros.
        for (i = xc.length; !xc[--i];) xc.pop();
      }
    } else if (rm < 0 || rm > 3 || rm !== ~~rm) {
      throw Error(INVALID_RM);
    }
    return x;
  }
  /*
   * Return a string representing the value of Big x in normal or exponential notation.
   * Handles P.toExponential, P.toFixed, P.toJSON, P.toPrecision, P.toString and P.valueOf.
   *
   * x {Big}
   * id? {number} Caller id.
   *         1 toExponential
   *         2 toFixed
   *         3 toPrecision
   *         4 valueOf
   * n? {number|undefined} Caller's argument.
   * k? {number|undefined}
   */
  function stringify(x, id, n, k) {
    var e, s,
      Big = x.constructor,
      z = !x.c[0];
    if (n !== UNDEFINED) {
      if (n !== ~~n || n < (id == 3) || n > MAX_DP) {
        throw Error(id == 3 ? INVALID + 'precision' : INVALID_DP);
      }
      x = new Big(x);
      // The index of the digit that may be rounded up.
      n = k - x.e;
      // Round?
      if (x.c.length > ++k) round(x, n, Big.RM);
      // toFixed: recalculate k as x.e may have changed if value rounded up.
      if (id == 2) k = x.e + n + 1;
      // Append zeros?
      for (; x.c.length < k;) x.c.push(0);
    }
    e = x.e;
    s = x.c.join('');
    n = s.length;
    // Exponential notation?
    if (id != 2 && (id == 1 || id == 3 && k <= e || e <= Big.NE || e >= Big.PE)) {
      s = s.charAt(0) + (n > 1 ? '.' + s.slice(1) : '') + (e < 0 ? 'e' : 'e+') + e;
    // Normal notation.
    } else if (e < 0) {
      for (; ++e;) s = '0' + s;
      s = '0.' + s;
    } else if (e > 0) {
      if (++e > n) for (e -= n; e--;) s += '0';
      else if (e < n) s = s.slice(0, e) + '.' + s.slice(e);
    } else if (n > 1) {
      s = s.charAt(0) + '.' + s.slice(1);
    }
    return x.s < 0 && (!z || id == 4) ? '-' + s : s;
  }
  // Prototype/instance methods
  /*
   * Return a new Big whose value is the absolute value of this Big.
   */
  P.abs = function () {
    var x = new this.constructor(this);
    x.s = 1;
    return x;
  };
  /*
   * Return 1 if the value of this Big is greater than the value of Big y,
   *       -1 if the value of this Big is less than the value of Big y, or
   *        0 if they have the same value.
  */
  P.cmp = function (y) {
    var isneg,
      x = this,
      xc = x.c,
      yc = (y = new x.constructor(y)).c,
      i = x.s,
      j = y.s,
      k = x.e,
      l = y.e;
    // Either zero?
    if (!xc[0] || !yc[0]) return !xc[0] ? !yc[0] ? 0 : -j : i;
    // Signs differ?
    if (i != j) return i;
    isneg = i < 0;
    // Compare exponents.
    if (k != l) return k > l ^ isneg ? 1 : -1;
    j = (k = xc.length) < (l = yc.length) ? k : l;
    // Compare digit by digit.
    for (i = -1; ++i < j;) {
      if (xc[i] != yc[i]) return xc[i] > yc[i] ^ isneg ? 1 : -1;
    }
    // Compare lengths.
    return k == l ? 0 : k > l ^ isneg ? 1 : -1;
  };
  /*
   * Return a new Big whose value is the value of this Big divided by the value of Big y, rounded,
   * if necessary, to a maximum of Big.DP decimal places using rounding mode Big.RM.
   */
  P.div = function (y) {
    var x = this,
      Big = x.constructor,
      a = x.c,                  // dividend
      b = (y = new Big(y)).c,   // divisor
      k = x.s == y.s ? 1 : -1,
      dp = Big.DP;
    if (dp !== ~~dp || dp < 0 || dp > MAX_DP) throw Error(INVALID_DP);
    // Divisor is zero?
    if (!b[0]) throw Error(DIV_BY_ZERO);
    // Dividend is 0? Return +-0.
    if (!a[0]) return new Big(k * 0);
    var bl, bt, n, cmp, ri,
      bz = b.slice(),
      ai = bl = b.length,
      al = a.length,
      r = a.slice(0, bl),   // remainder
      rl = r.length,
      q = y,                // quotient
      qc = q.c = [],
      qi = 0,
      d = dp + (q.e = x.e - y.e) + 1;    // number of digits of the result
    q.s = k;
    k = d < 0 ? 0 : d;
    // Create version of divisor with leading zero.
    bz.unshift(0);
    // Add zeros to make remainder as long as divisor.
    for (; rl++ < bl;) r.push(0);
    do {
      // n is how many times the divisor goes into current remainder.
      for (n = 0; n < 10; n++) {
        // Compare divisor and remainder.
        if (bl != (rl = r.length)) {
          cmp = bl > rl ? 1 : -1;
        } else {
          for (ri = -1, cmp = 0; ++ri < bl;) {
            if (b[ri] != r[ri]) {
              cmp = b[ri] > r[ri] ? 1 : -1;
              break;
            }
          }
        }
        // If divisor < remainder, subtract divisor from remainder.
        if (cmp < 0) {
          // Remainder can't be more than 1 digit longer than divisor.
          // Equalise lengths using divisor with extra leading zero?
          for (bt = rl == bl ? b : bz; rl;) {
            if (r[--rl] < bt[rl]) {
              ri = rl;
              for (; ri && !r[--ri];) r[ri] = 9;
              --r[ri];
              r[rl] += 10;
            }
            r[rl] -= bt[rl];
          }
          for (; !r[0];) r.shift();
        } else {
          break;
        }
      }
      // Add the digit n to the result array.
      qc[qi++] = cmp ? n : ++n;
      // Update the remainder.
      if (r[0] && cmp) r[rl] = a[ai] || 0;
      else r = [a[ai]];
    } while ((ai++ < al || r[0] !== UNDEFINED) && k--);
    // Leading zero? Do not remove if result is simply zero (qi == 1).
    if (!qc[0] && qi != 1) {
      // There can't be more than one zero.
      qc.shift();
      q.e--;
    }
    // Round?
    if (qi > d) round(q, dp, Big.RM, r[0] !== UNDEFINED);
    return q;
  };
  /*
   * Return true if the value of this Big is equal to the value of Big y, otherwise return false.
   */
  P.eq = function (y) {
    return !this.cmp(y);
  };
  /*
   * Return true if the value of this Big is greater than the value of Big y, otherwise return
   * false.
   */
  P.gt = function (y) {
    return this.cmp(y) > 0;
  };
  /*
   * Return true if the value of this Big is greater than or equal to the value of Big y, otherwise
   * return false.
   */
  P.gte = function (y) {
    return this.cmp(y) > -1;
  };
  /*
   * Return true if the value of this Big is less than the value of Big y, otherwise return false.
   */
  P.lt = function (y) {
    return this.cmp(y) < 0;
  };
  /*
   * Return true if the value of this Big is less than or equal to the value of Big y, otherwise
   * return false.
   */
  P.lte = function (y) {
    return this.cmp(y) < 1;
  };
  /*
   * Return a new Big whose value is the value of this Big minus the value of Big y.
   */
  P.minus = P.sub = function (y) {
    var i, j, t, xlty,
      x = this,
      Big = x.constructor,
      a = x.s,
      b = (y = new Big(y)).s;
    // Signs differ?
    if (a != b) {
      y.s = -b;
      return x.plus(y);
    }
    var xc = x.c.slice(),
      xe = x.e,
      yc = y.c,
      ye = y.e;
    // Either zero?
    if (!xc[0] || !yc[0]) {
      // y is non-zero? x is non-zero? Or both are zero.
      return yc[0] ? (y.s = -b, y) : new Big(xc[0] ? x : 0);
    }
    // Determine which is the bigger number. Prepend zeros to equalise exponents.
    if (a = xe - ye) {
      if (xlty = a < 0) {
        a = -a;
        t = xc;
      } else {
        ye = xe;
        t = yc;
      }
      t.reverse();
      for (b = a; b--;) t.push(0);
      t.reverse();
    } else {
      // Exponents equal. Check digit by digit.
      j = ((xlty = xc.length < yc.length) ? xc : yc).length;
      for (a = b = 0; b < j; b++) {
        if (xc[b] != yc[b]) {
          xlty = xc[b] < yc[b];
          break;
        }
      }
    }
    // x < y? Point xc to the array of the bigger number.
    if (xlty) {
      t = xc;
      xc = yc;
      yc = t;
      y.s = -y.s;
    }
    /*
     * Append zeros to xc if shorter. No need to add zeros to yc if shorter as subtraction only
     * needs to start at yc.length.
     */
    if ((b = (j = yc.length) - (i = xc.length)) > 0) for (; b--;) xc[i++] = 0;
    // Subtract yc from xc.
    for (b = i; j > a;) {
      if (xc[--j] < yc[j]) {
        for (i = j; i && !xc[--i];) xc[i] = 9;
        --xc[i];
        xc[j] += 10;
      }
      xc[j] -= yc[j];
    }
    // Remove trailing zeros.
    for (; xc[--b] === 0;) xc.pop();
    // Remove leading zeros and adjust exponent accordingly.
    for (; xc[0] === 0;) {
      xc.shift();
      --ye;
    }
    if (!xc[0]) {
      // n - n = +0
      y.s = 1;
      // Result must be zero.
      xc = [ye = 0];
    }
    y.c = xc;
    y.e = ye;
    return y;
  };
  /*
   * Return a new Big whose value is the value of this Big modulo the value of Big y.
   */
  P.mod = function (y) {
    var ygtx,
      x = this,
      Big = x.constructor,
      a = x.s,
      b = (y = new Big(y)).s;
    if (!y.c[0]) throw Error(DIV_BY_ZERO);
    x.s = y.s = 1;
    ygtx = y.cmp(x) == 1;
    x.s = a;
    y.s = b;
    if (ygtx) return new Big(x);
    a = Big.DP;
    b = Big.RM;
    Big.DP = Big.RM = 0;
    x = x.div(y);
    Big.DP = a;
    Big.RM = b;
    return this.minus(x.times(y));
  };
  /*
   * Return a new Big whose value is the value of this Big plus the value of Big y.
   */
  P.plus = P.add = function (y) {
    var t,
      x = this,
      Big = x.constructor,
      a = x.s,
      b = (y = new Big(y)).s;
    // Signs differ?
    if (a != b) {
      y.s = -b;
      return x.minus(y);
    }
    var xe = x.e,
      xc = x.c,
      ye = y.e,
      yc = y.c;
    // Either zero? y is non-zero? x is non-zero? Or both are zero.
    if (!xc[0] || !yc[0]) return yc[0] ? y : new Big(xc[0] ? x : a * 0);
    xc = xc.slice();
    // Prepend zeros to equalise exponents.
    // Note: reverse faster than unshifts.
    if (a = xe - ye) {
      if (a > 0) {
        ye = xe;
        t = yc;
      } else {
        a = -a;
        t = xc;
      }
      t.reverse();
      for (; a--;) t.push(0);
      t.reverse();
    }
    // Point xc to the longer array.
    if (xc.length - yc.length < 0) {
      t = yc;
      yc = xc;
      xc = t;
    }
    a = yc.length;
    // Only start adding at yc.length - 1 as the further digits of xc can be left as they are.
    for (b = 0; a; xc[a] %= 10) b = (xc[--a] = xc[a] + yc[a] + b) / 10 | 0;
    // No need to check for zero, as +x + +y != 0 && -x + -y != 0
    if (b) {
      xc.unshift(b);
      ++ye;
    }
    // Remove trailing zeros.
    for (a = xc.length; xc[--a] === 0;) xc.pop();
    y.c = xc;
    y.e = ye;
    return y;
  };
  /*
   * Return a Big whose value is the value of this Big raised to the power n.
   * If n is negative, round to a maximum of Big.DP decimal places using rounding
   * mode Big.RM.
   *
   * n {number} Integer, -MAX_POWER to MAX_POWER inclusive.
   */
  P.pow = function (n) {
    var x = this,
      one = new x.constructor(1),
      y = one,
      isneg = n < 0;
    if (n !== ~~n || n < -MAX_POWER || n > MAX_POWER) throw Error(INVALID + 'exponent');
    if (isneg) n = -n;
    for (;;) {
      if (n & 1) y = y.times(x);
      n >>= 1;
      if (!n) break;
      x = x.times(x);
    }
    return isneg ? one.div(y) : y;
  };
  /*
   * Return a new Big whose value is the value of this Big rounded using rounding mode rm
   * to a maximum of dp decimal places, or, if dp is negative, to an integer which is a
   * multiple of 10**-dp.
   * If dp is not specified, round to 0 decimal places.
   * If rm is not specified, use Big.RM.
   *
   * dp? {number} Integer, -MAX_DP to MAX_DP inclusive.
   * rm? 0, 1, 2 or 3 (ROUND_DOWN, ROUND_HALF_UP, ROUND_HALF_EVEN, ROUND_UP)
   */
  P.round = function (dp, rm) {
    var Big = this.constructor;
    if (dp === UNDEFINED) dp = 0;
    else if (dp !== ~~dp || dp < -MAX_DP || dp > MAX_DP) throw Error(INVALID_DP);
    return round(new Big(this), dp, rm === UNDEFINED ? Big.RM : rm);
  };
  /*
   * Return a new Big whose value is the square root of the value of this Big, rounded, if
   * necessary, to a maximum of Big.DP decimal places using rounding mode Big.RM.
   */
  P.sqrt = function () {
    var r, c, t,
      x = this,
      Big = x.constructor,
      s = x.s,
      e = x.e,
      half = new Big(0.5);
    // Zero?
    if (!x.c[0]) return new Big(x);
    // Negative?
    if (s < 0) throw Error(NAME + 'No square root');
    // Estimate.
    s = Math.sqrt(x + '');
    // Math.sqrt underflow/overflow?
    // Re-estimate: pass x coefficient to Math.sqrt as integer, then adjust the result exponent.
    if (s === 0 || s === 1 / 0) {
      c = x.c.join('');
      if (!(c.length + e & 1)) c += '0';
      s = Math.sqrt(c);
      e = ((e + 1) / 2 | 0) - (e < 0 || e & 1);
      r = new Big((s == 1 / 0 ? '1e' : (s = s.toExponential()).slice(0, s.indexOf('e') + 1)) + e);
    } else {
      r = new Big(s);
    }
    e = r.e + (Big.DP += 4);
    // Newton-Raphson iteration.
    do {
      t = r;
      r = half.times(t.plus(x.div(t)));
    } while (t.c.slice(0, e).join('') !== r.c.slice(0, e).join(''));
    return round(r, Big.DP -= 4, Big.RM);
  };
  /*
   * Return a new Big whose value is the value of this Big times the value of Big y.
   */
  P.times = P.mul = function (y) {
    var c,
      x = this,
      Big = x.constructor,
      xc = x.c,
      yc = (y = new Big(y)).c,
      a = xc.length,
      b = yc.length,
      i = x.e,
      j = y.e;
    // Determine sign of result.
    y.s = x.s == y.s ? 1 : -1;
    // Return signed 0 if either 0.
    if (!xc[0] || !yc[0]) return new Big(y.s * 0);
    // Initialise exponent of result as x.e + y.e.
    y.e = i + j;
    // If array xc has fewer digits than yc, swap xc and yc, and lengths.
    if (a < b) {
      c = xc;
      xc = yc;
      yc = c;
      j = a;
      a = b;
      b = j;
    }
    // Initialise coefficient array of result with zeros.
    for (c = new Array(j = a + b); j--;) c[j] = 0;
    // Multiply.
    // i is initially xc.length.
    for (i = b; i--;) {
      b = 0;
      // a is yc.length.
      for (j = a + i; j > i;) {
        // Current sum of products at this digit position, plus carry.
        b = c[j] + yc[i] * xc[j - i - 1] + b;
        c[j--] = b % 10;
        // carry
        b = b / 10 | 0;
      }
      c[j] = (c[j] + b) % 10;
    }
    // Increment result exponent if there is a final carry, otherwise remove leading zero.
    if (b) ++y.e;
    else c.shift();
    // Remove trailing zeros.
    for (i = c.length; !c[--i];) c.pop();
    y.c = c;
    return y;
  };
  /*
   * Return a string representing the value of this Big in exponential notation to dp fixed decimal
   * places and rounded using Big.RM.
   *
   * dp? {number} Integer, 0 to MAX_DP inclusive.
   */
  P.toExponential = function (dp) {
    return stringify(this, 1, dp, dp);
  };
  /*
   * Return a string representing the value of this Big in normal notation to dp fixed decimal
   * places and rounded using Big.RM.
   *
   * dp? {number} Integer, 0 to MAX_DP inclusive.
   *
   * (-0).toFixed(0) is '0', but (-0.1).toFixed(0) is '-0'.
   * (-0).toFixed(1) is '0.0', but (-0.01).toFixed(1) is '-0.0'.
   */
  P.toFixed = function (dp) {
    return stringify(this, 2, dp, this.e + dp);
  };
  /*
   * Return a string representing the value of this Big rounded to sd significant digits using
   * Big.RM. Use exponential notation if sd is less than the number of digits necessary to represent
   * the integer part of the value in normal notation.
   *
   * sd {number} Integer, 1 to MAX_DP inclusive.
   */
  P.toPrecision = function (sd) {
    return stringify(this, 3, sd, sd - 1);
  };
  /*
   * Return a string representing the value of this Big.
   * Return exponential notation if this Big has a positive exponent equal to or greater than
   * Big.PE, or a negative exponent equal to or less than Big.NE.
   * Omit the sign for negative zero.
   */
  P.toString = function () {
    return stringify(this);
  };
  /*
   * Return a string representing the value of this Big.
   * Return exponential notation if this Big has a positive exponent equal to or greater than
   * Big.PE, or a negative exponent equal to or less than Big.NE.
   * Include the sign for negative zero.
   */
  P.valueOf = P.toJSON = function () {
    return stringify(this, 4);
  };
  // Export
  Big = _Big_();
  Big['default'] = Big.Big = Big;
  //AMD.
  if (typeof define === 'function' && define.amd) {
    define(function () { return Big; });
  // Node and other CommonJS-like environments that support module.exports.
  } else if (typeof module !== 'undefined' && module.exports) {
    module.exports = Big;
  //Browser.
  } else {
    GLOBAL.Big = Big;
  }
})(this);
src/utils/thread/worker0.js
¶Ô±ÈÐÂÎļþ
@@ -0,0 +1,154 @@
// æ­¤çº¿ç¨‹ä¸ºæ•°æ®é‡‡é›†çº¿ç¨‹
// ä¿å­˜æ•°æ®
// æ•°æ®é‡‡é›†ä¿¡æ¯
'use strict';//为js脚本开启严格模式
let dataAcquisitionInfo = null;
// æ•°æ®åˆ—表
let list = null;
// ä¼ é€’到主线程的数据
let result = {
  method:'',
  value:null
}
// ä¼˜åŒ–数采较多数据时--记录数采项目的Id数组,目的是取最后一个数采项目,传到主线程进行批量的数据采集保存
let arrSpecial = []
// æŽ¥æ”¶ä¸»çº¿ç¨‹ä¼ é€’过来的数据
self.onmessage = function(event) {
  const data = JSON.parse(event.data);
  dataAcquisitionInfo = data.dataAcquisitionInfo;
  list = data.list;
  // console.log(111,dataAcquisitionInfo)
  arrSpecial = []
  // å¤„理数据
  handleData()
}
function handleData(){
  // éåŽ†æ•°æ®åˆ—è¡¨
  list.forEach((item,index)=>{
    let num = 0;
    let str = ''
    item.forEach(m=>{
      if(m.v.ps&&(m.v.ps.value=='检验子项'||m.v.ps.value=='检验项')){
        if(m.v.ps&&m.v.ps.value=='检验项'){
          if(num==0){
            str = m.v.v+','
            num++
          }
        }
        if(m.v.ps&&m.v.ps.value=='检验子项'){
          if(num==1){
            str = str+m.v.v
          }
        }
        // ä¸Šé¢åœ¨è®°å½•检验项+检验子项的名称,如果数采包含检验项+检验子项的数据,则执行
        if(dataAcquisitionInfo[str]){
          let num = 0;//该检验项对应检验值的个数,用用判断最多有多少个检验值,如果多次采集超过了该个数,则赋值给最后一个检验值
          list[index].forEach(n=>{
            if(n.v.ps&&n.v.ps.value&&typeof n.v.ps.value == 'string'&&n.v.ps.value.includes('检验值')){
              num++
            }
          })
          list[index].forEach((n,i)=>{
            if(n.v.ps&&n.v.ps.value&&typeof n.v.ps.value == 'string'&&n.v.ps.value.includes('检验值')){
              let arr = n.v.ps.value.split('值')
              if(Array.isArray(dataAcquisitionInfo[str].value)){
                // å¦‚果数据源为数组,则执行
                for (let i = 0; i < dataAcquisitionInfo[str].value.length; i++) {
                  if(i+1==arr[1]){
                    // èµ‹å€¼æ•°é‡‡ä¼˜åŒ–检验项列表
                    arrSpecial.push(n.i)
                    setTimeout(()=>{
                      let num0 = 0
                      if(n.v.ct&&n.v.ct.fa&&typeof n.v.ct.fa == 'string'&&n.v.ct.fa.includes('.')){
                        // ä¿ç•™æ¨¡æ¿é…ç½®çš„小数点位数
                        let str0 = n.v.ct.fa.split('.')[1]
                        num0 = str0.length
                        n.v.v = dataAcquisitionInfo[str].value[i]?Number(dataAcquisitionInfo[str].value[i]).toFixed(num0):dataAcquisitionInfo[str].value[i]
                      }else{
                        // ç›´æŽ¥èµ‹å€¼
                        n.v.v = dataAcquisitionInfo[str].value[i]
                      }
                      // ä¼ é€’给主线程
                      result = {
                        method:'changeInput',
                        value:{
                          list:list,
                          n:n
                        }
                      }
                      self.postMessage(JSON.stringify(result))
                    },2000)
                  }
                }
              }else{
                // å¦‚果数据源为字符或数字,则执行
                if(arr[1] ==dataAcquisitionInfo[str].frequency){
                  // å¦‚果数采次数等于检验值序号,则赋值给当前检验值
                  arrSpecial.push(n.i)
                  setTimeout(()=>{
                    let num0 = 0
                    if(n.v.ct&&n.v.ct.fa&&typeof n.v.ct.fa == 'string'&&n.v.ct.fa.includes('.')){
                      // ä¿ç•™æ¨¡æ¿é…ç½®çš„小数点位数
                      let str0 = n.v.ct.fa.split('.')[1]
                      num0 = str0.length
                      n.v.v = dataAcquisitionInfo[str].value?Number(dataAcquisitionInfo[str].value).toFixed(num0):dataAcquisitionInfo[str].value
                    }else{
                      // ç›´æŽ¥èµ‹å€¼
                      n.v.v = dataAcquisitionInfo[str].value
                    }
                    // ä¼ é€’给主线程
                    result = {
                      method:'changeInput',
                      value:{
                        list:list,
                        n:n
                      }
                    }
                    self.postMessage(JSON.stringify(result))
                  },2000)
                }else if(Number(dataAcquisitionInfo[str].frequency)>num){
                  // å¦‚果数采次数大于检验值序号,则赋值给最后一个检验值
                  if(n.v.ps.value.includes(num)){
                    arrSpecial.push(n.i)
                    setTimeout(()=>{
                      let num0 = 0
                      if(n.v.ct&&n.v.ct.fa&&typeof n.v.ct.fa == 'string'&&n.v.ct.fa.includes('.')){
                        // ä¿ç•™æ¨¡æ¿é…ç½®çš„小数点位数
                        let str0 = n.v.ct.fa.split('.')[1]
                        num0 = str0.length
                        n.v.v = dataAcquisitionInfo[str].value?Number(dataAcquisitionInfo[str].value).toFixed(num0):dataAcquisitionInfo[str].value
                      }else{
                        // ç›´æŽ¥èµ‹å€¼
                        n.v.v = dataAcquisitionInfo[str].value
                      }
                      // ä¼ é€’给主线程
                      result = {
                        method:'changeInput',
                        value:{
                          list:list,
                          n:n
                        }
                      }
                      self.postMessage(JSON.stringify(result))
                    },2000)
                  }
                }
              }
            }
          })
        }
      }
    })
  })
  // if(arrSpecial[arrSpecial.length-1]){
  //   //优化数采较多数据时-记录最后一个检验项的id,用于后续处理
  //   setTimeout(()=>{
  //     result = {
  //       getDataTypeId:arrSpecial[arrSpecial.length-1],
  //     }
  //     self.postMessage(JSON.stringify(result))
  //   },0)
  // }
}
src/views/business/inspectionTask/Inspection.vue
@@ -665,7 +665,6 @@
            class="form-inline"
            label-width="50px"
            style="padding-top: 0; padding-left: 10px"
            v-if="PROJECT == '检测中心'"
          >
            <el-form-item label="温度:" style="margin-bottom: 0">
              <el-input
@@ -699,7 +698,6 @@
                  tableLists.find((m) => m.templateId == currentTable)
                    .templateName == '温度循环检验原始记录' &&
                  temDataAcquisition)) &&
              PROJECT == '检测中心' &&
              state == 1
            "
            @click="getDataAcquisitionDevice"
@@ -715,7 +713,6 @@
              (tableLists.find((m) => m.templateId == currentTable) &&
                tableLists.find((m) => m.templateId == currentTable)
                  .templateName == '温度循环检验原始记录' &&
                PROJECT == '检测中心' &&
                collected &&
                state == 1)
            "
@@ -802,7 +799,9 @@
                      :disabled="
                        (getInspectionItemType(n.i) == 1 &&
                          !dataAcquisitionEidtAble) ||
                        (n.u != userId && n.u != undefined && n.u != '')
                        (n.u != loginUserInfo.userId &&
                          n.u != undefined &&
                          n.u != '')
                      "
                      @input="handleInput(n)"
                      @change="
@@ -835,7 +834,9 @@
                      v-model="n.v.v"
                      :disabled="
                        getInspectionItemType(n.i) == 1 ||
                        (n.u != userId && n.u != undefined && n.u != '')
                        (n.u != loginUserInfo.userId &&
                          n.u != undefined &&
                          n.u != '')
                      "
                      @change="
                        (m) =>
@@ -854,7 +855,9 @@
                      :disabled="
                        state > 1 ||
                        getInspectionItemType(n.i) == 1 ||
                        (n.u != userId && n.u != undefined && n.u != '')
                        (n.u != loginUserInfo.userId &&
                          n.u != undefined &&
                          n.u != '')
                      "
                      @visible-change="(e) => getDic(e, n.i)"
                      @change="
@@ -870,8 +873,8 @@
                      <el-option
                        v-for="(e, i) in enumList"
                        :key="i"
                        :label="e.label"
                        :value="e.value"
                        :label="e.dictLabel"
                        :value="e.dictValue"
                      ></el-option>
                    </el-select>
                    <span
@@ -883,27 +886,7 @@
                  <template
                    v-else-if="n.v.ps != undefined && n.v.ps.value === '结论'"
                  >
                    <el-select
                      v-if="
                        (getInspectionValueType(n.i) == 2 ||
                          getInspectionValueType(n.i) == 5) &&
                        state == 1 &&
                        PROJECT == '装备电缆'
                      "
                      class="table_input"
                      v-model="n.v.v"
                      @change="saveInsContext(n.i)"
                    >
                      <el-option label="合格" :value="1"></el-option>
                      <el-option label="不合格" :value="0"></el-option>
                    </el-select>
                    <template
                      v-if="
                        PROJECT == '检测中心' ||
                        (PROJECT == '装备电缆' &&
                          getInspectionValueType(n.i) != 2)
                      "
                    >
                    <template>
                      <span
                        v-if="n.v.v === 1"
                        :style="`font-family:${n.v.ff} !important;color: green;`"
@@ -934,7 +917,11 @@
                    <el-select
                      v-model="n.v.v"
                      placeholder="设备"
                      :disabled="n.u != userId && n.u != undefined && n.u != ''"
                      :disabled="
                        n.u != loginUserInfo.userId &&
                        n.u != undefined &&
                        n.u != ''
                      "
                      class="table_input"
                      @visible-change="(e) => getEquipOptions(e, n.i)"
                      remote
@@ -986,13 +973,6 @@
                      state == 1
                    "
                  >
                    <!-- <el-input class="table_input" type="textarea"
                      :disabled="getInspectionItemType(n.i) == 1 || (n.u != userId && n.u != undefined && n.u != '')"
                      v-model="n.v.v" @change="saveInsContext()" v-if="getInspectionValueType(n.i) == 2"></el-input>
                    <el-select v-else-if="getInspectionValueType(n.i) == 5" class="table_input" v-model="n.v.v"
                      :disabled="state>1" @visible-change="e=>getDic(e,n.i)" @change="saveInsContext()">
                      <el-option v-for="(e, i) in enumList" :key="i" :label="e.label" :value="e.value"></el-option>
                    </el-select> -->
                    <span :style="`font-family:${n.v.ff} !important;`">{{
                      toFixed(n.v.v, n.v.ct)
                    }}</span>
@@ -2894,7 +2874,7 @@
          >附件上传</el-button
        >
      </el-upload>
      <ValueTable
      <!-- <ValueTable
        class="value-table"
        ref="fileList"
        :url="$api.insOrderPlan.getFileList"
@@ -2902,7 +2882,7 @@
        :delUrl="$api.insOrderPlan.delfile"
        :key="upIndex"
        style="height: 100%; margin-top: 16px"
      />
      /> -->
    </div>
    <el-drawer title="光纤切换" :visible.sync="fiberOpticVisible" :size="500">
      <el-table
@@ -3115,11 +3095,11 @@
            <el-tag
              v-for="(item, i) in typeList"
              :key="i"
              v-if="item.value == scope.row.insState"
              :type="item.type"
              v-if="item.dictValue == scope.row.insState"
              :type="item.listClass"
              size="medium"
              style="margin-right: 5px"
              >{{ item.label }}</el-tag
              >{{ item.dictLabel }}</el-tag
            >
          </template>
        </el-table-column>
@@ -3165,14 +3145,14 @@
      </el-table>
    </el-drawer>
    <el-drawer title="任务切换" :visible.sync="taskVisible" :size="500">
      <ValueTable
      <!-- <ValueTable
        class="value-table"
        ref="insOrderPlan"
        :url="$api.insOrderPlan.inspectionOrderDetailsTaskSwitching"
        :componentData="componentData"
        :key="upIndex"
        style="height: 100%"
      />
      /> -->
    </el-drawer>
    <el-dialog title="检验复核" :visible.sync="reviewDia" width="500px">
      <div class="body" style="display: flex; padding: 10px" v-if="reviewDia">
@@ -3372,16 +3352,48 @@
</template>
<script>
import {
  doInsOrder,
  upPlanUser2,
  upPlanUser,
  saveInsContext2,
  getSagTemperatureProducts,
  temCycle,
  write,
  getInsProduct,
  getReportModel,
  verifyPlan,
  checkSubmitPlan,
  getEquipName,
  submitPlan,
  saveInsContext,
  downFile,
} from "@/api/business/inspectionTask";
import {
  temDataAcquisition,
  temDataAcquisition2,
  determineWhetherToCollectData,
  selectDeviceByCategory,
} from "@/api/cnas/resourceDemand/device";
import { getLaboratoryPersonList } from "@/api/system/user";
import { getDicts } from "@/api/system/dict/data";
import { selectDictDataByName } from "@/api/system/dict/type";
import limsTable from "@/components/Table/lims-table.vue";
import file from "@/utils/file";
import excelFunction from "@/utils/excelFountion";
import { mapGetters } from "vuex";
import { getToken } from "@/utils/auth";
export default {
  props: ["sonLaboratory", "orderId", "state", "inspectorList", "handover"],
  components: {
    limsTable,
  },
  data() {
    return {
      sonLaboratory: null,
      orderId: null,
      state: null,
      inspectorList: [],
      handover: [],
      equipName: [],
      insFibersId: null, //光纤带id
      insOrderState: null,
@@ -3410,7 +3422,6 @@
      componentData: {
        entity: {
          sonLaboratory: null,
          userId: 0,
        },
        isIndex: false,
        showSelect: false,
@@ -3498,7 +3509,6 @@
      comparisonList: [],
      excelMethodList: [],
      equipOptions: [],
      userId: 0,
      reviewLoading: false,
      reviewDia: false,
      noReason: "",
@@ -3750,20 +3760,23 @@
  },
  // ç”¨äºŽä¸Šä¼ æ–‡ä»¶çš„信息
  computed: {
    ...mapGetters(["loginUserInfo"]),
    headers() {
      return {
        token: sessionStorage.getItem("token"),
      };
      return { Authorization: "Bearer " + getToken() };
    },
    action() {
      return this.javaApi + this.$api.insOrderPlan.uploadFile;
      return this.javaApi + "/insOrderPlan/uploadFile";
    },
  },
  created() {
    console.log("检验人员---", this.inspectorList);
    this.componentData.entity.sonLaboratory = this.sonLaboratory;
    this.id = this.orderId;
    this.getUserInfo();
    console.log(this.$route.params);
    this.sonLaboratory = this.$route.params.sonLaboratory;
    this.orderId = this.$route.params.orderId;
    this.state = this.$route.params.state;
    this.inspectorList = this.$route.params.inspectorList;
    this.handover = this.$route.params.handover;
    // this.componentData.entity.sonLaboratory = this.sonLaboratory;
    this.id = this.$route.params.orderId;
  },
  mounted() {
    this.getSonLaboratoryList();
@@ -3772,26 +3785,26 @@
    this.getComparisonList();
    this.getAuthorizedPerson();
    this.scrollInit();
    this.getPower();
    // this.getPower();
    this.startWorker();
  },
  watch: {
    // ç›‘听任务id,获取任务信息
    id(val) {
      this.loading = true;
      this.$axios
        .post(this.$api.insOrderPlan.doInsOrder, {
      doInsOrder({
          id: val,
          laboratory: this.sonLaboratory,
        })
        .then(async (res) => {
          if (res.code === 200) {
          this.insOrder = res.data.insOrder;
          this.insOrderState = res.data.insState;
          this.componentData0.entity.insOrderId = val;
          this.$refs.fileList.selectList();
            // this.$refs.fileList.selectList();
          this.urgentList.forEach((m) => {
            if (m.value == this.insOrder.type) {
              this.insOrder.typeName = m.label;
              if (m.dictValue == this.insOrder.type) {
                this.insOrder.typeName = m.dictLabel;
            }
          });
          this.loading = false;
@@ -3867,18 +3880,15 @@
              currentTable: this.currentTable,
            })
          );
          }
        })
        .catch((error) => {
          console.error(error);
        });
    },
    // ç›‘听当前模板变化
    currentTable(val1, val0) {
      if (val0 != null && val1 != val0) {
        // if(this.tableLists.find(m=>m.templateId==val1)&&(this.tableLists.find(m=>m.templateId==val1).templateName=='成品缆检验原始记录')){
        //   if(this.casing.length>0){
        //     this.handleChange(this.casing[0].id,3)
        //   }
        //   return
        // }
        //76:疲劳试验检验原始记录不执行下面的操作
        if (this.changeType && this.changeType > 0) {
          // å¦‚果是光纤、光纤带,则不执行下面操作
          return;
@@ -3979,8 +3989,7 @@
      });
    },
    getSonLaboratoryList() {
      this.$axios
        .post(this.$api.insOrderPlan.upPlanUser2, {
      upPlanUser2({
          orderId: this.orderId,
        })
        .then((res) => {
@@ -3994,6 +4003,9 @@
            });
            this.connect.sonLaboratory = this.sonLaboratoryList[0].value;
          }
        })
        .catch((error) => {
          console.error(error);
        });
    },
    // å†…部交接
@@ -4015,19 +4027,20 @@
        return;
      }
      this.loading = true;
      this.$axios
        .post(this.$api.insOrderPlan.upPlanUser, {
      upPlanUser({
          orderId: this.orderId,
          userId: this.connect.connectPerson,
          sonLaboratory: this.connect.sonLaboratory,
        })
        .then((res) => {
          if (res.code === 200) {
            if (res.code === 200) {
            this.loading = false;
            this.$message.success("操作成功");
          }
          this.connectVisible = false;
          this.$emit("goback");
          }
        })
        .catch((error) => {
          console.error(error);
@@ -4250,10 +4263,7 @@
      delete obj.model;
      delete obj.methodS;
      delete obj.sampleType;
      this.$axios
        .post(
          this.$api.insOrderPlan.saveInsContext2,
          {
      saveInsContext2({
            id: this.fatigueTestInfo.insProductResult
              ? this.fatigueTestInfo.insProductResult.id
              : "",
@@ -4262,13 +4272,7 @@
            orderId: this.currentSample.insOrderId,
            insValue: JSON.stringify(obj),
            templateName: "疲劳试验",
          },
          {
            headers: {
              "Content-Type": "application/json",
            },
          }
        )
      })
        .then((res) => {
          if (res.code == 201) {
            this.$message.error("保存失败");
@@ -4276,8 +4280,8 @@
          }
          this.$message.success("保存成功");
        })
        .catch((err) => {
          console.log(err);
        .catch((error) => {
          console.error(error);
        });
    },
    // ç–²åŠ³è¯•éªŒç‰¹æ€§---结束
@@ -4358,10 +4362,7 @@
      let obj1 = {};
      obj1.arr2 = this.powerCharacteristicsInfo.arr2;
      obj1.arr3 = this.powerCharacteristicsInfo.arr3;
      this.$axios
        .post(
          this.$api.insOrderPlan.saveInsContext2,
          {
      saveInsContext2({
            id: this.powerCharacteristicsInfo.insProductResult
              ? this.powerCharacteristicsInfo.insProductResult.id
              : "",
@@ -4371,13 +4372,7 @@
            insValue: JSON.stringify(obj0),
            comValue: JSON.stringify(obj1),
            templateName: "防振锤功率特性",
          },
          {
            headers: {
              "Content-Type": "application/json",
            },
          }
        )
      })
        .then((res) => {
          if (res.code == 201) {
            this.$message.error("保存失败");
@@ -4385,8 +4380,8 @@
          }
          this.$message.success("保存成功");
        })
        .catch((err) => {
          console.log(err);
        .catch((error) => {
          console.error(error);
        });
    },
    // é˜²æŒ¯é”¤åŠŸçŽ‡ç‰¹æ€§---结束
@@ -4447,10 +4442,7 @@
        }
      }
      obj.elasticityModulus = this.stressStrainInfo.elasticity;
      this.$axios
        .post(
          this.$api.insOrderPlan.saveInsContext2,
          {
      saveInsContext2({
            id: this.stressStrainInfo.insProductResult
              ? this.stressStrainInfo.insProductResult.id
              : "",
@@ -4459,13 +4451,7 @@
            insProductId: this.stressStrainInfo.id,
            insValue: JSON.stringify(obj),
            templateName: "架空地线应力应变",
          },
          {
            headers: {
              "Content-Type": "application/json",
            },
          }
        )
      })
        .then((res) => {
          if (res.code == 201) {
            this.$message.error("保存失败");
@@ -4473,8 +4459,8 @@
          }
          this.$message.success("保存成功");
        })
        .catch((err) => {
          console.log(err);
        .catch((error) => {
          console.error(error);
        });
    },
    // åˆ é™¤è®°å½•
@@ -4507,23 +4493,6 @@
          return;
        }
        this.stressStrainInfo.elasticity = e;
        // else {
        //   this.$axios
        //     .post(
        //       this.$api.insOrderPlan.write2 +
        //         "?id=" +
        //         this.stressStrainInfo.id +
        //         "&elasticityModulus=" +
        //         e
        //     )
        //     .then((res) => {
        //       if (res.code == 201) {
        //         this.$message.error("保存失败");
        //         return;
        //       }
        //       this.$message.success("已保存");
        //     });
        // }
      }
    },
    // æž¶ç©ºå¯¼åœ°çº¿åº”力应变---结束
@@ -4564,8 +4533,7 @@
      )[0];
      // èŽ·å–è®¾å¤‡åˆ—è¡¨
      this.getEquipOptions(true, obj.id);
      this.$axios
        .post(this.$api.insOrderPlan.getSagTemperatureProducts, {
      getSagTemperatureProducts({
          sampleId: this.currentSample.id,
        })
        .then((res) => {
@@ -4677,7 +4645,9 @@
            }
          });
        })
        .catch((err) => {});
        .catch((error) => {
          console.error(error);
        });
    },
    // ä¿å­˜æ•°æ®
    saveSageInfo(type, value) {
@@ -4765,23 +4735,13 @@
          temperature = temperature + "℃";
        }
        this.dataAcquisitionLoading = true;
        this.$axios
          .post(
            this.$api.deviceScope.temDataAcquisition,
            {
        temDataAcquisition({
              entrustCode: this.insOrder.entrustCode,
              sampleCode: this.currentSample.sampleCode,
              model: this.wareForm0.model,
              cycles: this.wareForm.inspectionItem,
              temperature: temperature,
            },
            {
              headers: {
                "Content-Type": "application/json",
              },
              noQs: true,
            }
          )
        })
          .then((res) => {
            this.dataAcquisitionLoading = false;
            if (res.code != 200) {
@@ -4789,19 +4749,27 @@
            }
            // èµ‹å€¼å›žæ˜¾PK8000的数据
            this.wareFormChange();
          })
          .catch((error) => {
            console.error(error);
          });
      } else {
        const _than = this;
        // ä¸€èˆ¬çš„æ•°æ®é‡‡é›†
        _than.dataAcquisitionLoading = true;
        let urlStr =
          this.$api.deviceScope.dataCollection +
          "?entrustCode=" +
          this.insOrder.entrustCode +
          "&sampleCode=" +
          this.currentSample.sampleCode +
          "&id=" +
          this.currentSample.id;
        // let urlStr =
        //   this.$api.deviceScope.dataCollection +
        //   "?entrustCode=" +
        //   this.insOrder.entrustCode +
        //   "&sampleCode=" +
        //   this.currentSample.sampleCode +
        //   "&id=" +
        //   this.currentSample.id;
        let data = {
          entrustCode: this.insOrder.entrustCode,
          sampleCode: this.currentSample.sampleCode,
          id: this.currentSample.id,
        };
        console.log(_than.fibers);
        if (_than.fibers && _than.fibers.length > 0) {
          //当前选中的光纤带
@@ -4811,17 +4779,20 @@
          if (null == currentFibers || currentFibers.length == 0) {
            currentFibers = _than.fibers[0];
          }
          urlStr +=
            "&fiberOpticRibbon=" +
            currentFibers.bushingColor +
            "-" +
            currentFibers.code;
          // urlStr +=
          //   "&fiberOpticRibbon=" +
          //   currentFibers.bushingColor +
          //   "-" +
          //   currentFibers.code;
          data.fiberOpticRibbon =
            currentFibers.bushingColor + "-" + currentFibers.code;
        }
        let replaceUrlStr = urlStr
          .split("")
          .map((s) => s.replace("#", "%23"))
          .join("");
        this.$axios.get(replaceUrlStr).then((res) => {
        // let replaceUrlStr = urlStr
        //   .split("")
        //   .map((s) => s.replace("#", "%23"))
        //   .join("");
        dataCollection(data)
          .then((res) => {
          this.dataAcquisitionLoading = false;
          if (res.code != 200) {
            return;
@@ -4829,6 +4800,9 @@
          this.dataAcquisitionInfoNew = this.HaveJson(res.data);
          // å¯¹æ•°é‡‡å›žæ¥çš„值进行处理
          this.handleDataAcquisition(res.data);
          })
          .catch((error) => {
            console.error(error);
        });
      }
    },
@@ -5185,7 +5159,6 @@
    // å½“循环次数、温度点变化、PK8000数采时会调用,主要是获取信息进行回显
    wareFormChange(m, type) {
      if (
        this.PROJECT != "检测中心" ||
        !this.tableLists.find((m) => m.templateId == this.currentTable) ||
        this.tableLists.find((m) => m.templateId == this.currentTable)
          .templateName != "温度循环检验原始记录"
@@ -5202,8 +5175,7 @@
        wareForm.inspectionItemSubclass = wareForm.inspectionItemSubclass + "℃";
      }
      this.wareTableDataLoading = true;
      this.$axios
        .post(this.$api.insOrderPlan.temCycle, {
      temCycle({
          sampleId: this.currentSample.id,
          ...wareForm,
        })
@@ -5371,6 +5343,9 @@
          });
          // è¿™æ˜¯é¡µé¢æœ€ç»ˆå‘ˆçŽ°çš„æ ¼å¼
          this.wareTableData = arr2;
        })
        .catch((error) => {
          console.error(error);
        });
      // èŽ·å–è®¾å¤‡åˆ—è¡¨
      this.getEquipOptions(true, this.currentSample.insProduct[0].id);
@@ -5381,8 +5356,7 @@
    // å¾ªçŽ¯æ¬¡æ•°åˆ‡æ¢æ—¶è°ƒç”¨
    thermalCyclingChange() {
      this.thermalCyclingLoading = true;
      this.$axios
        .post(this.$api.insOrderPlan.temCycle, {
      temCycle({
          sampleId: this.currentSample.id,
          inspectionItem: this.thermalCyclingInfo.inspectionItem,
        })
@@ -5391,13 +5365,6 @@
          if (res.code == 201) return;
          let { productVos, sampleVo } = res.data;
          this.thermalCyclingInfo = { ...this.thermalCyclingInfo, ...sampleVo };
          // if(this.thermalCyclingInfo.inspectionItem>1){
          //   for(let i in this.param){
          //     if(this.param[i].inspectionItemSubclass){
          //       delete this.param[i]
          //     }
          //   }
          // }
          for (let i in this.param) {
            if (this.param[i].inspectionItemSubclass) {
              delete this.param[i];
@@ -5495,6 +5462,9 @@
          }
          // èŽ·å–è®¾å¤‡åˆ—è¡¨
          this.getEquipOptions(true, this.currentSample.insProduct[0].id);
        })
        .catch((error) => {
          console.error(error);
        });
    },
    // æ·»åŠ æ£€éªŒå€¼
@@ -5785,27 +5755,17 @@
    // å•根垂直燃烧---结束
    // ä¿å­˜æ¹¿åº¦ã€æ¸©åº¦æ•°æ®
    subOtherForm(m, type) {
      // let ids = []
      // for (let i in this.param) {
      //   ids.push(i)
      // }
      this.$axios
        .post(
          this.$api.insOrderPlan.write,
          {
      write({
            [type]: Number(m),
            insOrderId: this.currentSample.insOrderId,
          },
          {
            headers: {
              "Content-Type": "application/json",
            },
            noQs: true,
          }
        )
      })
        .then((res) => {
          if (res.code == 201) return;
          if (res.code === 200) {
          this.$message.success("保存成功");
          }
        })
        .catch((error) => {
          console.error(error);
        });
    },
    // æƒé™èŽ·å–
@@ -5837,29 +5797,28 @@
      this.temDataAcquisition = temDataAcquisition;
    },
    uploadSample() {
      this.$axios
        .post(this.$api.insOrderPlan.doInsOrder, {
      doInsOrder({
          id: this.id,
          laboratory: this.sonLaboratory,
        })
        .then(async (res) => {
        .then((res) => {
          if (res.code === 200) {
          this.sampleProduct = res.data.sampleProduct;
          }
        })
        .catch((error) => {
          console.error(error);
        });
    },
    // æ ¹æ®ç±»åž‹ã€ä»»åŠ¡id、实验室来获取样品的检验项信息
    async getCurrentProduct(id, type) {
      this.tableLoading = true;
      let res = await this.$axios.post(
        this.$api.insOrderPlan.getInsProduct +
          "?id=" +
          id +
          "&type=" +
          type +
          "&laboratory=" +
          this.sonLaboratory
      );
      let res = await getInsProduct({
        id: id,
        type: type,
        laboratory: this.sonLaboratory,
      });
      this.tableLoading = false;
      console.log("getCurrentProduct-->", res.data);
      return res.data;
    },
    handleChangeBushing(row, column, event) {
@@ -5989,24 +5948,21 @@
    },
    // èŽ·å–å¥—ç®¡,光纤带,光纤数据
    getReportModel(id) {
      if (this.PROJECT != "检测中心") {
        return;
      }
      this.getReportModelLoading = true;
      this.$axios
        .post(
          this.$api.insOrderPlan.getReportModel +
            "?sampleId=" +
            id +
            "&sonLaboratory=" +
            this.sonLaboratory,
          {}
        )
      getReportModel({
        sampleId: id,
        sonLaboratory: this.sonLaboratory,
      })
        .then((res) => {
          if (res.code === 200) {
          this.getReportModelLoading = false;
          this.fibers = res.data["光纤带"];
          this.fiber = res.data["光纤"];
          this.casing = res.data["套管"];
          }
        })
        .catch((error) => {
          console.error(error);
        });
    },
    // å¥—管,光纤带,光纤等切换,对应原始记录模板也要切换
@@ -6063,63 +6019,52 @@
    },
    // å­—典获取信息
    getTypeDicts() {
      this.$axios
        .post(this.$api.enums.selectEnumByCategory, {
          category: "紧急程度",
        })
      getDicts("urgency_level")
        .then((res) => {
          let data = res.data;
          data.forEach((ele) => {
            if (ele.value === "0") {
              ele.type = "success";
            } else if (ele.value === "1") {
              ele.type = "warning";
            } else if (ele.value === "2") {
              ele.type = "danger";
          if (res.code === 200) {
            this.urgentList = res.data;
            }
          });
          this.urgentList = data;
          this.componentData.tagField.type.select = data;
        });
      this.$axios
        .post(this.$api.enums.selectEnumByCategory, {
          category: "载荷",
        })
        .then((res) => {
          this.loadList = res.data;
        .catch((error) => {
          console.error(error);
        });
      // getDicts("").then(res=>{
      //   if(res.status===200){
      //     console.log(res)
      //   }
      // }).catch(error=>{
      //   console.error(error)
      // })
      // this.$axios
      //   .post(this.$api.enums.selectEnumByCategory, {
      //     category: "载荷",
      //   })
      //   .then((res) => {
      //     this.loadList = res.data;
      //   });
    },
    // å­—典获取信息
    getInsStateDicts() {
      this.$axios
        .post(this.$api.enums.selectEnumByCategory, {
          category: "检验任务状态",
        })
      getDicts("inspection_task_state")
        .then((res) => {
          let data = res.data;
          data.forEach((ele) => {
            //0:待检验 1:检验中 2:已检验 3:待复核 4:复核未通过 5:复核通过
            if (["2", "5"].includes(ele.value)) {
              ele.type = "success";
            } else if (["1", "3"].includes(ele.value)) {
              ele.type = "warning";
            } else if (["0", "4"].includes(ele.value)) {
              ele.type = "danger";
          if (res.code === 200) {
            this.typeList = res.data;
            }
          });
          this.typeList = data;
          this.componentData.tagField.insState.select = data;
        })
        .catch((error) => {
          console.error(error);
        });
    },
    // å­—典获取信息
    getComparisonList() {
      this.$axios
        .post(this.$api.enums.selectEnumByCategory, {
          category: "表格坐标转换",
        })
      getDicts("coordinate_transformation")
        .then((res) => {
          let data = res.data;
          this.comparisonList = data;
          if (res.code === 200) {
            this.comparisonList = res.data;
          }
        })
        .catch((error) => {
          console.error(error);
        });
    },
    // èŽ·å–æ£€éªŒå€¼ä¸ºä¸‹æ‹‰æ—¶çš„ä¸‹æ‹‰åˆ—è¡¨
@@ -6128,12 +6073,14 @@
      if (val === undefined || val === null) {
        return;
      }
      this.$axios
        .post(this.$api.enums.selectEnumByCategory, {
          category: val,
        })
      selectDictDataByName(val)
        .then((res) => {
          if (res.code === 200) {
          this.enumList = res.data;
          }
        })
        .catch((error) => {
          console.error(error);
        });
    },
    tableRowClassName({ row, rowIndex }) {
@@ -6247,23 +6194,18 @@
        });
        // åˆå§‹åŒ–页面数据
        this.wareTableDataLoading = true;
        this.$axios
          .post(
            this.$api.deviceScope.temDataAcquisition2,
            {
        temDataAcquisition2({
              entrustCode: this.insOrder.entrustCode,
              sampleCode: this.currentSample.sampleCode,
              model: this.currentSample.model,
            },
            {
              headers: {
                "Content-Type": "application/json",
              },
              noQs: true,
            }
          )
        })
          .then((res) => {
            if (res.code === 200) {
            this.wareFormChange();
            }
          })
          .catch((error) => {
            console.error(error);
          });
      }
      // æ¸©åº¦å¾ªçŽ¯æ£€éªŒåŽŸå§‹è®°å½•---结束
@@ -6635,8 +6577,9 @@
              conclusionList.forEach((n, i) => {
                if (n.r == b.r && n.c == b.c) {
                  b.v.f = `(${
                    this.comparisonList.find((j) => j.value == finalList[i].c)
                      .label
                    this.comparisonList.find(
                      (j) => j.dictValue == finalList[i].c
                    ).dictLabel
                  }${finalList[i].r + 1})`;
                }
              });
@@ -6649,7 +6592,7 @@
          }
        });
        // ä»¥ä¸‹æ˜¯æ ·å¼å¤„理逻辑
        set = Array.sort(set);
        set = Array.from(set).sort((a, b) => a - b);
        set.forEach((b) => {
          let arr = [];
          a.template.forEach((c) => {
@@ -6886,7 +6829,6 @@
    },
    // æ£€éªŒå€¼è¾“入后触发的函数
    changeInput(m, code, n, getDataType) {
      console.log("---->999");
      // ä¸ºæ•°é‡‡å®šä¹‰ä¸€ä¸ªé€»è¾‘参数
      if (getDataType == "getDataType") {
        this.getDataType = 2;
@@ -6895,7 +6837,6 @@
      if (n) {
        currentInsItemId = JSON.parse(JSON.stringify(n.i));
        // éœ€è¦ç§‘学计数法的可以走这里
        if (this.PROJECT === "检测中心") {
          if (
            this.currentSample.insProduct.find(
              (ele) =>
@@ -6905,7 +6846,6 @@
            if (parseFloat(n.v.v) >= 100000) {
              let num2 = new this.$Big(n.v.v);
              n.v.v = num2.toExponential();
            }
          }
        }
        // å®šä¹‰ä¸€ä¸ªå‡½æ•°æ¥éªŒè¯åˆ†æ•°æ˜¯å¦æœ‰æ•ˆ
@@ -6927,7 +6867,6 @@
            excelMethodList: this.excelMethodList,
            comparisonList: this.comparisonList,
            currentSample: this.currentSample,
            PROJECT: this.PROJECT,
            param: this.param,
            currentTable: this.currentTable,
            getDataTypeId: this.getDataTypeId,
@@ -6945,7 +6884,6 @@
        switch (this.result.method) {
          case "saveInsContext":
            this.$nextTick(() => {
              // this.$delete(this.tableList[0],'arr')
              this.$set(
                this.tableList[0],
                "arr",
@@ -6970,34 +6908,6 @@
                }
              }
              this.saveInsContext(currentInsItemId);
              // å¦‚果是数采可编辑输入的情况,可以直接保存数据
              // if(this.getDataType==2){
              //   console.log("aaaaaa--->>>",currentInsItemId);
              //   this.saveInsContext()
              // }else{
              //   if(this.isGet&&!this.dataAcquisitionEidtAble){
              //     // if(this.result.value.getDataTypeId==''){
              //     //   // å¦‚果是数采不可编辑输入的情况,且最后一个数采没有完成,则不保存数据
              //     //   return
              //     // }
              //     // ä¿å­˜æ•°æ®
              //     this.saveInsContext()
              //     // setTimeout(()=>{
              //     // },2000)
              //   }else if(this.isGet&&this.dataAcquisitionEidtAble){
              //     if(this.getDataType==1){
              //       // if(this.result.value.getDataTypeId==''){
              //       //   // å¦‚果是数采可编辑输入的情况,且最后一个数采没有完成,则不保存数据
              //       //   return
              //       // }
              //       this.saveInsContext()
              //     }else{
              //       this.saveInsContext()
              //     }
              //   }else{
              //     this.saveInsContext()
              //   }
              // }
            });
            break;
          case "tableList":
@@ -7016,10 +6926,9 @@
    },
    // æ˜¯å¦éœ€è¦æ•°é‡‡
    async determineWhetherToCollectData() {
      let res = await this.$axios.get(
        this.$api.deviceScope.determineWhetherToCollectData +
          "?managementNumber=''"
      );
      let res = await determineWhetherToCollectData({
        managementNumber: "",
      });
      this.isGet = res.data;
      if (
        this.currentSample.insProduct.filter(
@@ -7261,9 +7170,7 @@
      if (e) {
        this.equipOptions = [];
        let product = this.currentSample.insProduct.find((m) => m.id == id);
        console.log(product);
        this.$axios
          .post(this.$api.deviceScope.selectDeviceByCategory, {
        selectDeviceByCategory({
            inspectionItem: product.inspectionItem,
            inspectionItemSubclass: product.inspectionItemSubclass,
            sonLaboratory: product.sonLaboratory,
@@ -7293,20 +7200,12 @@
        }
      }
    },
    getUserInfo() {
      this.$axios.get(this.$api.user.getUserInfo).then((res) => {
        this.userId = res.data.id;
        this.componentData.entity.userId = res.data.id;
        // console.log(1111,this.userId)
      });
    },
    // å¤æ ¸
    upInsReview(e) {
      if (e == 1) {
        // é€šè¿‡
        this.reviewLoading = true;
        this.$axios
          .post(this.$api.insOrderPlan.verifyPlan, {
        verifyPlan({
            orderId: this.orderId,
            type: 1,
            laboratory: this.sonLaboratory,
@@ -7331,8 +7230,7 @@
    handleReviewDia() {
      if (this.noReason) {
        this.reviewLoading = true;
        this.$axios
          .post(this.$api.insOrderPlan.verifyPlan, {
        verifyPlan({
            orderId: this.orderId,
            type: 0,
            laboratory: this.sonLaboratory,
@@ -7368,8 +7266,7 @@
      }
      this.addVerifyDia = false;
      this.submitLoading = true;
      this.$axios
        .post(this.$api.insOrderPlan.checkSubmitPlan, {
      checkSubmitPlan({
          orderId: this.orderId,
          laboratory: this.sonLaboratory,
          humidity: this.otherForm.humidity,
@@ -7378,16 +7275,11 @@
        .then((res) => {
          if (res.code === 200) {
            if (!res.data || res.data.length == 0) {
              this.$axios
                .get(
                  this.$api.insOrderPlan.getEquipName +
                    "?orderId=" +
                    this.orderId +
                    "&sonLaboratory=" +
                    this.sonLaboratory
                )
              getEquipName({
                orderId: this.orderId,
                sonLaboratory: this.sonLaboratory,
              })
                .then((response) => {
                  console.log(typeof response.data, response.data.length);
                  if (response.data.length > 0) {
                    let newData = [];
                    const h = this.$createElement;
@@ -7418,8 +7310,7 @@
                      type: "",
                    })
                      .then(() => {
                        this.$axios
                          .post(this.$api.insOrderPlan.submitPlan, {
                        submitPlan({
                            orderId: this.orderId,
                            laboratory: this.sonLaboratory,
                            verifyUser: this.verifyUser,
@@ -7431,14 +7322,16 @@
                              this.$emit("goback");
                            }
                            this.submitLoading = false;
                          })
                          .catch((error) => {
                            console.error(error);
                          });
                      })
                      .catch(() => {
                        this.submitLoading = false;
                      });
                  } else {
                    this.$axios
                      .post(this.$api.insOrderPlan.submitPlan, {
                    submitPlan({
                        orderId: this.orderId,
                        laboratory: this.sonLaboratory,
                        verifyUser: this.verifyUser,
@@ -7450,35 +7343,21 @@
                          this.$emit("goback");
                        }
                        this.submitLoading = false;
                      })
                      .catch((error) => {
                        console.error(error);
                      });
                  }
                })
                .catch((error) => {
                  console.error(error);
                });
              // this.$axios
              //   .post(this.$api.insOrderPlan.submitPlan, {
              //     orderId: this.orderId,
              //     laboratory: this.sonLaboratory,
              //     verifyUser: this.verifyUser,
              //     entrustCode: this.insOrder.entrustCode,
              //   })
              //   .then((res) => {
              //     if (res.code === 200) {
              //       this.$message.success("操作成功");
              //       this.$emit("goback");
              //     }
              //     this.submitLoading = false;
              //   })
            } else {
              this.$axios
                .get(
                  this.$api.insOrderPlan.getEquipName +
                    "?orderId=" +
                    this.orderId +
                    "&sonLaboratory=" +
                    this.sonLaboratory
                )
              getEquipName({
                orderId: this.orderId,
                sonLaboratory: this.sonLaboratory,
              })
                .then((response) => {
                  console.log(typeof response.data, response.data.length);
                  if (response.data.length > 0) {
                    let newData = [];
                    const h = this.$createElement;
@@ -7550,8 +7429,7 @@
                          type: "",
                        })
                          .then(() => {
                            this.$axios
                              .post(this.$api.insOrderPlan.submitPlan, {
                            submitPlan({
                                orderId: this.orderId,
                                laboratory: this.sonLaboratory,
                                verifyUser: this.verifyUser,
@@ -7613,8 +7491,7 @@
                      type: "",
                    })
                      .then(() => {
                        this.$axios
                          .post(this.$api.insOrderPlan.submitPlan, {
                        submitPlan({
                            orderId: this.orderId,
                            laboratory: this.sonLaboratory,
                            verifyUser: this.verifyUser,
@@ -7632,66 +7509,10 @@
                      .catch(() => {});
                    this.submitLoading = false;
                  }
                })
                .catch((error) => {
                  console.error(error);
                });
              //   let newData = [];
              //   const h = this.$createElement;
              //   // åŽ»é‡ä¸åˆæ ¼å¤„ç†
              //   let set = new Set();
              //   res.data.forEach((item) => {
              //     if (!set.has(item)) {
              //       set.add(item);
              //     }
              //   });
              //   res.data = Array.from(set);
              //   for (let i in res.data) {
              //     const lastChar = res.data[i].slice(-1);
              //     if (lastChar == "-") {
              //       res.data[i] = res.data[i].slice(0, -1);
              //     }
              //     newData.push(
              //       h(
              //         "p",
              //         { style: "font-size: 14px;color: red;" },
              //         Number(i) + 1 + "、" + res.data[i]
              //       )
              //     );
              //   }
              //   newData.push(
              //     h(
              //       "p",
              //       {
              //         style:
              //           "font-size: 16px;color:#000;margin-top:12px;overflow-y: auto;max-height:80vh",
              //       },
              //       "以上项目不合格,确定提交?"
              //     )
              //   );
              //   this.$confirm("提示", {
              //     title: "提示",
              //     message: h("div", null, newData),
              //     confirmButtonText: "确定",
              //     cancelButtonText: "取消",
              //     type: "",
              //   })
              //     .then(() => {
              //       this.$axios
              //         .post(this.$api.insOrderPlan.submitPlan, {
              //           orderId: this.orderId,
              //           laboratory: this.sonLaboratory,
              //           verifyUser: this.verifyUser,
              //         })
              //         .then((res) => {
              //           if (res.code === 200) {
              //             this.$message.success("操作成功");
              //             this.$emit("goback");
              //           }
              //         })
              //         .catch((error) => {
              //           console.error(error);
              //         });
              //     })
              //     .catch(() => {});
            }
          }
          this.submitLoading = false;
@@ -7704,7 +7525,6 @@
    },
    // ç»Ÿä¸€åœ¨è¿™é‡Œä¿å­˜æ•°æ®
    saveInsContext(currentInsItemId, isDelete = false) {
      // console.log("saveInsContext-->",this.param);
      try {
        if (this.param) {
          let param = null;
@@ -7713,10 +7533,8 @@
          } else {
            param = this.param;
          }
          console.log("param-->", param);
          this.$axios
            .post(this.$api.insOrderPlan.saveInsContext, {
              param: JSON.stringify(param),
          saveInsContext({
            param: param,
              currentTable: this.currentTable,
              sampleId: this.currentSample.id,
              orderId: this.orderId,
@@ -7729,6 +7547,9 @@
                return;
              }
              this.$message.success("已保存");
            })
            .catch((error) => {
              console.error(error);
            });
          // å‘ Worker å‘送消息,开始处理逻辑
          this.worker.postMessage(
@@ -7846,18 +7667,14 @@
      //this.saveInsContext(ids[i]);
    },
    getAuthorizedPerson() {
      this.$axios.get(this.$api.user.getLaboratoryPersonList).then((res) => {
        // let data = []
        // // let userName = JSON.parse(localStorage.getItem("user")).name;
        // res.data.forEach(a => {
        //   if(!this.inspectorList.includes(a.name)) {
        //     data.push({
        //     label: a.name,
        //     value: a.id
        //   })
        //   }
        // })
      getLaboratoryPersonList()
        .then((res) => {
          if (res.code === 200) {
        this.personList = res.data;
          }
        })
        .catch((error) => {
          console.error(error);
      });
    },
    scrollInit() {
@@ -8040,8 +7857,7 @@
      this.$refs.upload.clearFiles();
    },
    handleDown(row) {
      this.$axios
        .post(this.$api.insOrderPlan.downFile, {
      downFile({
          id: row.id,
        })
        .then((res) => {
@@ -8059,7 +7875,9 @@
            }
          }
        })
        .catch((error) => {});
        .catch((error) => {
          console.error(error);
        });
    },
    /**
     * å°†æ•°å€¼v保留ct.fa中'##'后的指定小数位数,并返回格式化后的字符串。
src/views/business/inspectionTask/index.vue
@@ -211,7 +211,7 @@
      </span>
    </el-dialog>
    <el-dialog title="检验交接" :visible.sync="connectVisible" width="400px">
      <div class="search_thing">
      <div class="search_thing" style="width: 100%">
        <div class="search_label" style="width: 90px">
          <span class="required-span">* </span>交接人员:
        </div>
@@ -241,7 +241,7 @@
          </el-select>
        </div>
      </div>
      <div class="search_thing">
      <div class="search_thing" style="width: 100%">
        <div class="search_label" style="width: 90px">
          <span class="required-span">* </span>试验室:
        </div>
@@ -269,9 +269,6 @@
        >
      </span>
    </el-dialog>
    <div style="width: 100%; height: 100%" v-if="activeFace > 0">
      <Add :active="activeFace" :currentId="currentId" :examine="examine" />
    </div>
    <Inspection
      v-if="state > 0"
      @goback="goback"
@@ -288,14 +285,14 @@
      width="100%"
      fullscreen
    >
      <!-- <div
      <div
        style="width: 100%; text-align: right; margin-bottom: 10px"
        v-if="premissionReviewFun()"
      >
        <el-button type="primary" size="small" @click="goReview(currentRow)"
          >前往复核</el-button
        >
      </div> -->
      </div>
      <lims-table
        ref="dataLookTable"
        highlightCurrentRow
@@ -741,6 +738,17 @@
  },
  computed: {
    ...mapGetters(["permissions", "nickName"]),
    title() {
      return this.selectTab + "检验结果显示";
    },
    isLeader() {
      const power = JSON.parse(sessionStorage.getItem("power"));
      if (power) {
        const filterList = power.filter((ele) => ele.menuMethod == "leader");
        return filterList.length > 0;
      }
      return false;
    },
  },
  data() {
    return {
@@ -895,7 +903,7 @@
                  row.userName == null ||
                  row.insState == 3 ||
                  row.insState == 5 ||
                  (row.userName && !row.userName.includes(this.nickName))
                  (row.userName && !this.hasExistUserName(row.userName))
                );
              },
            },
@@ -911,7 +919,7 @@
                  row.insState == 5 ||
                  row.insState == 3 ||
                  (row.userName &&
                    !row.userName.includes(this.nickName) &&
                    !this.hasExistUserName(row.userName) &&
                    !this.isLeader)
                );
              },
@@ -926,7 +934,7 @@
                return (
                  row.userName == null ||
                  row.insState != 3 ||
                  (row.checkName && !row.checkName.includes(this.nickName))
                  (row.checkName && !this.hasExistUserName(row.userName))
                );
              },
            },
@@ -1313,20 +1321,11 @@
      });
    },
  },
  computed: {
    title() {
      return this.selectTab + "检验结果显示";
    },
    isLeader() {
      const power = JSON.parse(sessionStorage.getItem("power"));
      if (power) {
        const filterList = power.filter((ele) => ele.menuMethod == "leader");
        return filterList.length > 0;
      }
      return false;
    },
  },
  methods: {
    //判断检验人中是否包含当前用户
    hasExistUserName(userName) {
      return userName.includes(this.nickName);
    },
    pagination({ page, limit }) {
      this.page.current = page;
      this.page.size = limit;
@@ -1876,9 +1875,20 @@
        inspectorList = row.userName.split(",");
      }
      inspectorList.push(this.nickName);
      this.inspectorList = inspectorList;
      this.state = 1;
      this.orderId = row.id;
      this.$router.push({
        name: "inspection",
        params: {
          inspectorList: inspectorList,
          state: 1,
          orderId: row.id,
          sonLaboratory: this.queryParams.sonLaboratory,
          handover: this.personList,
        },
      });
      // this.inspectorList = inspectorList;
      // this.state = 1;
      // this.orderId = row.id;
    },
    handleConnect(row) {
      this.orderId = row.id;
src/views/standard/standardLibrary/index.vue
@@ -124,7 +124,7 @@
}
>>>.el-table__body-wrapper::-webkit-scrollbar {
  height: 14px;
  height: 6px;
  /* è®¾ç½®æ»šåŠ¨æ¡å®½åº¦ */
}
</style>
@@ -135,7 +135,10 @@
  border-radius: 2px;
}
.standard .el-tree--highlight-current .el-tree-node.is-current>.el-tree-node__content {
.standard
  .el-tree--highlight-current
  .el-tree-node.is-current
  > .el-tree-node__content {
  color: #3a7bfa;
}
@@ -186,38 +189,81 @@
    <div class="left">
      <el-row>
        <el-col :span="20">
          <el-input placeholder="输入关键字进行搜索" suffix-icon="el-icon-search" v-model="search" size="small"
            style="margin-bottom: 5px" clearable @blur="searchFilter" @clear="searchFilter"></el-input>
          <el-input
            placeholder="输入关键字进行搜索"
            suffix-icon="el-icon-search"
            v-model="search"
            size="small"
            style="margin-bottom: 5px"
            clearable
            @blur="searchFilter"
            @clear="searchFilter"
          ></el-input>
        </el-col>
        <el-col :span="4" style="text-align: center; line-height: 30px" v-if="addPower">
          <el-button type="primary" icon="el-icon-plus" size="mini" circle @click="addDia = true"></el-button>
        <el-col
          :span="4"
          style="text-align: center; line-height: 30px"
          v-if="addPower"
        >
          <el-button
            type="primary"
            icon="el-icon-plus"
            size="mini"
            circle
            @click="addDia = true"
          ></el-button>
        </el-col>
      </el-row>
      <el-tree :data="list" ref="tree" :props="{ children: 'children', label: 'label' }" node-key="label"
        :filter-node-method="filterNode" @node-click="handleNodeClick" highlight-current v-loading="treeLoad"
        :expand-on-click-node="false" :default-expanded-keys="expandedKeys" style="
      <el-tree
        :data="list"
        ref="tree"
        :props="{ children: 'children', label: 'label' }"
        node-key="label"
        :filter-node-method="filterNode"
        @node-click="handleNodeClick"
        highlight-current
        v-loading="treeLoad"
        :expand-on-click-node="false"
        :default-expanded-keys="expandedKeys"
        style="
          height: calc(100% - 30px);
          overflow-y: scroll;
          scrollbar-width: none;
        ">
        "
      >
        <div class="custom-tree-node" slot-scope="{ node, data }">
          <el-row style="width: 100%">
            <el-col :span="21" :class="{ sort: node.level > 3 }" :title="data.label" style="text-align: left">
            <el-col
              :span="21"
              :class="{ sort: node.level > 3 }"
              :title="data.label"
              style="text-align: left"
            >
              <span>
                <i :class="`node_i ${data.children != undefined
                <i
                  :class="`node_i ${
                    data.children != undefined
                  ? data.code === '[1]'
                    ? 'el-icon-folder-opened'
                    : 'el-icon-folder'
                  : 'el-icon-tickets'
                  }`"></i>
                  }`"
                ></i>
                {{ data.label }}
              </span>
            </el-col>
            <el-col :span="2" style="text-align: right" v-if="
              (node.data.children === null ||
                node.data.children === undefined)
            ">
              <el-button type="text" size="mini" @click.stop="remove(node, data)">
            <el-col
              :span="2"
              style="text-align: right"
              v-if="
                node.data.children === null || node.data.children === undefined
              "
            >
              <el-button
                type="text"
                size="mini"
                @click.stop="remove(node, data)"
              >
                <i class="el-icon-delete"></i>
              </el-button>
            </el-col>
@@ -230,98 +276,246 @@
        <el-col :span="20" style="font-size: 14px; color: #999">{{
          selectTree
        }}</el-col>
        <el-button size="small" type="primary" style="position: absolute; right: 100px; top: 1px"
          @click="uploadDia = true" v-if="inExcelOfTreePower">导入</el-button>
        <el-button size="small" type="primary" @click="handleMore" style="position: absolute; right: 5px; top: 1px"
          v-if="upStandardProduct">批量编辑</el-button>
        <el-button
          size="small"
          type="primary"
          style="position: absolute; right: 100px; top: 1px"
          @click="uploadDia = true"
          v-if="inExcelOfTreePower"
          >导入</el-button
        >
        <el-button
          size="small"
          type="primary"
          @click="handleMore"
          style="position: absolute; right: 5px; top: 1px"
          v-if="upStandardProduct"
          >批量编辑</el-button
        >
      </el-row>
      <el-row class="standard_table" v-loading="tableLoad">
        <el-table class="el-table" :data="standardList" style="width: 100%; height: 220px !important" height="220"
          tooltip-effect="dark" highlight-current-row @row-click="rowClick" ref="standard"
          header-row-class-name="header-class">
          <el-table-column prop="code" label="标准编号" show-overflow-tooltip width="200">
        <el-table
          class="el-table"
          :data="standardList"
          style="width: 100%; height: 220px !important"
          height="220"
          tooltip-effect="dark"
          highlight-current-row
          @row-click="rowClick"
          ref="standard"
          header-row-class-name="header-class"
        >
          <el-table-column
            prop="code"
            label="标准编号"
            show-overflow-tooltip
            width="200"
          >
            <template slot-scope="scope">
              <span style="color: red; font-size: 14px">{{
                scope.row["code"]
              }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="name" label="标准名称" show-overflow-tooltip></el-table-column>
          <el-table-column prop="remark" label="备注" show-overflow-tooltip></el-table-column>
          <el-table-column
            prop="name"
            label="标准名称"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column
            prop="remark"
            label="备注"
            show-overflow-tooltip
          ></el-table-column>
        </el-table>
      </el-row>
      <el-row class="product_table" v-loading="tableLoad2">
        <el-table :data="productList" ref="productTable" style="width: 100%" height="100%" tooltip-effect="dark" stripe
          :fit="true" border @selection-change="handleSelectionChange" :row-class-name="tableRowClassName"
          @select="upProductSelect" @select-all="handleAll" class="productTable" header-row-class-name="header-class">
        <el-table
          :data="productList"
          ref="productTable"
          style="width: 100%"
          height="100%"
          tooltip-effect="dark"
          stripe
          :fit="true"
          border
          @selection-change="handleSelectionChange"
          :row-class-name="tableRowClassName"
          @select="upProductSelect"
          @select-all="handleAll"
          class="productTable"
          header-row-class-name="header-class"
        >
          <el-table-column type="selection" width="50"> </el-table-column>
          <el-table-column prop="sample" label="产品" min-width="100" show-overflow-tooltip></el-table-column>
          <el-table-column prop="model" label="型号" min-width="100" show-overflow-tooltip></el-table-column>
          <el-table-column prop="inspectionItem" label="检验项" min-width="140" show-overflow-tooltip></el-table-column>
          <el-table-column
            prop="sample"
            label="产品"
            min-width="100"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column
            prop="model"
            label="型号"
            min-width="100"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column
            prop="inspectionItem"
            label="检验项"
            min-width="140"
            show-overflow-tooltip
          ></el-table-column>
          <!-- <el-table-column prop="inspectionItemClassify" label="检验项类型" width="120" show-overflow-tooltip></el-table-column> -->
          <el-table-column prop="inspectionItemSubclass" label="检验项子项" min-width="140"
            show-overflow-tooltip></el-table-column>
          <el-table-column prop="sonLaboratory" label="子实验室" width="130" show-overflow-tooltip></el-table-column>
          <el-table-column
            prop="inspectionItemSubclass"
            label="检验项子项"
            min-width="140"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column
            prop="sonLaboratory"
            label="子实验室"
            width="130"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column prop="ask" label="要求值" min-width="200px">
            <template slot-scope="scope">
              <el-input size="small" placeholder="要求值" v-model="scope.row.ask" clearable
                @change="(value) => upStandardProductList(value, scope.row.id)" v-if="upStandardProduct" type="textarea"
                :autosize="{ minRows: 1, maxRows: 3 }"></el-input>
              <el-input
                size="small"
                placeholder="要求值"
                v-model="scope.row.ask"
                clearable
                @change="(value) => upStandardProductList(value, scope.row.id)"
                v-if="upStandardProduct"
                type="textarea"
                :autosize="{ minRows: 1, maxRows: 3 }"
              ></el-input>
              <span v-else>{{ scope.row.ask }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="tell" label="要求描述" min-width="220px">
            <template slot-scope="scope">
              <el-input size="small" placeholder="要求描述" v-model="scope.row.tell" clearable @change="(value) => upStandardProductListOfTell(value, scope.row.id)
                " v-if="upStandardProduct" type="textarea" :autosize="{ minRows: 1, maxRows: 3 }"></el-input>
              <el-input
                size="small"
                placeholder="要求描述"
                v-model="scope.row.tell"
                clearable
                @change="
                  (value) => upStandardProductListOfTell(value, scope.row.id)
                "
                v-if="upStandardProduct"
                type="textarea"
                :autosize="{ minRows: 1, maxRows: 3 }"
              ></el-input>
              <span v-else>{{ scope.row.ask }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="method" label="试验方法" width="200">
            <template slot-scope="scope">
              <el-select v-model="scope.row.methodS" size="small" placeholder="试验方法" @change="(value) => upStandardProductListOfMethodS(value, scope.row.id)
                " v-if="upStandardProduct">
                <el-option v-for="(a, i) in JSON.parse(scope.row.method)" :key="i" :label="a" :value="a"></el-option>
              <el-select
                v-model="scope.row.methodS"
                size="small"
                placeholder="试验方法"
                @change="
                  (value) => upStandardProductListOfMethodS(value, scope.row.id)
                "
                v-if="upStandardProduct"
              >
                <el-option
                  v-for="(a, i) in JSON.parse(scope.row.method)"
                  :key="i"
                  :label="a"
                  :value="a"
                ></el-option>
              </el-select>
              <span v-else>{{ scope.row.methodS }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="unit" label="计量单位" width="100" show-overflow-tooltip></el-table-column>
          <el-table-column
            prop="unit"
            label="计量单位"
            width="100"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column prop="price" label="单价(元)" width="120">
            <template slot-scope="scope">
              <el-input v-model="scope.row.price" size="small" placeholder="单价(元)" @change="(value) => upStandardProductListOfPrice(value, scope.row.id)
                " v-if="upStandardProduct">
              <el-input
                v-model="scope.row.price"
                size="small"
                placeholder="单价(元)"
                @change="
                  (value) => upStandardProductListOfPrice(value, scope.row.id)
                "
                v-if="upStandardProduct"
              >
              </el-input>
              <span v-else>{{ scope.row.price }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="manHour" label="工时系数" width="120">
            <template slot-scope="scope">
              <el-input v-model="scope.row.manHour" size="small" placeholder="工时系数" @change="(value) => upStandardProductListOfManHour(value, scope.row.id)
                " v-if="upStandardProduct">
              <el-input
                v-model="scope.row.manHour"
                size="small"
                placeholder="工时系数"
                @change="
                  (value) => upStandardProductListOfManHour(value, scope.row.id)
                "
                v-if="upStandardProduct"
              >
              </el-input>
              <span v-else>{{ scope.row.manHour }}</span>
            </template>
          </el-table-column>
          <el-table-column prop="manHourGroup" label="工时分组" width="100" show-overflow-tooltip></el-table-column>
          <el-table-column
            prop="manHourGroup"
            label="工时分组"
            width="100"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column prop="templateId" label="模板" width="200">
            <template slot-scope="scope">
              <el-select v-model="scope.row.templateId" size="small" filterable :disabled="!upStandardProduct" @change="(value) =>
              <el-select
                v-model="scope.row.templateId"
                size="small"
                filterable
                :disabled="!upStandardProduct"
                @change="
                  (value) =>
                upStandardProductListOfTemplate(value, scope.row.id)
                ">
                <el-option v-for="(a, ai) in templateList" :key="ai" :label="a.name" :value="a.id"></el-option>
                "
              >
                <el-option
                  v-for="(a, ai) in templateList"
                  :key="ai"
                  :label="a.name"
                  :value="a.id"
                ></el-option>
              </el-select>
            </template>
          </el-table-column>
          <el-table-column prop="section" label="区间" width="120" show-overflow-tooltip></el-table-column>
          <el-table-column
            prop="section"
            label="区间"
            width="120"
            show-overflow-tooltip
          ></el-table-column>
          <el-table-column prop="section" label="操作" width="120">
            <template slot-scope="scope">
              <el-button type="text" @click="sectionUp(scope.row)">区间设置</el-button>
              <el-button type="text" @click="sectionUp(scope.row)"
                >区间设置</el-button
              >
            </template>
          </el-table-column>
        </el-table>
        <el-pagination style="position: absolute; right: 16px; bottom: 1px" @current-change="handleCurrentChange"
          :current-page="currentPage" layout="total, prev, pager, next, jumper" :page-size="50" :total="total">
        <el-pagination
          style="position: absolute; right: 16px; bottom: 1px"
          @current-change="handleCurrentChange"
          :current-page="currentPage"
          layout="total, prev, pager, next, jumper"
          :page-size="50"
          :total="total"
        >
        </el-pagination>
      </el-row>
    </div>
@@ -356,121 +550,292 @@
            <span class="required-span">* </span>型号:
          </el-col>
          <el-col :span="16" :offset="1">
            <el-input v-model="addOb.model" placeholder="请输入型号" clearable size="small"
              @keyup.enter.native="addStandardTree"></el-input>
            <el-input
              v-model="addOb.model"
              placeholder="请输入型号"
              clearable
              size="small"
              @keyup.enter.native="addStandardTree"
            ></el-input>
          </el-col>
        </el-row>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="addDia = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="addStandardTree" :loading="addLoad">ç¡® å®š</el-button>
        <el-button type="primary" @click="addStandardTree" :loading="addLoad"
          >ç¡® å®š</el-button
        >
      </span>
    </el-dialog>
    <el-dialog title="批量编辑" top="5vh" :visible.sync="moreEdit" width="90%" class="more-edit">
      <div class="body" style="display: flex; flex-direction: column; height: 85vh">
    <el-dialog
      title="批量编辑"
      top="5vh"
      :visible.sync="moreEdit"
      width="90%"
      class="more-edit"
    >
      <div
        class="body"
        style="display: flex; flex-direction: column; height: 85vh"
      >
        <div class="search">
          <div class="search-item">
            <el-row style="width: 25%; margin-bottom: 16px">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                è¦æ±‚值:</el-col>
                è¦æ±‚值:</el-col
              >
              <el-col :span="16">
                <el-input size="small" v-model="moreInfo.ask" clearable :disabled="moreSelects.length == 0"></el-input>
                <el-input
                  size="small"
                  v-model="moreInfo.ask"
                  clearable
                  :disabled="moreSelects.length == 0"
                ></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%; margin-bottom: 16px">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                è¦æ±‚描述:</el-col>
              <el-col :span="16" style="display: flex; align-items: flex-start; height: 100%">
                <el-input size="small" clearable type="textarea" :autosize="{ minRows: 1, maxRows: 3 }"
                  v-model="moreInfo.tell" :disabled="moreSelects.length == 0"></el-input>
                è¦æ±‚描述:</el-col
              >
              <el-col
                :span="16"
                style="display: flex; align-items: flex-start; height: 100%"
              >
                <el-input
                  size="small"
                  clearable
                  type="textarea"
                  :autosize="{ minRows: 1, maxRows: 3 }"
                  v-model="moreInfo.tell"
                  :disabled="moreSelects.length == 0"
                ></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%; margin-bottom: 16px">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                è¯•验方法:</el-col>
                è¯•验方法:</el-col
              >
              <el-col :span="16">
                <el-select v-model="moreInfo.methodS" size="small" filterable style="width: 100%"
                  :disabled="moreSelects.length == 0" clearable>
                  <el-option v-for="(a, ai) in methodList" :key="ai" :label="a.label" :value="a.value"></el-option>
                <el-select
                  v-model="moreInfo.methodS"
                  size="small"
                  filterable
                  style="width: 100%"
                  :disabled="moreSelects.length == 0"
                  clearable
                >
                  <el-option
                    v-for="(a, ai) in methodList"
                    :key="ai"
                    :label="a.label"
                    :value="a.value"
                  ></el-option>
                </el-select>
              </el-col>
            </el-row>
            <el-row style="width: 25%; margin-bottom: 16px">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                å•ä»·(元):</el-col>
                å•ä»·(元):</el-col
              >
              <el-col :span="16">
                <el-input size="small" v-model="moreInfo.price" clearable
                  :disabled="moreSelects.length == 0"></el-input>
                <el-input
                  size="small"
                  v-model="moreInfo.price"
                  clearable
                  :disabled="moreSelects.length == 0"
                ></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                å·¥æ—¶ç³»æ•°ï¼š</el-col>
                å·¥æ—¶ç³»æ•°ï¼š</el-col
              >
              <el-col :span="16">
                <el-input size="small" v-model="moreInfo.manHour" clearable
                  :disabled="moreSelects.length == 0"></el-input>
                <el-input
                  size="small"
                  v-model="moreInfo.manHour"
                  clearable
                  :disabled="moreSelects.length == 0"
                ></el-input>
              </el-col>
            </el-row>
            <el-row style="width: 25%">
              <el-col :span="6" style="text-align: right">
                <!-- <span class="required-span">* </span> -->
                æ¨¡æ¿ï¼š</el-col>
                æ¨¡æ¿ï¼š</el-col
              >
              <el-col :span="16">
                <el-select v-model="moreInfo.templateId" size="small" filterable placeholder="模板" style="width: 100%"
                  :disabled="moreSelects.length == 0">
                  <el-option v-for="(a, ai) in templateList" :key="ai" :label="a.name" :value="a.id"></el-option>
                <el-select
                  v-model="moreInfo.templateId"
                  size="small"
                  filterable
                  placeholder="模板"
                  style="width: 100%"
                  :disabled="moreSelects.length == 0"
                >
                  <el-option
                    v-for="(a, ai) in templateList"
                    :key="ai"
                    :label="a.name"
                    :value="a.id"
                  ></el-option>
                </el-select>
              </el-col>
            </el-row>
            <el-row style="width: 25%">
              <el-col :span="6" style="text-align: right"> æ˜¯å¦å¯ç”¨ï¼š</el-col>
              <el-col :span="16">
                <el-select v-model="moreInfo.state" size="small" filterable placeholder="是否启用" style="width: 100%"
                  :disabled="moreSelects.length == 0" clearable>
                <el-select
                  v-model="moreInfo.state"
                  size="small"
                  filterable
                  placeholder="是否启用"
                  style="width: 100%"
                  :disabled="moreSelects.length == 0"
                  clearable
                >
                  <el-option label="启用" :value="1"></el-option>
                  <el-option label="不启用" :value="0"></el-option>
                </el-select>
              </el-col>
            </el-row>
            <el-row style="width: 100%; margin-top: 8px">
              <el-col :span="24" style="display: flex; align-items: center; justify-content: flex-end">
                <el-button @click="clearProduct(1)" size="small" type="danger">重置单价</el-button>
                <el-button @click="clearProduct(2)" size="small" type="danger">重置工时系数</el-button>
                <el-button type="primary" size="small" @click="sectionUp(moreSelects)">设置区间</el-button>
                <el-button @click="moreEdit = false" size="small">取 æ¶ˆ</el-button>
                <el-button type="primary" @click="subMoreEdit" :loading="moreEditLoad" size="small">保 å­˜</el-button>
              <el-col
                :span="24"
                style="
                  display: flex;
                  align-items: center;
                  justify-content: flex-end;
                "
              >
                <el-button @click="clearProduct(1)" size="small" type="danger"
                  >重置单价</el-button
                >
                <el-button @click="clearProduct(2)" size="small" type="danger"
                  >重置工时系数</el-button
                >
                <el-button
                  type="primary"
                  size="small"
                  @click="sectionUp(moreSelects)"
                  >设置区间</el-button
                >
                <el-button @click="moreEdit = false" size="small"
                  >取 æ¶ˆ</el-button
                >
                <el-button
                  type="primary"
                  @click="subMoreEdit"
                  :loading="moreEditLoad"
                  size="small"
                  >保 å­˜</el-button
                >
              </el-col>
            </el-row>
          </div>
        </div>
        <div style="flex: 1; overflow-y: auto" v-loading="productTableLoading0">
          <el-table :data="productList0" ref="productTable0" style="width: 100%" height="96%" tooltip-effect="dark"
            stripe :fit="true" border @select-all="handleSelectAll0" @select="handleSelectionChange0"
            header-row-class-name="header-class" :row-key="(row) => row.id" @filter-change="filterHandler"
            highlight-current-row>
          <el-table
            :data="productList0"
            ref="productTable0"
            style="width: 100%"
            height="96%"
            tooltip-effect="dark"
            stripe
            :fit="true"
            border
            @select-all="handleSelectAll0"
            @select="handleSelectionChange0"
            header-row-class-name="header-class"
            :row-key="(row) => row.id"
            @filter-change="filterHandler"
            highlight-current-row
          >
            <el-table-column type="selection" width="50"> </el-table-column>
            <el-table-column prop="sample" label="产品" min-width="100" show-overflow-tooltip></el-table-column>
            <el-table-column prop="model" label="型号" min-width="100" show-overflow-tooltip></el-table-column>
            <el-table-column prop="inspectionItem" label="检验项" min-width="140" show-overflow-tooltip :filters="filters0"
              :filter-multiple="false" column-key="inspectionItem" filter-placement="bottom-start"></el-table-column>
            <el-table-column prop="inspectionItemSubclass" label="检验项子项" min-width="140" show-overflow-tooltip
              :filters="filters1" :filter-multiple="false" column-key="inspectionItemSubclass"
              filter-placement="bottom-start"></el-table-column>
            <el-table-column prop="sonLaboratory" label="子实验室" width="130" show-overflow-tooltip
              :filters="dict.type.sys_sub_lab" :filter-multiple="false" column-key="sonLaboratory"
              filter-placement="bottom-start"></el-table-column>
            <el-table-column prop="ask" label="要求值" min-width="200px"></el-table-column>
            <el-table-column prop="tell" label="要求描述" min-width="220px"></el-table-column>
            <el-table-column prop="methodS" label="试验方法" width="200"></el-table-column>
            <el-table-column prop="unit" label="计量单位" width="100" show-overflow-tooltip></el-table-column>
            <el-table-column prop="price" label="单价(元)" width="120"></el-table-column>
            <el-table-column prop="manHour" label="工时系数" width="120"></el-table-column>
            <el-table-column prop="manHourGroup" label="工时分组" width="100" show-overflow-tooltip></el-table-column>
            <el-table-column
              prop="sample"
              label="产品"
              min-width="100"
              show-overflow-tooltip
            ></el-table-column>
            <el-table-column
              prop="model"
              label="型号"
              min-width="100"
              show-overflow-tooltip
            ></el-table-column>
            <el-table-column
              prop="inspectionItem"
              label="检验项"
              min-width="140"
              show-overflow-tooltip
              :filters="filters0"
              :filter-multiple="false"
              column-key="inspectionItem"
              filter-placement="bottom-start"
            ></el-table-column>
            <el-table-column
              prop="inspectionItemSubclass"
              label="检验项子项"
              min-width="140"
              show-overflow-tooltip
              :filters="filters1"
              :filter-multiple="false"
              column-key="inspectionItemSubclass"
              filter-placement="bottom-start"
            ></el-table-column>
            <el-table-column
              prop="sonLaboratory"
              label="子实验室"
              width="130"
              show-overflow-tooltip
              :filters="dict.type.sys_sub_lab"
              :filter-multiple="false"
              column-key="sonLaboratory"
              filter-placement="bottom-start"
            ></el-table-column>
            <el-table-column
              prop="ask"
              label="要求值"
              min-width="200px"
            ></el-table-column>
            <el-table-column
              prop="tell"
              label="要求描述"
              min-width="220px"
            ></el-table-column>
            <el-table-column
              prop="methodS"
              label="试验方法"
              width="200"
            ></el-table-column>
            <el-table-column
              prop="unit"
              label="计量单位"
              width="100"
              show-overflow-tooltip
            ></el-table-column>
            <el-table-column
              prop="price"
              label="单价(元)"
              width="120"
            ></el-table-column>
            <el-table-column
              prop="manHour"
              label="工时系数"
              width="120"
            ></el-table-column>
            <el-table-column
              prop="manHourGroup"
              label="工时分组"
              width="100"
              show-overflow-tooltip
            ></el-table-column>
            <el-table-column prop="templateId" label="模板" width="200">
              <template slot-scope="scope">
                {{
@@ -482,24 +847,61 @@
                }}
              </template>
            </el-table-column>
            <el-table-column prop="section" label="区间" width="120" show-overflow-tooltip></el-table-column>
            <el-table-column
              prop="section"
              label="区间"
              width="120"
              show-overflow-tooltip
            ></el-table-column>
          </el-table>
          <el-pagination style="position: absolute; right: 16px; bottom: 4px" @current-change="handleCurrentChange0"
            :current-page="currentPage0" layout="total, prev, pager, next, jumper" :page-size="100" :total="total0">
          <el-pagination
            style="position: absolute; right: 16px; bottom: 4px"
            @current-change="handleCurrentChange0"
            :current-page="currentPage0"
            layout="total, prev, pager, next, jumper"
            :page-size="100"
            :total="total0"
          >
          </el-pagination>
        </div>
      </div>
    </el-dialog>
    <el-dialog title="区间设置" :visible.sync="sectionUpDia" width="70%" :close-on-click-modal="false">
    <el-dialog
      title="区间设置"
      :visible.sync="sectionUpDia"
      width="70%"
      :close-on-click-modal="false"
    >
      <div style="width: 100%; text-align: left">
        <el-button id="copyBtn" v-if="sectionList.length > 0" :data-clipboard-text="JSON.stringify(sectionList)"
          type="primary" size="mini" @click="copySectionConfig">复制区间设置</el-button>
        <el-button type="primary" size="mini" @click="openImportSectionsConfig">导入区间设置</el-button>
        <el-dialog :visible.sync="importSectionsConfigDia" width="30%" title="导入区间配置">
          <el-input type="textarea" :rows="3" v-model="sectionsConfigText"></el-input>
        <el-button
          id="copyBtn"
          v-if="sectionList.length > 0"
          :data-clipboard-text="JSON.stringify(sectionList)"
          type="primary"
          size="mini"
          @click="copySectionConfig"
          >复制区间设置</el-button
        >
        <el-button type="primary" size="mini" @click="openImportSectionsConfig"
          >导入区间设置</el-button
        >
        <el-dialog
          :visible.sync="importSectionsConfigDia"
          width="30%"
          title="导入区间配置"
        >
          <el-input
            type="textarea"
            :rows="3"
            v-model="sectionsConfigText"
          ></el-input>
          <span slot="footer" class="dialog-footer">
            <el-button @click="importSectionsConfigDia = false">取 æ¶ˆ</el-button>
            <el-button type="primary" @click="confirmImportConfig">确认</el-button>
            <el-button @click="importSectionsConfigDia = false"
              >取 æ¶ˆ</el-button
            >
            <el-button type="primary" @click="confirmImportConfig"
              >确认</el-button
            >
          </span>
        </el-dialog>
      </div>
@@ -509,62 +911,112 @@
          </el-table-column>
          <el-table-column label="区间" align="center">
            <template slot-scope="scope">
              <el-input size="small" v-model="scope.row.thing" clearable placeholder="区间"></el-input>
              <el-input
                size="small"
                v-model="scope.row.thing"
                clearable
                placeholder="区间"
              ></el-input>
            </template>
          </el-table-column>
          <el-table-column label="要求值" align="center">
            <template slot-scope="scope">
              <el-input size="small" v-model="scope.row.ask" clearable placeholder="要求值"></el-input>
              <el-input
                size="small"
                v-model="scope.row.ask"
                clearable
                placeholder="要求值"
              ></el-input>
            </template>
          </el-table-column>
          <el-table-column label="要求描述" align="center">
            <template slot-scope="scope">
              <el-input size="small" placeholder="要求描述" v-model="scope.row.tell" clearable type="textarea"
                :autosize="{ minRows: 1, maxRows: 2 }"></el-input>
              <el-input
                size="small"
                placeholder="要求描述"
                v-model="scope.row.tell"
                clearable
                type="textarea"
                :autosize="{ minRows: 1, maxRows: 2 }"
              ></el-input>
            </template>
          </el-table-column>
          <el-table-column label="单价" align="center" width="120">
            <template slot-scope="scope">
              <el-input size="small" v-model="scope.row.price" clearable placeholder="单价"></el-input>
              <el-input
                size="small"
                v-model="scope.row.price"
                clearable
                placeholder="单价"
              ></el-input>
            </template>
          </el-table-column>
          <el-table-column label="工时系数" align="center" width="120">
            <template slot-scope="scope">
              <el-input size="small" v-model="scope.row.manHour" clearable placeholder="工时系数"></el-input>
              <el-input
                size="small"
                v-model="scope.row.manHour"
                clearable
                placeholder="工时系数"
              ></el-input>
            </template>
          </el-table-column>
          <el-table-column label="操作" width="70" align="center">
            <template slot-scope="scope">
              <el-button size="mini" type="danger" icon="el-icon-minus" circle
                @click="sectionList.splice(scope.$index, 1)"></el-button>
              <el-button
                size="mini"
                type="danger"
                icon="el-icon-minus"
                circle
                @click="sectionList.splice(scope.$index, 1)"
              ></el-button>
            </template>
          </el-table-column>
        </el-table>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="sectionUpDia = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="sectionLoadAdd" :loading="sectionLoad">保 å­˜</el-button>
        <el-button type="primary" @click="
        <el-button type="primary" @click="sectionLoadAdd" :loading="sectionLoad"
          >保 å­˜</el-button
        >
        <el-button
          type="primary"
          @click="
          sectionList.push({
            thing: '',
            price: sectionRow.price,
            manHour: sectionRow.manHour,
          })
          " icon="el-icon-plus"></el-button>
          "
          icon="el-icon-plus"
        ></el-button>
      </span>
    </el-dialog>
    <el-dialog title="数据导入" :visible.sync="uploadDia" width="500px">
      <div style="margin: 0 auto">
        <el-upload ref="upload" drag :action="javaApi + '/standardTree/inExcelOfTree' + '/' + 'false'
          " :headers="uploadHeader" :file-list="fileList" name="file" :auto-upload="false" accept=".xlsx" :limit="1"
          :on-change="beforeUpload" :on-success="onSuccess" :on-error="onError">
        <el-upload
          ref="upload"
          drag
          :action="javaApi + '/standardTree/inExcelOfTree' + '/' + 'false'"
          :headers="uploadHeader"
          :file-list="fileList"
          name="file"
          :auto-upload="false"
          accept=".xlsx"
          :limit="1"
          :on-change="beforeUpload"
          :on-success="onSuccess"
          :on-error="onError"
        >
          <i class="el-icon-upload"></i>
          <div class="el-upload__text">将文件拖到此处,或<em>点击上传</em></div>
        </el-upload>
      </div>
      <span slot="footer" class="dialog-footer">
        <el-button @click="uploadDia = false">取 æ¶ˆ</el-button>
        <el-button type="primary" @click="submitUpload()" :loading="uploading">上 ä¼ </el-button>
        <el-button type="primary" @click="submitUpload()" :loading="uploading"
          >上 ä¼ </el-button
        >
      </span>
    </el-dialog>
  </div>
@@ -588,10 +1040,10 @@
  resetTreeOfPrice,
  resetTreeOfHour,
  selectsStandardMethodByFLSSM,
} from '@/api/standard/standardLibrary.js'
} from "@/api/standard/standardLibrary.js";
export default {
  dicts: ['sys_sub_lab'],
  dicts: ["sys_sub_lab"],
  data() {
    return {
      importSectionsConfigDia: false,
@@ -987,7 +1439,8 @@
        return;
      }
      this.addLoad = true;
      addStandardTree(this.addOb).then((res) => {
      addStandardTree(this.addOb)
        .then((res) => {
        if (res.code === 201) {
          this.addLoad = false;
          return;
@@ -1006,7 +1459,6 @@
          });
        this.addLoad = false;
        this.$tab.refreshPage();
      })
        .catch((e) => {
          this.addDia = false;
@@ -1017,8 +1469,7 @@
      this.tableLoad = true;
      selectsStandardMethodByFLSSM({
        tree: this.selectTree,
      })
        .then((res) => {
      }).then((res) => {
          this.tableLoad = false;
          this.standardList = res.data.standardMethodList;
          if (this.standardList && this.standardList.length > 0) {
@@ -1094,8 +1545,7 @@
          id: index,
          tell: value,
        }),
      })
        .then((res) => {
      }).then((res) => {
          if (res.code == 201) {
            this.$message.error("未保存");
            return;
@@ -1109,8 +1559,7 @@
          id: index,
          methodS: value,
        }),
      })
        .then((res) => {
      }).then((res) => {
          if (res.code == 201) {
            this.$message.error("未保存");
            return;
@@ -1124,8 +1573,7 @@
          id: index,
          price: value,
        }),
      })
        .then((res) => {
      }).then((res) => {
          if (res.code == 201) {
            this.$message.error("未保存");
            return;
@@ -1139,8 +1587,7 @@
          id: index,
          manHour: value,
        }),
      })
        .then((res) => {
      }).then((res) => {
          if (res.code == 201) {
            this.$message.error("未保存");
            return;
@@ -1154,8 +1601,7 @@
          id: index,
          templateId: value,
        }),
      })
        .then((res) => {
      }).then((res) => {
          if (res.code == 201) {
            this.$message.error("未保存");
            return;
@@ -1171,7 +1617,7 @@
      })
        .then(() => {
          this.tableLoad = true;
          delStandardMethodByFLSSM({ id: id, }).then((res) => {
          delStandardMethodByFLSSM({ id: id }).then((res) => {
            if (res.code == 201) {
              return;
            }
@@ -1386,8 +1832,7 @@
            price: this.sectionRow.price,
            manHour: this.sectionRow.manHour,
          }),
        })
          .then((res) => {
        }).then((res) => {
            this.sectionLoad = false;
            if (res.code == 201) {
              this.$message.error("未保存");
@@ -1479,7 +1924,7 @@
      upStandardProducts({
        ids: JSON.stringify(this.moreSelects.map((a) => a.id)),
        standardProductList: this.moreInfo,
      },).then((res) => {
      }).then((res) => {
        this.moreEditLoad = false;
        if (res.code == 201) {
          this.$message.error("未保存");
@@ -1531,8 +1976,7 @@
        laboratory: this.sonLaboratory,
        items: this.inspectionItemSubclass,
        item: this.inspectionItem,
      })
        .then((res) => {
      }).then((res) => {
          this.productList0 = res.data.records;
          this.total0 = res.data.total;
          this.productTableLoading0 = false;
@@ -1558,8 +2002,7 @@
        id: this.standardId,
        tree: this.selectTree,
        item: this.inspectionItem,
      })
        .then((res) => {
      }).then((res) => {
          this.filters0 = [];
          this.filters1 = [];
          res.data.item.forEach((a) => {
@@ -1640,8 +2083,7 @@
            resetTreeOfHour({
              tree: this.selectTree,
              standardId: this.standardId,
            })
              .then((res) => {
            }).then((res) => {
                if (res.code == 201) {
                  return;
                }