<!-- 第一套标准装置多功能校准源 -->
<!-- 第一种表格--增加行模式 -->
<!-- 数字多用表(手持)、数字多用表(台式)、多功能店里参数测量仪、钳形电流表、指针式万用表 使用 -->
<script lang="ts" setup name="TemplateDetailAddRowPattern">
import { ElMessage } from 'element-plus'
import type { ITemplateDetailAddRowPattern } from './first-interface'
import { useCheckList } from '@/commonMethods/useCheckList'
import { getDictByCode } from '@/api/system/dict'
import type { dictType } from '@/global'
import { calc } from '@/utils/useCalc'
import { mergeTableRow, useMergeTableRow } from '@/commonMethods/useMergeTableRow'
const props = defineProps({
pageType: {
type: String,
default: 'add',
},
itemCategoryName: String, // 设备检定项分类名称
list: {
type: Array as any,
},
})
const list = ref<ITemplateDetailAddRowPattern[]>([]) // 表格数据
const mergeTableList = ref<ITemplateDetailAddRowPattern[]>([]) // 合并的表格数据表格数据
const checkoutList = ref<ITemplateDetailAddRowPattern[]>([]) // 选中数据
const columns = ref([]) as any // 表头数据
const columns_digitalMultimeterHandheld = ref([ // 数字多用表(手持)
{ text: '参数', value: 'params', align: 'center', required: true, width: '120' },
{ text: '量', value: 'capacity', align: 'center', width: '120', required: true },
{ text: '单位', value: 'unit', align: 'center', width: '120', required: true },
{ text: '量程', value: 'rangeRange', align: 'center', required: true },
{ text: '标准值', value: 'standardValue', align: 'center', required: true },
{ text: '分辨力', value: 'resolution', align: 'center', required: true, width: '220', reg: (resolution: string | number) => { return Number(resolution) <= 1 } },
{ text: '最大允许误差', value: 'maximumError', align: 'center', required: true, width: '200' },
{ text: '误差参数a', value: 'errorParamA', align: 'center', required: true },
{ text: '误差参数b', value: 'errorParamB', align: 'center', required: true },
{ text: '频率', value: 'frequency', align: 'center' },
{ text: '频率单位', value: 'frequencyUnit', align: 'center', width: '120' },
])
const columns_digitalMultimeterTable = ref([ // 数字多用表(台式)
{ text: '参数', value: 'params', align: 'center', required: true, width: '120' },
{ text: '量', value: 'capacity', align: 'center', width: '120', required: true },
{ text: '单位', value: 'unit', align: 'center', width: '120', required: true },
{ text: '量程', value: 'rangeRange', align: 'center', required: true },
{ text: '标准值', value: 'standardValue', align: 'center', required: true },
{ text: '分辨力', value: 'resolution', align: 'center', required: true, width: '220', reg: (resolution: string | number) => { return Number(resolution) <= 1 } },
{ text: '最大允许误差', value: 'maximumError', align: 'center', required: true, width: '200' },
{ text: '误差参数a', value: 'errorParamA', align: 'center', required: true },
{ text: '误差参数b', value: 'errorParamB', align: 'center', required: true },
{ text: '两线/四线模式', value: 'lineMode', align: 'center', required: false, width: '120' },
{ text: '频率', value: 'frequency', align: 'center' },
{ text: '频率单位', value: 'frequencyUnit', align: 'center', width: '120' },
])
const columns_multifunctionalPowerParameterMeasuringInstrument = ref([ // 多功能电力参数测量仪
{ text: '参数', value: 'params', align: 'center', required: true, width: '120' },
{ text: '量', value: 'capacity', align: 'center', required: true, width: '120' },
{ text: '单位', value: 'unit', align: 'center', width: '120', required: true },
{ text: '标准值', value: 'standardValue', align: 'center', required: true },
{ text: '分辨力', value: 'resolution', align: 'center', required: true, width: '220', reg: (resolution: string | number) => { return Number(resolution) <= 1 } },
{ text: '最大允许误差', value: 'maximumError', align: 'center', required: true, width: '200' },
{ text: '误差参数a', value: 'errorParamA', align: 'center', required: true },
{ text: '误差参数b', value: 'errorParamB', align: 'center', required: true },
{ text: '频率', value: 'frequency', align: 'center' },
{ text: '频率单位', value: 'frequencyUnit', align: 'center', width: '120' },
{ text: '有效数字', value: 'effectiveNumber', align: 'center', width: '180' },
])
const columns_clampAmmeter = ref([ // 钳形电流表
{ text: '参数', value: 'params', align: 'center', required: true, width: '120' },
{ text: '量', value: 'capacity', align: 'center', width: '120', required: true },
{ text: '单位', value: 'unit', align: 'center', width: '120', required: true },
{ text: '量程', value: 'rangeRange', align: 'center', required: true },
{ text: '线圈放大', value: 'coilEnlarge', align: 'center', required: false, width: '120' },
{ text: '标准值', value: 'standardValue', align: 'center', required: true },
{ text: '分辨力', value: 'resolution', align: 'center', required: true, width: '220', reg: (resolution: string | number) => { return Number(resolution) <= 1 } },
{ text: '最大允许误差', value: 'maximumError', align: 'center', required: true, width: '200' },
{ text: '误差参数a', value: 'errorParamA', align: 'center', required: true },
{ text: '误差参数b', value: 'errorParamB', align: 'center', required: true },
{ text: '频率', value: 'frequency', align: 'center' },
{ text: '频率单位', value: 'frequencyUnit', align: 'center', width: '120' },
])
const columns_pointerMultimeter = ref([ // 指针式万用表
{ text: '参数', value: 'params', align: 'center', required: true, width: '120' },
{ text: '量', value: 'capacity', align: 'center', width: '120', required: true },
{ text: '单位', value: 'unit', align: 'center', width: '120', required: true },
{ text: '量程', value: 'rangeRange', align: 'center', required: true },
{ text: '示值', value: 'indicatingValue', align: 'center', required: true },
{ text: '分辨力', value: 'resolution', align: 'center', required: true, width: '220', reg: (resolution: string | number) => { return Number(resolution) <= 1 } },
{ text: '最大允许误差', value: 'maximumError', align: 'center', required: true, width: '200' },
{ text: '准确度a', value: 'accuracyA', align: 'center', required: true },
{ text: '指针式仪表满量程值', value: 'fullScaleValue', align: 'center', required: true },
{ text: '单位', value: 'fullScaleValueUnit', align: 'center', required: true, width: '120' },
{ text: '频率', value: 'frequency', align: 'center' },
{ text: '频率单位', value: 'frequencyUnit', align: 'center', width: '120' },
])
// ------------------------------------------字典----------------------------------------------
const paramsList = ref<dictType[]>([]) // 参数
const capacityList = ref<dictType[]>([]) // 量
const unitUList = ref<dictType[]>([]) // U单位
const unitIList = ref<dictType[]>([]) // I单位
const unitRList = ref<dictType[]>([]) // R单位
const frequencyUnitList = ref<dictType[]>([]) // 频率
const maximumErrorList = ref<dictType[]>([]) // 最大允许误差
const lineModeList = ref<dictType[]>([]) // 两线/四线模式
const coilEnlargeList = ref<dictType[]>([]) // 线圈放大
const coilEnlargeMap = ref({}) as any // 线圈放大map
const fullScaleValueUnitList = ref<dictType[]>([]) // 指针式仪表满量程值单位
/**
* 获取字典
*/
function getDict() {
// 参数
getDictByCode('bizFirstStandardParams').then((response) => {
paramsList.value = response.data
if (props.itemCategoryName === '多功能电力参数测量仪') {
paramsList.value.pop()
}
})
// 量
getDictByCode('bizFirstStandardCapacity').then((response) => {
capacityList.value = response.data
})
// U单位
getDictByCode('bizFirstStandardUnitU').then((response) => {
unitUList.value = response.data
})
// I单位
getDictByCode('bizFirstStandardUnitI').then((response) => {
unitIList.value = response.data
})
// R单位
getDictByCode('bizFirstStandardUnitR').then((response) => {
unitRList.value = response.data
})
// 频率单位
getDictByCode('bizFirstStandardFrequencyUnit').then((response) => {
frequencyUnitList.value = response.data
})
// 两线/四线模式
getDictByCode('bizFirstStandardLineMode').then((response) => {
lineModeList.value = response.data
})
// 线圈放大
getDictByCode('bizFirstStandardCoilEnlarge').then((response) => {
coilEnlargeList.value = response.data
})
// 指针式仪表满量程值单位
getDictByCode('bizFirstStandardFullScaleValueUnit').then((response) => {
fullScaleValueUnitList.value = response.data
})
// 最大允许误差
const maximumErrorListNormal = [
{
id: '=a*示值 + b*量程',
name: '=a*示值 + b*量程',
value: '=a*示值 + b*量程',
},
{
id: '=a*示值 + b*分辨力',
name: '=a*示值 + b*分辨力',
value: '=a*示值 + b*分辨力',
},
{
id: '=a*示值 + 常数b',
name: '=a*示值 + 常数b',
value: '=a*示值 + 常数b',
},
{
id: '=a*标准值 + b*量程',
name: '=a*标准值 + b*量程',
value: '=a*标准值 + b*量程',
},
{
id: '=a*标准值 + b*分辨力',
name: '=a*标准值 + b*分辨力',
value: '=a*标准值 + b*分辨力',
},
{
id: '=a*标准值 + 常数b',
name: '=a*标准值 + 常数b',
value: '=a*标准值 + 常数b',
},
]
// 最大允许误差--多功能电力参数测量仪
const maximumErrorListElectricPower = [
{
id: '[标准值 / (Vpri / Vsec)] * a + b * 分辨力',
name: '[标准值 / (Vpri / Vsec)] * a+ b * 分辨力',
value: '[标准值 / (Vpri / Vsec)] * a + b * 分辨力',
},
{
id: '[标准值 / (Vpri / Vsec)] * a + 常数b',
name: '[标准值 / (Vpri / Vsec)] * a + 常数b',
value: '[标准值 / (Vpri / Vsec)] * a + 常数b',
},
{
id: '[标准值 / (Vpri / Vsec)] * a + b * 量程',
name: '[标准值 / (Vpri / Vsec)] * a + b * 量程',
value: '[标准值 / (Vpri / Vsec)] * a + b * 量程',
},
]
if (props.itemCategoryName === '多功能电力参数测量仪') {
maximumErrorList.value = maximumErrorListElectricPower
}
else {
maximumErrorList.value = maximumErrorListNormal
}
}
getDict()
// ------------------------------------------------------------------------------------------------
// 频率有数据的时候校验频率单位字段
const checkFrequencyUnit = () => {
let result = true
if (list.value.length) {
for (let i = 0; i < list.value.length; i++) {
if (`${list.value[i].frequency}` && !list.value[i].frequencyUnit) {
ElMessage.warning(`请先完善 检定项表格 第${i + 1}行中 频率单位 字段`)
result = false
return
}
}
}
return result
}
// 校验表格(点击保存的时候用)
const checkList = () => {
return useCheckList(list.value, columns.value, '检定项表格')
}
// 增加行
const addRow = () => {
if (!checkFrequencyUnit()) { return false }
if (useCheckList(list.value, columns.value, '检定项表格')) {
if (list.value.length) { // 增加行时默认上一行数据
list.value.push({
id: '', // 主键
params: list.value[list.value.length - 1].params, // 参数
capacity: list.value[list.value.length - 1].capacity, // 量
unit: list.value[list.value.length - 1].unit, // 单位
frequency: list.value[list.value.length - 1].frequency, // 频率
frequencyUnit: list.value[list.value.length - 1].frequencyUnit, // 频率单位
rangeRange: list.value[list.value.length - 1].rangeRange, // 量程
standardValue: list.value[list.value.length - 1].standardValue, // 标准值
resolution: list.value[list.value.length - 1].resolution, // 分辨力
// maximumError: list.value[list.value.length - 1].maximumError, // 最大允许误差
maximumError: props.itemCategoryName === '指针式万用表' ? '=准确度a*指针式仪表满量程值' : list.value[list.value.length - 1].maximumError, // 最大允许误差
errorParamA: list.value[list.value.length - 1].errorParamA, // 误差参数a
errorParamB: list.value[list.value.length - 1].errorParamB, // 误差参数b
lineMode: list.value[list.value.length - 1].lineMode, // 两线/四线模式
coilEnlarge: list.value[list.value.length - 1].coilEnlarge, // 线圈放大
accuracyA: list.value[list.value.length - 1].accuracyA, // 准确度a
fullScaleValue: list.value[list.value.length - 1].fullScaleValue, // 指针式仪表满量程值
fullScaleValueUnit: list.value[list.value.length - 1].fullScaleValueUnit, // 指针式仪表满量程值单位
indicatingValue: list.value[list.value.length - 1].indicatingValue, // 示值
effectiveNumber: list.value[list.value.length - 1].effectiveNumber, // 有效数字
})
}
else {
list.value.push({
id: '', // 主键
params: '', // 参数
capacity: '', // 量
unit: '', // 单位
frequency: '', // 频率
frequencyUnit: '', // 频率单位
rangeRange: '', // 量程
standardValue: '', // 标准值
resolution: '0.0001', // 分辨力
maximumError: props.itemCategoryName === '指针式万用表' ? '=准确度a*指针式仪表满量程值' : '', // 最大允许误差
errorParamA: '', // 误差参数a
errorParamB: '', // 误差参数b
lineMode: '', // 两线/四线模式
coilEnlarge: '', // 线圈放大
accuracyA: '', // 准确度a
fullScaleValue: '', // 指针式仪表满量程值
fullScaleValueUnit: '', // 指针式仪表满量程值单位
indicatingValue: '', // 示值
effectiveNumber: undefined, // 有效数字
})
}
}
}
// 删除行
const deleteRow = () => {
if (!checkoutList.value.length) {
ElMessage.warning('请选中要删除的行')
}
else {
list.value = list.value.filter((item: any) => {
return !checkoutList.value.includes(item)
})
}
}
// -----------------------------------分辨力多0少0--------------------------------------------
// 点击减号
const clickSub = (row: ITemplateDetailAddRowPattern) => {
if (calc(row.resolution, 10, '*') > 1) {
ElMessage.warning('要求分辨力不能大于1')
}
else {
row.resolution = calc(row.resolution, 10, '*')
}
}
// 点击加号
const clickAdd = (row: ITemplateDetailAddRowPattern) => {
row.resolution = calc(row.resolution, 10, '/')
}
// 监听参数变化,改变量
const handleParamsChange = (value: string, row: ITemplateDetailAddRowPattern) => {
console.log(value)
console.log(row)
if (value === 'DCV' || value === 'ACV') {
row.capacity = 'U'
}
else if (value === 'DCI' || value === 'ACI') {
row.capacity = 'I'
}
else if (value === 'R') {
row.capacity = 'R'
}
}
// -------------------------------------------------------------------------------------------
// 清空配置方法
const clearConfig = () => {
list.value = []
}
// 多选
const handleSelectionChange = (e: any) => {
checkoutList.value = e
}
watch(() => props.itemCategoryName, (newValue) => {
if (newValue) {
switch (newValue) {
case '数字多用表(手持)':
columns.value = columns_digitalMultimeterHandheld.value
break
case '数字多用表(台式)':
columns.value = columns_digitalMultimeterTable.value
break
case '多功能电力参数测量仪':
columns.value = columns_multifunctionalPowerParameterMeasuringInstrument.value
break
case '钳形电流表':
columns.value = columns_clampAmmeter.value
break
case '指针式万用表':
columns.value = columns_pointerMultimeter.value
break
}
}
}, { immediate: true })
watch(() => props.list, (newVal) => {
if (newVal) {
list.value = [...newVal]
list.value = list.value.map((item: ITemplateDetailAddRowPattern) => {
return {
...item,
resolution: Number(item.resolution),
frequency: item.frequency || '/', // 频率
frequencyUnit: item.frequencyUnit || '/', // 频率单位
}
})
if (props.pageType === 'detail') {
useMergeTableRow(list.value, ['params', 'capacity', 'unit', 'frequency', 'frequencyUnit', 'rangeRange'])
}
}
})
defineExpose({ list, checkList, checkFrequencyUnit, clearConfig })
</script>
<template>
<detail-block :title="props.pageType === 'detail' ? '' : ' '">
<template v-if="props.pageType !== 'detail'" #btns>
<el-button type="primary" @click="addRow">
增加行
</el-button>
<el-button type="info" @click="deleteRow">
删除行
</el-button>
</template>
<el-table
ref="tableRef"
:data="list"
border
style="width: 100%;"
:span-method="mergeTableRow"
@selection-change="handleSelectionChange"
>
<el-table-column v-if="pageType !== 'detail'" type="selection" width="38" />
<el-table-column align="center" label="序号" width="80" type="index" />
<el-table-column
v-for="item in columns"
:key="item.value"
:prop="item.value"
:label="item.text"
:width="item.width"
align="center"
>
<template #header>
<span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span>
</template>
<template #default="scope">
<!-- 参数 -->
<el-select
v-if="props.pageType !== 'detail' && item.value === 'params'"
v-model="scope.row[item.value]"
placeholder="请选择"
:disabled="props.pageType === 'detail'"
filterable
@change="(value: any) => handleParamsChange(value, scope.row)"
>
<el-option v-for="item in paramsList" :key="item.id" :label="item.name" :value="item.value" />
</el-select>
<!-- 量 -->
<el-select
v-if="props.pageType !== 'detail' && item.value === 'capacity'"
v-model="scope.row[item.value]"
placeholder="请选择"
filterable
disabled
>
<el-option v-for="item in capacityList" :key="item.id" :label="item.name" :value="item.value" />
</el-select>
<!-- U单位 -->
<el-select
v-if="props.pageType !== 'detail' && item.value === 'unit' && scope.row.capacity === 'U'"
v-model="scope.row[item.value]"
placeholder="请选择"
:disabled="props.pageType === 'detail'"
filterable
>
<el-option v-for="item in unitUList" :key="item.id" :label="item.name" :value="item.value" />
</el-select>
<!-- I单位 -->
<el-select
v-if="props.pageType !== 'detail' && item.value === 'unit' && scope.row.capacity === 'I'"
v-model="scope.row[item.value]"
placeholder="请选择"
:disabled="props.pageType === 'detail'"
filterable
>
<el-option v-for="item in unitIList" :key="item.id" :label="item.name" :value="item.value" />
</el-select>
<!-- R单位 -->
<el-select
v-if="props.pageType !== 'detail' && item.value === 'unit' && scope.row.capacity === 'R'"
v-model="scope.row[item.value]"
placeholder="请选择"
:disabled="props.pageType === 'detail'"
filterable
>
<el-option v-for="item in unitRList" :key="item.id" :label="item.name" :value="item.value" />
</el-select>
<!-- 频率 -->
<el-input v-if="props.pageType !== 'detail' && item.value === 'frequency' && (scope.row.params === 'ACV' || scope.row.params === 'ACI')" v-model="scope.row[item.value]" style="display: flex;" :autofocus="true" :placeholder="`${item.text}`" class="input" />
<!-- 频率单位 -->
<el-select
v-if="props.pageType !== 'detail' && item.value === 'frequencyUnit' && (scope.row.params === 'ACV' || scope.row.params === 'ACI')"
v-model="scope.row[item.value]"
placeholder="单位"
:disabled="props.pageType === 'detail'"
filterable
clearable
>
<el-option v-for="item in frequencyUnitList" :key="item.id" :label="item.name" :value="item.value" />
</el-select>
<!-- 有效数字 -->
<el-input-number
v-if="props.pageType !== 'detail' && item.value === 'effectiveNumber'"
v-model="scope.row.effectiveNumber"
placeholder="有效数字"
class="input"
:min="1"
:step="1"
:precision="0"
/>
<!-- 最大允许误差 -->
<el-select
v-if="props.pageType !== 'detail' && item.value === 'maximumError' && props.itemCategoryName !== '指针式万用表'"
v-model="scope.row[item.value]"
placeholder="请选择"
:disabled="props.pageType === 'detail'"
filterable
>
<el-option v-for="item in maximumErrorList" :key="item.id" :label="item.name" :value="item.value" />
</el-select>
<!-- 两线/四线模式 -->
<el-select
v-if="props.pageType !== 'detail' && item.value === 'lineMode' && scope.row.params === 'R'"
v-model="scope.row[item.value]"
placeholder="请选择"
:disabled="props.pageType === 'detail'"
filterable
>
<el-option v-for="item in lineModeList" :key="item.id" :label="item.name" :value="item.value" />
</el-select>
<!-- 线圈放大 -->
<el-select
v-if="props.pageType !== 'detail' && item.value === 'coilEnlarge' && (scope.row.params === 'DCI' || scope.row.params === 'ACI')"
v-model="scope.row[item.value]"
placeholder="请选择"
:disabled="props.pageType === 'detail'"
filterable
>
<el-option v-for="item in coilEnlargeList" :key="item.id" :label="item.name" :value="item.name" />
</el-select>
<!-- 指针式仪表满量程值单位 -->
<el-select
v-if="props.pageType !== 'detail' && item.value === 'fullScaleValueUnit'"
v-model="scope.row[item.value]"
placeholder="请选择"
:disabled="props.pageType === 'detail'"
filterable
>
<el-option v-for="item in fullScaleValueUnitList" :key="item.id" :label="item.name" :value="item.value" />
</el-select>
<span
v-if="(item.value === 'frequency' && (scope.row.params !== 'ACV' && scope.row.params !== 'ACI'))
|| (item.value === 'frequencyUnit' && (scope.row.params !== 'ACV' && scope.row.params !== 'ACI'))
|| (item.value === 'lineMode' && scope.row.params !== 'R')
|| (item.value === 'coilEnlarge' && (scope.row.params !== 'DCI' && scope.row.params !== 'ACI'))
"
>/</span>
<!-- 分辨力 -->
<div v-if="item.value === 'resolution' && props.pageType !== 'detail'" style="display: flex;">
<icon-button v-if="pageType !== 'detail'" style="margin-right: 10px;" size="20" icon="icon-reduce-circle" title="扩大10倍" type="primary" @click="clickSub(scope.row)" />
<el-input
v-if="props.pageType !== 'detail' " v-model="scope.row[item.value]" :autofocus="true" :placeholder="`${item.text}`" class="input"
/>
<icon-button v-if="pageType !== 'detail'" style="margin-left: 10px;" size="20" icon="icon-add-circle" title="缩小10倍" type="primary" @click="clickAdd(scope.row)" />
</div>
<el-input
v-if="props.pageType !== 'detail' && (item.value === 'rangeRange'
|| item.value === 'errorParamA'
|| item.value === 'errorParamB' || item.value === 'standardValue'
|| item.value === 'indicatingValue' || item.value === 'accuracyA'
|| item.value === 'fullScaleValue')" v-model="scope.row[item.value]" :autofocus="true" :placeholder="`${item.text}`" class="input"
/>
</template>
</el-table-column>
</el-table>
</detail-block>
</template>