Newer
Older
xc-business-system / src / views / business / measure / item / components / thirteenth / templateTable.vue
<script lang="ts" setup name="NonthTemplateTable">
import type { Ref } from 'vue'
import { ElTable } from 'element-plus'
import { defineExpose, ref } from 'vue'
import type { TableColumn } from '@/components/NormalTable/table_interface'
import { getDictByCode } from '@/api/system/dict'
import type { dictType } from '@/global'

// ------------------定义props、 emits-------------------
const props = defineProps({
  pageType: {
    type: String,
    default: 'detail',
  },
  // 数据
  data: {
    type: Array,
    default() {
      return []
    },
  },
  // 表格高度
  height: {
    type: Number,
    default() {
      return null
    },
  },
  // 数据列配置
  columns: {
    type: Array<TableColumn>,
    default() {
      return () => []
    },
  },
  // 表格大小
  size: {
    type: String,
    default: 'default',
  }, // 表格大小,默认,small,mini等,与el-table条件相同
  type: String, // 表格类型,表格title
})
const emits = defineEmits([
  'change',
  'selectionChange',
  'rowClick',
  'rowDbClick',
  'multiSelect',
  'filterChange',
  'changeItemType',
  'changeVerticalDeflectCoefficient',
  'changeInputNumber',
])
// ------------------------------------------字典----------------------------------------------
const standardTechnicalIndexSymbolList = ref<dictType[]>([]) // 技术指标规则
const standard13ThoroughfareList = ref<dictType[]>([]) // 通道
const standardTimeUnitList = ref<dictType[]>([]) // 时间单位
const standard13VerticalDeflectCoefficientList = ref<dictType[]>([]) // 垂直偏转系数(/div)
const standardVoltageList = ref<dictType[]>([]) // 垂直偏转系数(/div)单位\电压单位--公用
const standardResistanceList = ref<dictType[]>([]) // 电阻单位公用
const standard13TriggerTypeList = ref<dictType[]>([]) // 触发特性
const standard13NominalValueUnitList = ref<dictType[]>([]) // 标称值单位
const standardAmplitudeUnitList = ref<dictType[]>([]) // 幅度单位
const standard13ItemList = ref<dictType[]>([]) // 校准信号--项目
const standard13ScanTypeList = ref<dictType[]>([]) // 扫描方式
const standard13VerticalGearStepList = ref<dictType[]>([]) // 垂直档位步进
const standardFrequencyUnitList = ref<dictType[]>([]) // 频率单位-公用
const characteristicAmplitudeUnitList = ref<dictType[]>([]) // 触发特性-公用
const standard13SignalTypeList = ref<dictType[]>([]) // 信号类型
/**
 * 获取字典
 */
function getDict() {
  // 技术指标规则
  getDictByCode('standardTechnicalIndexSymbol').then((response) => {
    standardTechnicalIndexSymbolList.value = response.data
  })
  // 时间单位
  getDictByCode('standardTimeUnit').then((response) => {
    standardTimeUnitList.value = response.data
  })
  // 通道
  getDictByCode('standard13Thoroughfare').then((response) => {
    standard13ThoroughfareList.value = response.data
  })
  // 垂直偏转系数(/div)
  getDictByCode('standard13VerticalDeflectCoefficient').then((response) => {
    standard13VerticalDeflectCoefficientList.value = response.data
  })
  // 电压单位--公用/垂直偏转系数(/div)单位
  getDictByCode('standardVoltage').then((response) => {
    standardVoltageList.value = response.data
  })
  // 电阻单位公用
  getDictByCode('standardResistance').then((response) => {
    standardResistanceList.value = response.data
  })
  // 触发特性
  getDictByCode('standard13TriggerType').then((response) => {
    standard13TriggerTypeList.value = response.data
  })
  // 标称值单位
  getDictByCode('standard13NominalValueUnit').then((response) => {
    standard13NominalValueUnitList.value = response.data
  })
  // 幅度单位
  getDictByCode('standardAmplitudeUnit').then((response) => {
    standardAmplitudeUnitList.value = response.data
  })
  // 幅度单位
  getDictByCode('standardAmplitudeUnit').then((response) => {
    standardAmplitudeUnitList.value = response.data
  })
  // 校准信号--项目
  getDictByCode('standard13Item').then((response) => {
    standard13ItemList.value = response.data
  })
  // 扫描方式
  getDictByCode('standard13ScanType').then((response) => {
    standard13ScanTypeList.value = response.data
  })
  // 垂直档位步进
  getDictByCode('standard13VerticalGearStep').then((response) => {
    standard13VerticalGearStepList.value = response.data
  })
  // 频率单位公用
  getDictByCode('standardFrequencyUnit').then((response) => {
    standardFrequencyUnitList.value = response.data
  })
  // 触发特性幅度单位
  getDictByCode('characteristicAmplitudeUnit').then((response) => {
    characteristicAmplitudeUnitList.value = response.data
  })
  // 信号类型
  getDictByCode('standard13SignalType').then((response) => {
    standard13SignalTypeList.value = response.data
  })
}

getDict()
// -------定义数据--------------
interface columnsCheckInfo {
  text: string
  show: boolean
}
const columnsChecked: Ref<columnsCheckInfo[]> = ref([])
const table = ref<InstanceType<typeof ElTable>>()
const singleChecked = ref('') // 单选选中id
// 初始化列显示状态
function initColumnsState() {
  columnsChecked.value = []
  for (const column of props.columns) {
    columnsChecked.value.push({ text: column.text, show: !!column.show })
  }
}

// 最终展示列
const columnsFiltered: Ref<TableColumn[]> = ref([])
// 切换列
function changeColumns() {
  columnsFiltered.value = []
  for (const i in props.columns) {
    if (columnsChecked.value[i].show === true) {
      columnsFiltered.value.push(props.columns[i])
    }
  }
}
// 刷新
function refresh() {
  emits('change')
}

// 点击行
function rowClick(row: object, column?: any, event?: any) {
  emits('rowClick', row)
}
// 双击行
function rowDbClick(row: object, column?: any, event?: any) {
  emits('rowDbClick', row)
}
// 监听columns
watch(props.columns, (val) => {
  initColumnsState()
  changeColumns()
})
// 多选
const handleSelectionChange = (val: any) => {
  emits('selectionChange', val)
}
// 清除多选选中
const clearMulti = () => {
  console.log('清理选中')
  table.value!.clearSelection()
  singleChecked.value = ''
}

// 项目选择变化
const changeItemType = (value: string, index: number) => {
  emits('changeItemType', value, index)
}
// 垂直偏转系数变化
const changeVerticalDeflectCoefficient = (value: string) => {
  emits('changeVerticalDeflectCoefficient', value)
}

const changeInputNumber = (value: number) => {
  emits('changeInputNumber', value)
}

defineExpose({
  clearMulti, initColumnsState,
})
onBeforeMount(() => {
  initColumnsState()
  changeColumns()
})
</script>

<template>
  <el-table
    id="print"
    ref="table"
    :data="data"
    :height="height"
    border
    stripe
    :size="size"
    style="width: 100%;"
    @selection-change="handleSelectionChange"
    @row-click="rowClick"
    @row-dblclick="rowDbClick"
  >
    <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">
        <!-- 技术指标  -->
        <div v-if="item.value === 'technicalIndex'" style="display: flex;align-items: center;">
          <el-select
            v-model="scope.row.technicalIndexSymbol"
            :disabled="props.pageType === 'detail'"
            style="margin-right: 10px;width: 100px;"
          >
            <el-option v-for="item of standardTechnicalIndexSymbolList" :key="item.value" :label="item.name" :value="item.name" />
          </el-select>
          <el-input-number
            v-model="scope.row[item.value]"
            :placeholder="`${item.text}`"
            class="full-width-input"
            controls-position="right"
            :disabled="props.pageType === 'detail'"
          />
          <div
            v-if="props.type === '时基' || props.type === '直流增益' || props.type === '频带宽度(数字示波器)'
              || props.type === '输入电阻(数字示波器)' || props.type === '扫描时间系数及扩展' || props.type === '垂直幅度'
              || props.type === '输入电阻(模拟示波器)' || props.type === '校准信号(模拟示波器)'"
            style="margin-left: 10px; white-space: nowrap;"
          >
            {{ scope.row.technicalIndexUnit }}
          </div>

          <!-- 电压单位  -->
          <el-select
            v-if="props.type === '直流偏置'"
            v-model="scope.row.technicalIndexUnit"
            :disabled="props.pageType === 'detail'"
            style="margin-left: 10px;width: 130px;"
          >
            <el-option v-for="item of standardVoltageList" :key="item.value" :label="item.name" :value="item.name" />
          </el-select>

          <!-- 触发特性幅度单位  -->
          <el-select
            v-if="props.type === '触发特性'"
            v-model="scope.row.technicalIndexUnit"
            :disabled="props.pageType === 'detail'"
            style="margin-left: 10px;width: 130px;"
          >
            <el-option v-for="item of characteristicAmplitudeUnitList" :key="item.value" :label="item.name" :value="item.name" />
          </el-select>

          <!-- 时间 单位  -->
          <el-select
            v-if="props.type === '上升时间(数字示波器)' || props.type === '上升时间(模拟示波器)'"
            v-model="scope.row.technicalIndexUnit"
            :disabled="props.pageType === 'detail'"
            style="margin-left: 10px;width: 130px;"
          >
            <el-option v-for="item of standardTimeUnitList" :key="item.value" :label="item.name" :value="item.name" />
          </el-select>

          <!-- 频率 单位  -->
          <el-select
            v-if="props.type === '频带宽度(模拟示波器)'"
            v-model="scope.row.technicalIndexUnit"
            :disabled="props.pageType === 'detail'"
            style="margin-left: 10px;width: 140px;"
          >
            <el-option v-for="item of standardFrequencyUnitList" :key="item.value" :label="item.name" :value="item.name" />
          </el-select>
        </div>

        <!-- number -->
        <el-input-number
          v-if="item.value === 'cycleSignal' || item.value === 'standardValue' || item.value === 'referencePointFrequency'
            || item.value === 'bandWidth' || item.value === 'horizontalDeflectCoefficient'
            || item.value === 'referencePointFrequency' || item.value === 'bandWidth'
            || item.value === 'nominalValue' || item.value === 'signalFrequency' || item.value === 'amplitude'
            || (item.value === 'verticalDeflectionGear' && scope.row.itemType === '幅度') || item.value === 'horizontalScaleGear'
            || item.value === 'verticalScaleGear' || item.value === 'frequency' || item.value === 'referenceFrequency'
            || item.value === 'stepFrequency' || item.value === 'frequencyUpper' || item.value === 'referenceAmplitude'
            || item.value === 'nominalAmplitudeValue' || item.value === 'nominalFrequencyValue'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          class="full-width-input"
          :disabled="props.pageType === 'detail'"
          @change="changeInputNumber"
        />

        <!-- 时间单位--公用 / 周期时标信号单位、水平偏转系数单位 -->
        <el-select
          v-if="item.value === 'cycleSignalUnit' || item.value === 'horizontalDeflectCoefficientUnit' || item.value === 'horizontalScaleGearUnit'
            || (item.value === 'nominalValueUnit' && props.type === '扫描时间系数及扩展')"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standardTimeUnitList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>

        <!-- 通道 -->
        <el-select
          v-if="item.value === 'thoroughfare'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standard13ThoroughfareList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>

        <!-- 阻抗 -->
        <select-by-dict
          v-if="item.value === 'impedance'"
          v-model:model-value="scope.row[item.value]"
          placeholder="阻抗"
          dict-code="standard13Impedance"
          :disabled="props.pageType === 'detail'"
        />

        <!-- 垂直偏转系数(/div) -->
        <select-by-dict
          v-if="item.value === 'verticalDeflectCoefficient'"
          v-model:model-value="scope.row[item.value]"
          placeholder="垂直偏转系数(/div)"
          dict-code="standard13VerticalDeflectCoefficient"
          :disabled="props.pageType === 'detail'"
          @changeValue="changeVerticalDeflectCoefficient"
        />

        <!-- 电压公用单位--- 垂直偏转系数(/div)单位、标准值单位 -->
        <el-select
          v-if="item.value === 'verticalDeflectCoefficientUnit' || item.value === 'standardValueUnit'
            || item.value === 'verticalScaleGearUnit' || (item.value === 'nominalValueUnit' && props.type === '垂直幅度')
            || item.value === 'referenceAmplitudeUnit' || item.value === 'nominalAmplitudeValueUnit'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standardVoltageList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>

        <!-- 电阻单位公用 -->
        <el-select
          v-if="item.value === 'impedanceUnit'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standardResistanceList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>

        <!-- 触发特性 -->
        <el-select
          v-if="item.value === 'triggerType'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standard13TriggerTypeList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>

        <!-- 标称值单位 -->
        <el-select
          v-if="item.value === 'nominalValueUnit' && props.type !== '扫描时间系数及扩展' && props.type !== '垂直幅度'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standard13NominalValueUnitList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>

        <!-- 幅度单位 -->
        <el-select
          v-if="item.value === 'amplitudeUnit'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standardAmplitudeUnitList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>

        <!-- 校准信号--项目 -->
        <el-select
          v-if="item.value === 'itemType'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
          @change="(value) => changeItemType(value, scope.$index)"
        >
          <el-option v-for="item of standard13ItemList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>
        <!-- 校准信号--低电平测量时垂直偏转档位单位 -->
        <el-select
          v-if="item.value === 'verticalDeflectionGearUnit' && scope.row.itemType === '幅度'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standardVoltageList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>

        <!-- 校准信号--低电平测量时垂直偏转档位、单位 -->
        <el-input
          v-if="(item.value === 'verticalDeflectionGear' || item.value === 'verticalDeflectionGearUnit') && scope.row.itemType === '频率'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          disabled
          class="full-width-input"
        />

        <!-- 扫描方式 -->
        <el-select
          v-if="item.value === 'scanType'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standard13ScanTypeList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>

        <!-- 垂直档位步进 -->
        <el-select
          v-if="item.value === 'verticalGearStep'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standard13VerticalGearStepList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>

        <!-- 频率单位公用 -->
        <el-select
          v-if="item.value === 'frequencyUnit' || item.value === 'referenceFrequencyUnit' || item.value === 'stepFrequencyUnit'
            || item.value === 'frequencyUpperUnit' || item.value === 'nominalFrequencyValueUnit' || item.value === 'referencePointFrequencyUnit'
            || (item.value === 'bandWidth' && props.type !== '频带宽度(数字示波器)') || item.value === 'bandWidthUnit' || item.vaue === 'signalFrequencyUnit'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standardFrequencyUnitList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>

        <!-- 信号类型 -->
        <el-select
          v-if="item.value === 'signalType'"
          v-model="scope.row[item.value]"
          :placeholder="`${item.text}`"
          :disabled="props.pageType === 'detail'"
          class="full-width-input"
        >
          <el-option v-for="item of standard13SignalTypeList" :key="item.value" :label="item.name" :value="item.name" />
        </el-select>
      </template>
    </el-table-column>
  </el-table>
</template>

<style lang="scss" scoped>
.single-table {
  width: 100%;

  :deep(.el-table th.el-table__cell:nth-child(1) .cell) {
    visibility: hidden;
  }
}
</style>

<style lang="scss">
.normal-table {
  .el-radio__label {
    display: none !important;
  }
}
</style>