<!-- 标准装置台账信息详情 开展量传参数 --> <script name="StandardBookProject" lang="ts" setup> import { onMounted, ref } from 'vue' import { ElMessage } from 'element-plus' import selectPersonProjectDialog from '../dialog/selectPersonProjectDialog.vue' 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, deleteProject, getAllStaffByName, getProjectList, updateProject } from '@/api/equipment/standard/book' const props = defineProps({ pageType: { // 页面类型 add新建 edit编辑 detail详情 type: String, default: 'detail', }, standardId: String, }) const router = useRouter() 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 checkoutIds = ref<string[]>([])// 删除用的ids const columns = ref<TableColumn[]>([ // 表头 { text: '开展量传参数名称', value: 'itemName', align: 'center', required: true }, { text: '持有该参数人员', value: 'personList', align: 'center' }, ]) const total = ref(0) // 数据总条数 const checkoutNameList = ref<string[]>([]) // 选中的项目名称的数组 // -----------------------------------------methods-------------------------------------- // 数据查询 function fetchData(isNowPage = false) { loadingTable.value = true if (!isNowPage) { // 是否显示当前页,否则跳转第一页 listQuery.value.offset = 1 } getProjectList(listQuery.value).then((response) => { list.value = response.data.rows total.value = parseInt(response.data.total) loadingTable.value = false }).catch(() => { loadingTable.value = false }) } const addType = ref('') // 增加类型 single/multi // 点击增加行 const add = () => { addType.value = 'single' list.value.push({ id: '', itemName: '', // 项目名称 personList: '', // 持有该参数的人员 standardId: '', // 标准装置id }) } const selectPersonProjectDialogRef = ref() // 点击批量增加 const multiAdd = () => { addType.value = 'multi' selectPersonProjectDialogRef.value.initDialog() } // 批量增加选好项目 const confirmSelectPersonProject = (listParam = []) => { if (!listParam.length) { return false } listParam.forEach((item: { name: string }) => { const index = list.value.findIndex((i: { itemName: string }) => i.itemName === item.name) if (index === -1) { list.value.push({ ...item, itemName: item.name, }) } else { ElMessage.warning(`${item.name}已经添加过,不再重复添加`) } }) } // 点击删除行 const del = async () => { if (!checkoutList.value.length) { ElMessage.warning('请选中要删除的行') return } // 前端删除 list.value = list.value.filter((item: any) => !checkoutList.value.includes(item)) // 接口删除 checkoutIds.value = checkoutList.value.map((item: { id: string }) => item.id!) checkoutIds.value = checkoutIds.value.filter(item => item) if (checkoutIds.value.length) { loadingTable.value = true await deleteProject({ ids: checkoutIds.value }) fetchData() loadingTable.value = false } } // 多选发生改变时 const handleSelectionChange = (e: any) => { checkoutList.value = e } // 项目选择 const changeItemName = (val: string, row: any, index: number) => { loadingTable.value = true getAllStaffByName({ name: val }).then((res) => { row.personList = res.data.map((item: { id: string; staffName: string }) => { return { staffId: item.id, staffName: item.staffName, } }) loadingTable.value = false }).catch(() => { loadingTable.value = false }) } // 点击保存 const saveProject = () => { if (!useCheckList(list.value, columns.value, '开展量传参数')) { return false } const tempParams = list.value.filter((item: { id: string }) => !item.id) const tempParamsHaveId = list.value.filter((item: { id: string }) => item.id) loadingTable.value = true if (tempParams.length) { const params = tempParams.map((item: any) => { return { ...item, standardId: props.standardId, // 标准装置表id } }) addProject(params).then(() => { ElMessage.success('操作成功') fetchData() }).catch(() => { loadingTable.value = false }) } if (tempParamsHaveId.length) { const params = tempParamsHaveId.map((item: any) => { return { ...item, standardId: props.standardId, // 标准装置表id } }) updateProject(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 = (value: { staffId: string }) => { console.log('点击的人员的信息', value) router.push({ query: { type: 'detail', id: value.staffId, fromPage: 'standardDetailProject', }, path: '/person/register/detail', }) } // -------------------------------------------钩子------------------------------------------------ watch(() => list.value, (newValue) => { if (newValue.length) { checkoutNameList.value = newValue.map((item: { itemName: string }) => item.itemName) verifierParamsList.value = verifierParamsList.value.map((item: { name: string }) => { return { ...item, disabled: checkoutNameList.value.includes(item.name), } }) } }, { deep: true, immediate: true }) onMounted(async () => { fetchData() }) defineExpose({ saveProject, }) </script> <template> <detail-block title="开展量传参数"> <template v-if="pageType !== 'detail'" #btns> <el-button type="primary" @click="multiAdd"> 批量增加 </el-button> <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 #header> <span v-show="item.required" style="color: red;">*</span><span>{{ item.text }}</span> </template> <template #default="scope" > <el-select v-if="item.value === 'itemName' && pageType !== 'detail'" v-model="scope.row[item.value]" filterable :placeholder="pageType === 'detail' ? ' ' : '请选择开展量传参数名称'" :disabled="pageType === 'detail'" class="full-width-input" @change="(selectedValue: any) => changeItemName(selectedValue, scope.row, scope.$index)" > <el-option v-for="item of verifierParamsList" :key="item.value" :label="item.name" :value="item.name" :disabled="item.disabled" /> </el-select> <div v-if="item.value === 'personList' && scope.row.personList.length"> <span v-for="(i, index) in scope.row.personList" :key="index"> <span v-if="item && index !== 0">,</span> <span class="follow-link" @click="clickPersonName(i)">{{ i.staffName }}</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" /> <select-person-project-dialog ref="selectPersonProjectDialogRef" @confirm="confirmSelectPersonProject" /> </detail-block> </template> <style lang="scss" scoped> .follow-link { color: #3d7eff; cursor: pointer; &:hover { color: #04395e; } } </style>