瀏覽代碼

性能验证实验参数配置差异化

cfort 1 年之前
父節點
當前提交
0bb0a1c569
共有 2 個文件被更改,包括 293 次插入34 次删除
  1. 124 29
      src/views/business/performance/config.vue
  2. 169 5
      src/views/business/performance/constants/index.js

+ 124 - 29
src/views/business/performance/config.vue

@@ -129,7 +129,7 @@
                         </template>
                         </template>
                         <el-row :gutter="20" class="form-row">
                         <el-row :gutter="20" class="form-row">
                             <el-col :span="8">
                             <el-col :span="8">
-                                <el-form-item label="方法名称" :prop="`methods[${mIndex}].methodName`" :show-message="false">
+                                <el-form-item label="方法名称" :prop="`methods[${mIndex}].methodName`" required :show-message="false">
                                     <el-input
                                     <el-input
                                         v-model="method.methodName"
                                         v-model="method.methodName"
                                         type="text"
                                         type="text"
@@ -141,7 +141,7 @@
                                 </el-form-item>
                                 </el-form-item>
                             </el-col>
                             </el-col>
                             <el-col :span="8">
                             <el-col :span="8">
-                                <el-form-item label="方法类型" :prop="`methods[${mIndex}].methodType`" :show-message="false">
+                                <el-form-item label="方法类型" :prop="`methods[${mIndex}].methodType`" required :show-message="false">
                                     <el-select
                                     <el-select
                                         v-model="method.methodType"
                                         v-model="method.methodType"
                                         :disabled="readonly && method.isBasic === 'Y'"
                                         :disabled="readonly && method.isBasic === 'Y'"
@@ -157,7 +157,7 @@
                                 </el-form-item>
                                 </el-form-item>
                             </el-col>
                             </el-col>
                             <el-col :span="8">
                             <el-col :span="8">
-                                <el-form-item label="方法KEY" :prop="`methods[${mIndex}].methodKey`" :show-message="false">
+                                <el-form-item label="方法KEY" :prop="`methods[${mIndex}].methodKey`" required :show-message="false">
                                     <el-select
                                     <el-select
                                         v-model="method.methodKey"
                                         v-model="method.methodKey"
                                         :disabled="readonly && method.isBasic === 'Y'"
                                         :disabled="readonly && method.isBasic === 'Y'"
@@ -274,25 +274,95 @@
                                         align="center"
                                         align="center"
                                     >
                                     >
                                         <template slot-scope="scope">
                                         <template slot-scope="scope">
-                                            <el-switch
-                                                v-if="item.type === 'switch'"
-                                                v-model="scope.row[item.key]"
-                                                :disabled="readonly && method.isBasic === 'Y'"
-                                            />
-                                            <el-input-number
-                                                v-else-if="item.type === 'number'"
-                                                v-model="scope.row[item.key]"
-                                                type="number"
-                                                :disabled="readonly && method.isBasic === 'Y'"
-                                                :min="item.min"
-                                                :max="item.max"
-                                                :precision="item.precision"
-                                            />
-                                            <el-input
-                                                v-else
-                                                v-model="scope.row[item.key]"
-                                                :disabled="readonly && method.isBasic === 'Y'"
-                                            />
+                                            <template v-if="item.key === 'default' && scope.row.key">
+                                                <!-- 对 default 列进行特殊处理 -->
+                                                <el-input-number
+                                                    v-if="paramListMap[scope.row.key].type === 'number'"
+                                                    v-model="scope.row[item.key]"
+                                                    type="number"
+                                                    :disabled="readonly && method.isBasic === 'Y'"
+                                                    :min="paramListMap[scope.row.key].min"
+                                                    :max="paramListMap[scope.row.key].max"
+                                                    :precision="paramListMap[scope.row.key].precision"
+                                                />
+                                                <el-select
+                                                    v-else-if="paramListMap[scope.row.key].type === 'select'"
+                                                    v-model="scope.row[item.key]"
+                                                    :disabled="readonly && method.isBasic === 'Y'"
+                                                    placeholder="请选择"
+                                                    filterable
+                                                >
+                                                    <el-option
+                                                        v-for="(f, index) in paramListMap[scope.row.key].fieldOption.selectOptions"
+                                                        :key="index"
+                                                        :label="f.label"
+                                                        :value="f.value"
+                                                    />
+                                                </el-select>
+                                                <el-switch
+                                                    v-else-if="paramListMap[scope.row.key].type === 'switch'"
+                                                    v-model="scope.row[item.key]"
+                                                    :disabled="readonly && method.isBasic === 'Y'"
+                                                    :active-text="paramListMap[scope.row.key].fieldOption.activeText"
+                                                    :inactive-text="paramListMap[scope.row.key].fieldOption.inactiveText"
+                                                    :active-value="paramListMap[scope.row.key].fieldOption.activeValue"
+                                                    :inactive-value="paramListMap[scope.row.key].fieldOption.inactiveValue"
+                                                />
+                                                <el-input
+                                                    v-else
+                                                    v-model="scope.row[item.key]"
+                                                    :disabled="readonly && method.isBasic === 'Y'"
+                                                />
+                                            </template>
+                                            <template v-else-if="['min', 'max', 'precision'].includes(item.key) && scope.row.key">
+                                                <el-input-number
+                                                    v-if="paramListMap[scope.row.key].type === 'number'"
+                                                    v-model="scope.row[item.key]"
+                                                    type="number"
+                                                    :disabled="readonly && method.isBasic === 'Y'"
+                                                    :min="paramListMap[scope.row.key].min"
+                                                    :max="paramListMap[scope.row.key].max"
+                                                    :precision="paramListMap[scope.row.key].precision"
+                                                />
+                                                <div v-else>/</div>
+                                            </template>
+                                            <template v-else>
+                                                <el-switch
+                                                    v-if="item.type === 'switch'"
+                                                    v-model="scope.row[item.key]"
+                                                    :disabled="readonly && method.isBasic === 'Y'"
+                                                />
+                                                <el-input-number
+                                                    v-else-if="item.type === 'number'"
+                                                    v-model="scope.row[item.key]"
+                                                    type="number"
+                                                    :disabled="readonly && method.isBasic === 'Y'"
+                                                    :min="item.min"
+                                                    :max="item.max"
+                                                    :precision="item.precision"
+                                                />
+                                                <el-select
+                                                    v-else-if="item.type === 'select'"
+                                                    v-model="scope.row[item.key]"
+                                                    :disabled="readonly && method.isBasic === 'Y'"
+                                                    placeholder="请选择"
+                                                    filterable
+                                                    @change="handleFieldChange(mIndex, scope, item.key, 'params')"
+                                                >
+                                                    <el-option
+                                                        v-for="(f, index) in item.options"
+                                                        :key="index"
+                                                        :label="f.key"
+                                                        :value="f.key"
+                                                        :disabled="method.params.map(i => i.key).includes(f.key)"
+                                                    />
+                                                </el-select>
+                                                <el-input
+                                                    v-else
+                                                    v-model="scope.row[item.key]"
+                                                    :disabled="readonly && method.isBasic === 'Y'"
+                                                />
+                                            </template>
                                         </template>
                                         </template>
                                     </el-table-column>
                                     </el-table-column>
                                     <el-table-column v-if="!readonly" fixed="right" label="操作" width="50" header-align="center" align="center">
                                     <el-table-column v-if="!readonly" fixed="right" label="操作" width="50" header-align="center" align="center">
@@ -336,7 +406,6 @@
                                         :label="item.label"
                                         :label="item.label"
                                         :width="item.width"
                                         :width="item.width"
                                         :min-width="item.minWidth"
                                         :min-width="item.minWidth"
-                                        :style="item.visible === false ? 'display: none;' : ''"
                                         header-align="center"
                                         header-align="center"
                                         align="center"
                                         align="center"
                                     >
                                     >
@@ -353,7 +422,7 @@
                                                 placeholder="请选择"
                                                 placeholder="请选择"
                                                 allow-create
                                                 allow-create
                                                 filterable
                                                 filterable
-                                                @change="handleFormulaChange(mIndex, scope, item.key, 'formulas', ['key', 'value'])"
+                                                @change="handleFieldChange(mIndex, scope, item.key, 'formulas')"
                                             >
                                             >
                                                 <el-option
                                                 <el-option
                                                     v-for="(f, index) in item.options"
                                                     v-for="(f, index) in item.options"
@@ -417,7 +486,6 @@
                                         :label="item.label"
                                         :label="item.label"
                                         :width="item.width"
                                         :width="item.width"
                                         :min-width="item.minWidth"
                                         :min-width="item.minWidth"
-                                        :style="item.visible === false ? 'display: none;' : ''"
                                         header-align="center"
                                         header-align="center"
                                         align="center"
                                         align="center"
                                     >
                                     >
@@ -546,6 +614,14 @@ export default {
             }
             }
         }
         }
     },
     },
+    computed: {
+        paramListMap () {
+            return this.paramList.reduce((acc, cur) => {
+                acc[cur.key] = cur
+                return acc
+            }, {})
+        }
+    },
     watch: {
     watch: {
         visible: {
         visible: {
             handler (val, oldVal) {
             handler (val, oldVal) {
@@ -664,7 +740,8 @@ export default {
                 }
                 }
                 const submitData = JSON.parse(JSON.stringify(this.formData))
                 const submitData = JSON.parse(JSON.stringify(this.formData))
                 submitData.methods.forEach(item => {
                 submitData.methods.forEach(item => {
-                    item.params = JSON.stringify(item.params)
+                    const temp = this.getNumberStep(item.params)
+                    item.params = JSON.stringify(temp)
                     item.formulas = JSON.stringify(item.formulas)
                     item.formulas = JSON.stringify(item.formulas)
                     item.chartOption = JSON.stringify(item.chartOption)
                     item.chartOption = JSON.stringify(item.chartOption)
                 })
                 })
@@ -701,9 +778,19 @@ export default {
         handleSelectionChange (v, data, type) {
         handleSelectionChange (v, data, type) {
             this.selectionIndex[type] = v.map(item => data.indexOf(item))
             this.selectionIndex[type] = v.map(item => data.indexOf(item))
         },
         },
-        handleFormulaChange (methodIndex, { $index, row }, key, type, args) {
-            const t = formulaList.find(i => i[key] === row[key])
-            args.forEach(i => {
+        handleFieldChange (methodIndex, { $index, row }, key, type) {
+            const args = {
+                params: ['label', 'default', 'max', 'min', 'precision', 'isVisible', 'isReadonly'],
+                formulas: ['key', 'value'],
+                chartOption: []
+            }
+            const dataset = {
+                params: this.paramList,
+                formulas: this.formulaList,
+                chartOption: this.chartList
+            }
+            const t = dataset[type].find(i => i[key] === row[key])
+            args[type].forEach(i => {
                 this.methodTabs[methodIndex][type][$index][i] = t ? t[i] : ''
                 this.methodTabs[methodIndex][type][$index][i] = t ? t[i] : ''
             })
             })
         },
         },
@@ -729,6 +816,14 @@ export default {
                 })
                 })
             }).catch(() => {})
             }).catch(() => {})
         },
         },
+        // 获取数值类型参数步长
+        getNumberStep (data) {
+            return data.map(item => {
+                if (item.type === 'number') {
+                    item.step = 10 ** -item.precision
+                }
+            })
+        },
         // 提交数据
         // 提交数据
         submitForm (data) {
         submitForm (data) {
             saveConfig(data).then(res => {
             saveConfig(data).then(res => {

+ 169 - 5
src/views/business/performance/constants/index.js

@@ -345,10 +345,176 @@ export const methodKeyOption = [
     }
     }
 ]
 ]
 
 
+export const basicParam = [
+    {
+        label: '浓度水平数',
+        key: 'specimensNum',
+        type: 'number',
+        min: 0,
+        precision: 0,
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '重复次数',
+        key: 'repeatNum',
+        type: 'number',
+        min: 0,
+        precision: 0,
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '实验天数',
+        key: 'days',
+        type: 'number',
+        min: 0,
+        precision: 0,
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '对数转换',
+        key: 'isConvert',
+        type: 'switch',
+        fieldOption: {
+            activeText: '是',
+            inactiveText: '否',
+            activeValue: true,
+            inactiveValue: false
+        },
+        default: false,
+        isVisible: false,
+        isReadonly: false
+    },
+    {
+        label: '浓度水平名',
+        key: 'specimensName',
+        type: 'string',
+        isVisible: true,
+        isReadonly: false
+    }
+]
+
+export const paramList = [
+    ...basicParam,
+    {
+        label: '方法数',
+        key: 'methodNum',
+        type: 'number',
+        default: 2,
+        min: 0,
+        precision: 0,
+        isVisible: false,
+        isReadonly: false
+    },
+    {
+        label: 'TEa数值',
+        key: 'tea',
+        type: 'number',
+        min: 0,
+        precision: 0,
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '性能标准',
+        key: 'standard',
+        type: 'select',
+        fieldOption: {
+            selectOptions: standardOption
+        },
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '批内CVs',
+        key: 'batchCVS',
+        type: 'select',
+        fieldOption: {
+            selectOptions: batchOption
+        },
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '批间CVs',
+        key: 'dailyCVS',
+        type: 'select',
+        fieldOption: {
+            selectOptions: batchOption
+        },
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '偏倚',
+        key: 'batchCVS',
+        type: 'select',
+        fieldOption: {
+            selectOptions: batchOption
+        },
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '假失控率',
+        key: 'rejectionRate',
+        type: 'select',
+        fieldOption: {
+            selectOptions: rateOption
+        },
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '靶值',
+        key: 'targetValue',
+        type: 'number',
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '厂商声明差值(偏倚)',
+        key: 'claimValue',
+        type: 'string',
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '不确定度',
+        key: 'claimValue',
+        type: 'string',
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '判断标准R2≥',
+        key: 'allowableR2',
+        type: 'number',
+        default: 0.995,
+        min: 0,
+        precision: 3,
+        isVisible: true,
+        isReadonly: false
+    },
+    {
+        label: '稀释回收率',
+        key: 'rangeValue',
+        type: 'number',
+        default: 0.1,
+        min: 0,
+        max: 1,
+        precision: 2,
+        isVisible: true,
+        isReadonly: false
+    }
+]
+
 export const paramColumn = [
 export const paramColumn = [
-    { label: '名称', key: 'label', width: '180px' },
-    { label: '编码', key: 'key', width: '150px' },
-    { label: '默认值', key: 'default', minWidth: '120px' },
+    { label: '参数', key: 'key', width: '180px', type: 'select', options: paramList },
+    { label: '名称', key: 'label', minWidth: '120px' },
+    { label: '默认值', key: 'default', width: '200px' },
     { label: '最小值', key: 'min', type: 'number', min: 0, precision: 0, width: '150px' },
     { label: '最小值', key: 'min', type: 'number', min: 0, precision: 0, width: '150px' },
     { label: '最大值', key: 'max', type: 'number', min: 0, precision: 0, width: '150px' },
     { label: '最大值', key: 'max', type: 'number', min: 0, precision: 0, width: '150px' },
     { label: '精度', key: 'precision', type: 'number', min: 0, max: 4, width: '120px' },
     { label: '精度', key: 'precision', type: 'number', min: 0, max: 4, width: '120px' },
@@ -356,8 +522,6 @@ export const paramColumn = [
     { label: '是否只读', key: 'isReadonly', type: 'switch', width: '100px' }
     { label: '是否只读', key: 'isReadonly', type: 'switch', width: '100px' }
 ]
 ]
 
 
-export const paramList = []
-
 export const formulaList = [
 export const formulaList = [
     {
     {
         label: '室内标准差',
         label: '室内标准差',