Newer
Older
xc-business-system / src / views / business / measure / item / components / first / templateDetailCreatePattern.vue
dutingting on 29 Nov 19 KB 解决冲突
<!-- 第一套标准库多功能校准源 -->
<!-- 第二种表格--生成检定项模式 -->
<!-- 交流电压表、交流电流表、直流电压表、直流电流表、75mV电流表 使用 -->
<script lang="ts" setup name="TemplateDetailCreatePattern">
import { ElMessage } from 'element-plus'
import type { IFormCreatePattern, ITemplateDetailCreatePattern } from './first-interface'
import { useCheckList } from '@/commonMethods/useCheckList'
import { calc } from '@/utils/useCalc'
import { getDictByCode } from '@/api/system/dict'
import type { dictType } from '@/global'
import { mergeTableRow, useMergeTableRow } from '@/commonMethods/useMergeTableRow'
import { isNumber } from '@/utils/validate'
const props = defineProps({
  pageType: {
    type: String,
    default: 'add',
  },
  itemCategoryName: {
    type: String,
    require: true,
  }, // 智能模型检定项分类名称
  list: {
    type: Array as any,
  },
  form: { // 检定项表单
    type: Object as any,
  },
})
const list = ref<ITemplateDetailCreatePattern[]>([]) // 表格数据
const checkoutList = ref<ITemplateDetailCreatePattern[]>([]) // 选中数据
const columns = ref([
  { text: '参数', value: 'params', align: 'center', required: true },
  { text: '量', value: 'capacity', align: 'center', width: '120', required: true },
  { text: '单位', value: 'unit', align: 'center', width: '120', required: true },
  { text: '被检表示值', value: 'measureIndicationValue', align: 'center', required: true },
  { text: '标准值', value: 'standardValue', align: 'center', required: true, reg: isNumber, validMessage: '要求为数字' },
  { text: '分辨力', value: 'resolution', align: 'center', required: true, reg: (resolution: string | number) => { return Number(resolution) <= 1 } },
  { text: '准确度等级', value: 'accuracyLevel', align: 'center', required: true },
  { text: '最大允许误差', value: 'maximumError', align: 'center', required: true },
  { text: '频率', value: 'frequency', align: 'center' },
  { text: '频率单位', value: 'frequencyUnit', align: 'center' },
])
const ruleFormRef = ref() // 表单ref
const form = ref<IFormCreatePattern>({
  fullScaleValue: 0, // 表满量程值
  fullScaleValueUnit: '', // 表满量程值单位
  standardValueUpper: 0, // 标准值上限
  standardValueUpperUnit: '', // 标准值上限单位
  points: 0, // 检定点个数
  frequency: 0, // 频率
  frequencyUnit: '', // 频率单位
  accuracyLevel: 0, // 准确度等级
  resolution: 0.0001, // 分辨力
  itemId: '', // 检定项id
  id: '',
})

// 校验规则
const rules = ref({
  fullScaleValue: [{ required: true, message: '表满量程值不能为空', trigger: ['blur', 'change'] }],
  fullScaleValueUnit: [{ required: true, message: '表满量程值单位不能为空', trigger: ['blur', 'change'] }],
  standardValueUpper: [{ required: true, message: '标准值上限不能为空', trigger: ['blur', 'change'] }],
  standardValueUpperUnit: [{ required: true, message: '标准值上限单位不能为空', trigger: ['blur', 'change'] }],
  points: [{ required: true, message: '检定点个数不能为空', trigger: ['blur', 'change'] }],
  frequency: [{ required: true, message: '频率不能为空', trigger: ['blur', 'change'] }],
  frequencyUnit: [{ required: true, message: '频率单位不能为空', trigger: ['blur', 'change'] }],
  accuracyLevel: [{ required: true, message: '准确度等级不能为空', trigger: ['blur', 'change'] }],
  resolution: [{ required: true, message: '分辨力不能为空', trigger: ['blur', 'change'] }],
})
// ------------------------------------------字典----------------------------------------------
const frequencyUnitList = ref<dictType[]>([]) // 频率
const fullScaleValueUnitList = ref<dictType[]>([]) // 指针式仪表满量程值单位
const unitIList = ref<dictType[]>([]) // 指针式仪表满量程值I单位
/**
 * 获取字典
 */
function getDict() {
  // 频率单位
  getDictByCode('bizFirstStandardFrequencyUnit').then((response) => {
    frequencyUnitList.value = response.data
  })
  // 表满量程值单位
  getDictByCode('bizFirstStandardFullScaleValueCreate').then((response) => {
    fullScaleValueUnitList.value = response.data
  })
  // I单位
  getDictByCode('bizFirstStandardFullScaleValueCreateI').then((response) => {
    unitIList.value = response.data
  })
}

getDict()
// ------------------------------------------------------------------------------------------------
const paramsMap: { [key: string]: string | undefined } = { // 参数
  '交流电压表': 'ACV',
  '交流电流表': 'ACI',
  '直流电压表': 'DCV',
  '直流电流表': 'DCI',
  '75mV电流表': 'DCV',
}
const capacityMap: { [key: string]: string | undefined } = { // 量
  '交流电压表': 'U',
  '交流电流表': 'I',
  '直流电压表': 'U',
  '直流电流表': 'I',
  '75mV电流表': 'U',
}
// const measureIndicationValueMap: { [key: string]: string | undefined } = { // 被检表示值
//   '交流电压表': 'V',
//   '交流电流表': 'A',
//   '直流电压表': 'V',
//   '直流电流表': 'A',
//   '75mV电流表': 'V',
// }

// 点击生成检定点
const createCheckPoint = () => {
  ruleFormRef.value!.validate((valid: boolean) => {
    if (valid) {
      list.value = []
      const tempMaximumError = calc(calc(Number(form.value.accuracyLevel), Number(form.value.standardValueUpper), '*'), 100, '/')
      for (let i = 0; i < form.value.points; i++) {
        list.value.push({
          id: '', // 主键
          params: paramsMap[props.itemCategoryName! as string]!, // 参数
          capacity: capacityMap[props.itemCategoryName! as string]!, // 量
          unit: form.value.standardValueUpperUnit, // 单位
          measureIndicationValue: calc(Number(calc(form.value.fullScaleValue as number, form.value.points, '/')), (i + 1), '*') + form.value.fullScaleValueUnit, // 被检表示值
          standardValue: `${calc(Number(calc(form.value.standardValueUpper, form.value.points, '/')), (i + 1), '*')}`, // 标准值
          frequency: form.value.frequency, // 频率
          frequencyUnit: form.value.frequencyUnit, // 频率单位
          resolution: form.value.resolution, // 分辨力
          accuracyLevel: Number(form.value.accuracyLevel), // 准确度等级
          maximumError: `±${tempMaximumError}${form.value.standardValueUpperUnit}`, // 最大允许误差
        })
      }
    }
  })
}

// 多选
const handleSelectionChange = (e: any) => {
  checkoutList.value = e
}

// -----------------------------------分辨力多0少0--------------------------------------------
// 点击减号
const clickSub = () => {
  if (Number(calc(form.value.resolution, 10, '*')) > 1) {
    ElMessage.warning('要求分辨力不能大于1')
  }
  else {
    form.value.resolution = Number(calc(form.value.resolution, 10, '*'))
  }
}
// 点击加号
const clickAdd = () => {
  form.value.resolution = Number(calc(form.value.resolution, 10, '/'))
}

// ----------------------------------------检验表单--------------------------------------------
const checkForm = () => {
  ruleFormRef.value.clearValidate()
  if (`${form.value.fullScaleValue}` === '' || `${form.value.fullScaleValue}` === 'null') {
    ElMessage.warning('表满量程值不能为空')
    return false
  }
  if (`${form.value.fullScaleValueUnit}` === '' || `${form.value.fullScaleValueUnit}` === 'null') {
    ElMessage.warning('表满量程值单位不能为空')
    return false
  }
  if (`${form.value.standardValueUpper}` === '' || `${form.value.standardValueUpper}` === 'null') {
    ElMessage.warning('标准值上限不能为空')
    return false
  }
  if (`${form.value.standardValueUpperUnit}` === '' || `${form.value.standardValueUpperUnit}` === 'null') {
    ElMessage.warning('标准值上限单位不能为空')
    return false
  }

  if (`${form.value.points}` === '' || `${form.value.points}` === 'null') {
    ElMessage.warning('检定点个数不能为空')
    return false
  }
  if (props.itemCategoryName === '交流电压表' || props.itemCategoryName === '交流电流表') {
    if (`${form.value.frequency}` === '' || `${form.value.frequency}` === 'null') {
      ElMessage.warning('频率不能为空')
      return false
    }
    if (`${form.value.frequencyUnit}` === '' || `${form.value.frequencyUnit}` === 'null') {
      ElMessage.warning('频率单位不能为空')
      return false
    }
  }
  if (`${form.value.accuracyLevel}` === '' || `${form.value.accuracyLevel}` === 'null') {
    ElMessage.warning('准确度等级不能为空')
    return false
  }
  if (`${form.value.resolution}` === '' || `${form.value.resolution}` === 'null') {
    ElMessage.warning('分辨力不能为空')
    return false
  }

  // 校验表格(点击保存的时候用)
  if (!useCheckList(list.value, columns.value, '检定项表格')) {
    return false
  }

  return true
}

// --------------------------------------------------------------------------------------------
// 监听表满量程值,修改标准值上限
watch(() => form.value.fullScaleValue, (newValue) => {
  if (props.itemCategoryName !== '75mV电流表') {
    form.value.standardValueUpper = newValue
    if (!form.value.standardValueUpper) {
      form.value.fullScaleValueUnit = form.value.standardValueUpperUnit
    }
  }
})
watch(() => props.list, (newVal) => {
  if (newVal) {
    list.value = [...newVal]
    list.value = list.value.map((item: ITemplateDetailCreatePattern) => {
      return {
        ...item,
        resolution: Number(item.resolution), // 分辨力去掉末尾的0
      }
    })
    if (props.pageType === 'detail') {
      useMergeTableRow(list.value, ['params', 'capacity', 'unit'])
    }
  }
}, { immediate: true, deep: true })

watch(() => props.form, (newVal) => { // 检定项表单
  if (newVal) {
    form.value.fullScaleValue = newVal.fullScaleValue // 表满量程值
    form.value.fullScaleValueUnit = newVal.fullScaleValueUnit // 表满量程值单位
    form.value.standardValueUpper = newVal.standardValueUpper// 标准值上限
    form.value.standardValueUpperUnit = newVal.standardValueUpperUnit // 标准值上限单位
    form.value.points = newVal.points// 检定点个数
    form.value.frequency = newVal.frequency // 频率
    form.value.frequencyUnit = newVal.frequencyUnit // 频率单位
    form.value.accuracyLevel = newVal.accuracyLevel // 准确度等级
    if (newVal.fromTemplate !== 'true') {
      form.value.id = newVal.id
      form.value.itemId = newVal.itemId
    }
    form.value.resolution = `${newVal.resolution}` !== 'undefined' ? Number(newVal.resolution) : 0.0001 // 分辨力去掉末尾的0
    if (props.itemCategoryName === '75mV电流表') { // 75mV电流表 标准值上限固定
      form.value.standardValueUpper = 75
      form.value.standardValueUpperUnit = 'mV'
    }
  }
}, { deep: true, immediate: true })

onMounted(() => {
  // if (!form.value.standardValueUpper && !form.value.standardValueUpperUnit && props.itemCategoryName === '75mV电流表') {
  //   form.value.standardValueUpper = 75
  //   form.value.standardValueUpperUnit = 'mV'
  // }
  if (props.itemCategoryName === '75mV电流表') {
    form.value.standardValueUpper = 75
    form.value.standardValueUpperUnit = 'mV'
  }
})

defineExpose({ list, form, checkForm })
</script>

<template>
  <el-form
    ref="ruleFormRef"
    :model="form"
    label-width="120"
    label-position="right"
    :rules="rules"
  >
    <el-row :gutter="24">
      <el-col :span="8" style="display: flex;justify-content: flex-start;">
        <el-form-item label="表满量程值:" prop="fullScaleValue">
          <precision-input-number
            v-model="form.fullScaleValue"
            :placeholder="pageType === 'detail' ? '' : '请输入表满量程值'"
            :disabled="pageType === 'detail'"
            style="flex: 1;"
          />
        </el-form-item>
        <el-form-item label-width="10" prop="fullScaleValueUnit">
          <!-- 电压单位 -->
          <el-select
            v-if="props.itemCategoryName === '交流电压表' || props.itemCategoryName === '直流电压表'"
            v-model="form.fullScaleValueUnit"
            placeholder="单位"
            :disabled="props.pageType === 'detail'"
            filterable
            style="width: 100px;"
          >
            <el-option v-for="item in fullScaleValueUnitList" :key="item.id" :label="item.name" :value="item.value" />
          </el-select>
          <!-- 电流单位 -->
          <el-select
            v-else
            v-model="form.fullScaleValueUnit"
            placeholder="单位"
            :disabled="props.pageType === 'detail'"
            filterable
            style="width: 100px;"
          >
            <el-option v-for="item in unitIList" :key="item.id" :label="item.name" :value="item.value" />
          </el-select>
        </el-form-item>
      </el-col>
      <el-col :span="8" style="display: flex;justify-content: flex-start;">
        <el-form-item label="标准值上限:" prop="standardValueUpper">
          <precision-input-number
            v-model="form.standardValueUpper"
            :placeholder="pageType === 'detail' ? '' : '请输入标准值上限'"
            :disabled="pageType === 'detail' || props.itemCategoryName === '75mV电流表'"
          />
        </el-form-item>
        <el-form-item label-width="10" prop="standardValueUpperUnit">
          <!-- 电压单位 -->
          <el-select
            v-if="props.itemCategoryName === '交流电压表' || props.itemCategoryName === '直流电压表'"
            v-model="form.standardValueUpperUnit"
            placeholder="单位"
            :disabled="props.pageType === 'detail'"
            filterable
            style="width: 100px;"
          >
            <el-option v-for="item in fullScaleValueUnitList" :key="item.id" :label="item.name" :value="item.value" />
          </el-select>

          <!-- 75mv电流表电压单位 -->
          <el-select
            v-if="props.itemCategoryName === '75mV电流表'"
            v-model="form.standardValueUpperUnit"
            placeholder="单位"
            disabled
            filterable
            style="width: 100px;"
          >
            <el-option v-for="item in ['mV']" :key="item" :label="item" :value="item" />
          </el-select>
          <!-- 电流单位 -->
          <el-select
            v-if="props.itemCategoryName === '交流电流表' || props.itemCategoryName === '直流电流表'"
            v-model="form.standardValueUpperUnit"
            placeholder="单位"
            :disabled="props.pageType === 'detail'"
            filterable
            style="width: 100px;"
          >
            <el-option v-for="item in unitIList" :key="item.id" :label="item.name" :value="item.value" />
          </el-select>
        </el-form-item>
      </el-col>
      <el-col :span="8" style="display: flex;justify-content: flex-start;">
        <el-form-item label="检定点个数:" prop="points">
          <el-input-number
            v-model="form.points"
            :placeholder="pageType === 'detail' ? '' : '请输入检定点个数'"
            :disabled="pageType === 'detail'"
            :step="1"
            :min="1"
            :precision="0"
          />
        </el-form-item>
      </el-col>
      <el-col v-if="props.itemCategoryName === '交流电压表' || props.itemCategoryName === '交流电流表'" :span="8" style="display: flex;justify-content: flex-start;">
        <el-form-item label="频率:" prop="frequency">
          <precision-input-number
            v-model="form.frequency"
            :placeholder="pageType === 'detail' ? '' : '请输入频率'"
            :disabled="pageType === 'detail'"
          />
        </el-form-item>
        <el-form-item label-width="10" prop="frequencyUnit">
          <!-- 单位 -->
          <el-select
            v-model="form.frequencyUnit"
            placeholder="单位"
            :disabled="props.pageType === 'detail'"
            filterable
            style="width: 100px;"
          >
            <el-option v-for="item in frequencyUnitList" :key="item.id" :label="item.name" :value="item.value" />
          </el-select>
        </el-form-item>
      </el-col>
      <el-col :span="8">
        <el-form-item label="准确度等级:" prop="accuracyLevel">
          <precision-input-number
            v-model="form.accuracyLevel"
            :placeholder="pageType === 'detail' ? '' : '请输入准确度等级'"
            :disabled="pageType === 'detail'"
          />
          <!-- <el-input v-model="form.accuracyLevel" :placeholder="pageType === 'detail' ? '' : '请输入准确度等级'" class="input" /> -->
        </el-form-item>
      </el-col>
      <el-col :span="8">
        <el-form-item label="分辨力:" prop="resolution">
          <!-- <el-input-number
            v-model="form.resolution"
            :placeholder="pageType === 'detail' ? '' : '请输入分辨力'"
            :disabled="pageType === 'detail'"
            :min="0"
          /> -->
          <!-- 分辨力  -->
          <div 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" />
            <el-input
              v-model="form.resolution"
              :placeholder="pageType === 'detail' ? '' : '请输入分辨力'"
              :disabled="pageType === 'detail'"
              class="input"
            />
            <icon-button v-if="pageType !== 'detail'" style="margin-left: 10px;" size="20" icon="icon-add-circle" title="缩小10倍" type="primary" @click="clickAdd" />
          </div>
        </el-form-item>
      </el-col>
    </el-row>
  </el-form>

  <detail-block :title="props.pageType === 'detail' ? '' : ' '">
    <template v-if="props.pageType !== 'detail'" #btns>
      <el-button type="primary" @click="createCheckPoint">
        生成检定点
      </el-button>
    </template>
    <el-table
      ref="tableRef"
      :data="list"
      border
      style="width: 100%;"
      :span-method="mergeTableRow"
      @selection-change="handleSelectionChange"
    >
      <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-input
            v-if="props.pageType !== 'detail' && (item.value === 'measureIndicationValue' || item.value === 'standardValue' || item.value === 'errorParamA' || item.value === 'errorParamB' || item.value === 'standardValue')" v-model.trim="scope.row[item.value]" :autofocus="true" :placeholder="`${item.text}`" class="input"
          />
          <!-- 频率 -->
          <el-input v-if="props.pageType !== 'detail' && item.value === 'frequency' && (scope.row.params === 'ACV' || scope.row.params === 'ACI')" v-model.trim="scope.row[item.value]" style="display: flex;" :autofocus="true" :placeholder="`${item.text}`" class="input" />
          <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'))
            "
          >/</span>
        </template>
      </el-table-column>
    </el-table>
  </detail-block>
</template>