Newer
Older
vue3-front / src / views / device / standardEquipment / components / standardList / temptable.vue
<!-- 表格记录 -->
<script lang="ts" setup>
import { ElMessage, ElMessageBox } from 'element-plus'
import userListDialog from './userListDialog.vue'
interface columnsType {
  text: string
  value: string
  width?: string
  align?: string
}
const props = defineProps({
  name: {
    type: String,
    required: true,
  },
  buttonType: {
    type: String,
    default: '',
  },
  row: {
    type: Object,
    defaule: () => ({}),
  },
})
const list = ref([])
const total = ref(0)
const columns = ref<columnsType[]>([])
const selectionList = ref([])
const searchQuery = ref({
  limit: 10,
  offset: 1,
})
const loadingTable = ref(false)
// 记录表格数据
const tableData = ref([
  {
    name: '计量人员',
    list: [],
    columns: [
      {
        text: '姓名',
        value: 'name',
        align: 'center',
        selete: true,
        type: 'user',
      },
      {
        text: '计量人员编号',
        value: 'staffNo',
        align: 'center',
      },
      {
        text: '工作部门',
        value: 'deptId',
        align: 'center',
      },
      {
        text: '计量专业',
        value: 'major',
        align: 'center',
      },
      {
        text: '证书编号',
        value: 'verifierCertificateNo',
        align: 'center',
      },
      {
        text: '证书有效期',
        value: 'certificateDate',
        align: 'center',
      },
    ],
  },
  {
    name: '标准配套设备',
    list: [],
    columns: [
      {
        text: '设备名称',
        value: '',
        align: 'center',
        selete: true,
      },
      {
        text: '设备编号',
        value: '',
        align: 'center',
      },
      {
        text: '型号',
        value: '',
        align: 'center',
      },
      {
        text: '测量范围',
        value: '',
        align: 'center',
      },
      {
        text: '使用部门',
        value: '',
        align: 'center',
      },
      {
        text: '检定时间',
        value: '',
        align: 'center',
      },
      {
        text: '检定结果',
        value: '',
        align: 'center',
      },
      {
        text: '有效日期',
        value: '',
        align: 'center',
      },
    ],
  },
  {
    name: '检定规程',
    list: [],
    columns: [
      {
        text: '文件名称',
        value: '',
        align: 'center',
        selete: true,
      },
      {
        text: '文件编号',
        value: '',
        align: 'center',
      },
      {
        text: '文件号',
        value: '',
        align: 'center',
      },
      {
        text: '实施时间',
        value: '',
        align: 'center',
      },
      {
        text: '实施状态',
        value: '',
        align: 'center',
      },
    ],
  },
  {
    name: '重复性考核记录',
    list: [],
    columns: [
      {
        text: '记录编号',
        value: '',
        align: 'center',
      },
      {
        text: '记录名称',
        value: '',
        align: 'center',
      },
      {
        text: '考核时间',
        value: '',
        align: 'center',
      },
      {
        text: '考核结果',
        value: '',
        align: 'center',
      },
    ],
  },
  {
    name: '稳定性考核记录',
    list: [],
    columns: [
      {
        text: '记录编号',
        value: '',
        align: 'center',
      },
      {
        text: '记录名称',
        value: '',
        align: 'center',
      },
      {
        text: '考核时间',
        value: '',
        align: 'center',
      },
      {
        text: '考核结果',
        value: '',
        align: 'center',
      },
    ],
  },
  {
    name: '证书管理',
    list: [],
    columns: [
      {
        text: '证书编号',
        value: '',
        align: 'center',
      },
      {
        text: '证书名称',
        value: '',
        align: 'center',
      },
      {
        text: '证书类型',
        value: '',
        align: 'center',
      },
      {
        text: '证书出具日期',
        value: '',
        align: 'center',
      },
      {
        text: '证书有效期',
        value: '',
        align: 'center',
      },
    ],
  },
])
// 页数发生变化后的操作,可能是页码变化,可能是每页容量变化,此函数必写
const changePage = (val: { size?: number; page?: number }) => {
  if (val && val.size) {
    searchQuery.value.limit = val.size
  }
  if (val && val.page) {
    searchQuery.value.offset = val.page
  }
}
watch(() => props, (newVal) => {
  console.log(newVal, 'newVal')
  // 挑选需要展示的数据
  list.value = tableData.value.filter(item => item.name === newVal.name)[0]?.list || []
  columns.value = tableData.value.filter(item => item.name === newVal.name)[0]?.columns || []
  // row数据后续详情编辑需要
}, {
  deep: true,
  immediate: true,
})
// 保存数据
watch(() => tableData, (newVal) => {
  sessionStorage.setItem('tableData', JSON.stringify(newVal))
},
{ immediate: true, deep: true })
const addRowRef = ref()
const select = ref()
// 添加行
const addRowbtn = () => {
  // addRowRef.value.initDialog({ title: '添加', name: props.name })
  list.value.push({})
}
// 编辑行
const editRow = () => {
  if (select.value >= 0) {
    const row: object = list.value.filter((item, index) => index === select.value)[0]
    addRowRef.value.initDialog({ ...row, title: '编辑', name: props.name })
  }
  else {
    ElMessage.warning('请先选择需要编辑的数据')
  }
}
const userListRef = ref()
const listIndex = ref(0)
// 点击输入框中的选择按钮
const selectPerson = (index: number, type: string) => {
  listIndex.value = index
  if (type === 'user') {
    userListRef.value.initDialog()
  }
}
// // 行内添加数据
// const addRowData = (row: any, _: string) => {
//   if (_ === 'update') {
//     list.value = list.value.map((item, index) => {
//       if (index === select.value) {
//         return {
//           ...item,
//           ...row,
//         }
//       }
//       else {
//         return item
//       }
//     })
//   }
//   else {
//     list.value.push(row)
//   }
// }
// 表格选中
const handleSelectionChange = (e: any) => {
  selectionList.value = e
}
// 删除行
const removeRow = () => {
  if (selectionList.value.length > 0) {
    ElMessageBox.confirm(
      '确认删除选中的数据吗?',
      '提示',
      {
        confirmButtonText: '确认',
        cancelButtonText: '取消',
        type: 'warning',
      },
    ).then(() => {
      // list.value = list.value.filter((item, index) => !selectionList.value.includes(item))
      list.value.splice(listIndex.value, 1)
      ElMessage.success('删除成功')
    })
  }
  else {
    ElMessage.warning('请先选择需要删除的数据')
  }
}
// 选择完人员的回调函数
const confirmPerson = (e: any) => {
  console.log(e)
  list.value[listIndex.value] = e
}
</script>

<template>
  <div>
    <!-- 添加证书信息组件 -->
    <add-row ref="addRowRef" @add="addRowData" />
    <div class="header">
      <div class="title">
        <!-- {{ $props.name }} -->
      </div>
      <span class="btns">
        <el-button v-if="buttonType !== 'detail'" type="info" @click="removeRow">
          删除行
        </el-button>
        <el-button v-if="buttonType !== 'detail'" type="primary" @click="addRowbtn">
          添加行
        </el-button>
        <!-- <el-button v-if="buttonType !== 'detail'" type="primary" @click="editRow">
          编辑行
        </el-button> -->
      </span>
    </div>
    <!-- 表格区域 -->
    <el-table
      :data="list"
      border
      style="width: 100%;"
      @selection-change="handleSelectionChange"
    >
      <el-table-column 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"
        align="center"
      >
        <template #header>
          <span style="color: red;">*</span><span>{{ item.text }}</span>
        </template>
        <template #default="scope">
          <el-input v-model="scope.row[item.value]" :autofocus="true" :placeholder="`${item.text}`" class="input">
            <template v-if="item.selete" #append>
              <el-button size="small" :disabled="buttonType === 'detail'" @click="selectPerson(scope.$index, item.type)">
                选择
              </el-button>
            </template>
          </el-input>
        </template>
      </el-table-column>
    </el-table>
  </div>
  <!-- 选择用户列表组件 -->
  <user-list-dialog ref="userListRef" @add="confirmPerson" />
</template>

<style lang="scss" scoped>
.header {
  background-color: #fff;
  // height: 40px;
  border-radius: 8px;
  display: flex;
  align-items: center;
  flex-direction: column;
  justify-content: center;
  position: relative;

  .title {
    // font-weight: 700;
  }

  .btns {
    position: absolute;
    right: 40px;
    top: -4.5vh;
  }
}

:deep(.el-radio__label) {
  display: none;
}
// 样式
</style>