<!-- 标准装置台账信息详情 开展的检定或校准项目 --> <script name="StandardBookProject" lang="ts" setup> import { onMounted, ref } from 'vue' import { ElMessage } from 'element-plus' import type { TableColumn } from '@/components/NormalTable/table_interface' import useUserStore from '@/store/modules/user' import { useCheckList } from '@/commonMethods/useCheckList' import verifierParams from '/public/config/verifierParameter.json' import { addProject, getAllStaffByName, getProjectList } from '@/api/equipment/standard/book' const props = defineProps({ pageType: { // 页面类型 add新建 edit编辑 detail详情 type: String, default: 'detail', }, standardId: String, }) const verifierParamsList = ref([]) as any verifierParamsList.value = verifierParams.map((item: any) => { return { name: item.name, value: item.value, } }) // 查询条件 const listQuery = ref({ id: props.standardId!, offset: 1, limit: 20, }) const loadingTable = ref(false) // 表格loading const user = useUserStore() // 用户信息 const list = ref([]) as any // 表格数据 const checkoutList = ref([]) as any // 多选数据 const columns = ref<TableColumn[]>([ // 表头 { text: '检定或校准项目名称', value: 'itemName', align: 'center', required: true }, { text: '持有该参数人员', value: 'paramPerson', align: 'center' }, ]) const total = ref(0) // 数据总条数 // -----------------------------------------methods-------------------------------------- // 数据查询 function fetchData(isNowPage = false) { loadingTable.value = true if (!isNowPage) { // 是否显示当前页,否则跳转第一页 listQuery.value.offset = 1 } getProjectList(listQuery.value).then((response) => { list.value = response.data.rows.map((item: { fileType: string }) => { return { ...item, } }) total.value = parseInt(response.data.total) loadingTable.value = false }).catch(() => { loadingTable.value = false }) } // 点击增加行 const add = () => { list.value.push({ id: '', itemName: '', // 项目名称 paramPerson: '', // 持有该参数的人员 standardId: '', // 标准装置id }) } // 点击删除行 const del = () => { if (!checkoutList.value.length) { ElMessage.warning('请选中要删除的行') } else { list.value = list.value.filter((item: any) => { return !checkoutList.value.includes(item) }) } } // 多选发生改变时 const handleSelectionChange = (e: any) => { checkoutList.value = e } // 项目选择 const changeItemName = (val: string, row: any, index: number) => { loadingTable.value = true getAllStaffByName({ name: val }).then((res) => { if (typeof res.data === 'string') { row.paramPerson = res.data.split(',') } else { row.paramPerson = res.data } loadingTable.value = false }).catch(() => { loadingTable.value = false }) } // 点击保存 const saveProject = () => { if (!useCheckList(list.value, columns, '开展的检定或校准项目')) { return false } const tempParams = list.value.filter((item: { id: string }) => !item.id) const params = tempParams.map(() => { return { id: '', standardId: props.standardId, // 标准装置表id } }) loadingTable.value = true addProject(params).then(() => { ElMessage.success('新增开展的检定或校准项目成功') fetchData() }).catch(() => { loadingTable.value = false }) } // 改变页容量 function handleSizeChange(val: number) { listQuery.value.limit = val fetchData() } // 改变当前页 function handleCurrentChange(val: number) { listQuery.value.offset = val fetchData(true) } // 点击人员姓名 const clickPersonName = (name: string) => { // } // -------------------------------------------钩子------------------------------------------------ onMounted(async () => { fetchData() }) defineExpose({ saveProject, }) </script> <template> <detail-block title="开展的检定或校准项目"> <template v-if="pageType !== 'detail'" #btns> <el-button type="primary" @click="add"> 增加行 </el-button> <el-button type="info" @click="del"> 删除行 </el-button> </template> <el-table v-loading="loadingTable" :data="list" border style="width: 100%;" @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 v-if="pageType !== 'detail'" #default="scope" > <el-select v-if="item.value === 'itemName'" v-model="scope.row[item.value]" filterable :placeholder="pageType === 'detail' ? ' ' : '请选择检定或校准项目名称'" :disabled="pageType === 'detail'" class="full-width-input" @change="(selectedValue) => changeItemName(selectedValue, scope.row, scope.$index)" > <el-option v-for="item of verifierParamsList" :key="item.value" :label="item.name" :value="item.name" /> </el-select> <div v-if="item.value === 'paramPerson' && scope.row.paramPerson.length"> <span v-for="(i, index) in scope.row.paramPerson" :key="index"> <span v-if="item && index !== 0">,</span> <span class="follow-link" @click="clickPersonName">{{ i }}</span> </span> </div> </template> </el-table-column> </el-table> <!-- 页码 --> <el-pagination style="width: 100%;margin-top: 10px;" :current-page="listQuery.offset" :page-sizes="[10, 20, 30]" :page-size="listQuery.limit" :total="total" layout="total, sizes, prev, pager, next" @size-change="handleSizeChange" @current-change="handleCurrentChange" /> </detail-block> </template> <style lang="scss" scoped> .follow-link { color: #3d7eff; cursor: pointer; &:hover { color: #04395e; } } </style>