<template> <div class="tenant"> <!-- <Banner /> --> <div class="content"> <byTable :source="sourceList.data" :pagination="sourceList.pagination" :config="config" :loading="loading" highlight-current-row :selectConfig="selectConfig" :table-events="{ //element talbe事件都能传 select: select, }" :action-list="[]" @get-list="getList" > <template #phoneNumber="{ item }"> <div> <span v-for="(x, index) in getTypeData(item, 0)"> {{ x.contactNumber }} <span v-if="index < getTypeData(item, 0).length - 1">,</span> </span> </div> </template> <template #email="{ item }"> <div> <span v-for="(x, index) in getTypeData(item, 1)"> {{ x.contactNumber }} <span v-if="index < getTypeData(item, 1).length - 1">,</span> </span> </div> </template> </byTable> </div> <el-dialog :title="modalType == 'add' ? '添加IoT平台' : '编辑'" v-model="dialogVisible" width="800" v-loading="loading" > <byForm :formConfig="formConfig" :formOption="formOption" v-model="formData.data" :rules="rules" ref="byform" > <template #fileSlot> <div style="width: 100%"> <el-button type="primary" @click="addRow"> 添加 </el-button> <el-form ref="tableForm" :model="formData.data" :rules="rules" label-width="0px" style="margin-top: 15px" > <el-table :data="formData.data.internalAddressBookList"> <el-table-column prop="type" label="类型" min-width="150"> <template #default="{ row, $index }"> <el-form-item :prop="'internalAddressBookList.' + $index + '.type'" :rules="rules.type" :inline-message="true" > <el-select v-model="row.type" placeholder="请选择"> <el-option v-for="item in contactInformationType" :label="item.dictValue" :value="item.dictKey" > </el-option> </el-select> </el-form-item> </template> </el-table-column> <el-table-column prop="contactNumber" label="联系号码" min-width="150" > <template #default="{ row, $index }"> <el-form-item :prop=" 'internalAddressBookList.' + $index + '.contactNumber' " :rules="rules.contactNumber" :inline-message="true" > <el-input v-model="row.contactNumber" placeholder="请输入" /> </el-form-item> </template> </el-table-column> <el-table-column prop="zip" label="操作" width="100"> <template #default="{ $index }"> <el-button type="primary" link @click="handleRemove($index)" >删除</el-button > </template> </el-table-column> </el-table> </el-form> </div> </template> </byForm> <template #footer> <el-button @click="dialogVisible = false" size="large">取 消</el-button> <el-button type="primary" @click="submitForm('byform')" size="large" :loading="submitLoading" > 确 定 </el-button> </template> </el-dialog> </div> </template> <script setup> /* eslint-disable vue/no-unused-components */ import { ElMessage, ElMessageBox } from "element-plus"; import byTable from "@/components/byTable/index"; import byForm from "@/components/byForm/index"; import { computed, defineComponent, ref } from "vue"; import useUserStore from "@/store/modules/user"; const loading = ref(false); const submitLoading = ref(false); const sourceList = ref({ data: [], pagination: { total: 3, pageNum: 1, pageSize: 10, }, }); let dialogVisible = ref(false); let roomDialogVisible = ref(false); let modalType = ref("add"); let rules = ref({ type: [{ required: true, message: "请选择类型", trigger: "change" }], contactNumber: [ { required: true, message: "请输入联系号码", trigger: "blur" }, ], }); const { proxy } = getCurrentInstance(); const selectConfig = []; const config = computed(() => { return [ { attrs: { label: "部门", }, render(row) { return row.dept.deptName; }, }, { attrs: { label: "工号", prop: "deptId", }, }, { attrs: { label: "姓名", prop: "nickName", }, }, { attrs: { type: "slot", slot: "phoneNumber", label: "手机号", }, }, { attrs: { type: "slot", slot: "email", label: "电子邮箱", }, }, // { // attrs: { // label: "座机号码", // prop: "productId", // }, // }, { attrs: { label: "操作", width: "100", align: "right", }, // 渲染 el-button,一般用在最后一列。 renderHTML(row) { return [ { attrs: { label: "修改", type: "primary", text: true, }, el: "button", click() { getDtl(row); }, }, ]; }, }, ]; }); let formData = reactive({ data: { type: "1", }, treeData: [], }); const formOption = reactive({ inline: true, labelWidth: 100, itemWidth: 100, rules: [], }); const byform = ref(null); const treeData = ref([]); const formConfig = computed(() => { return [ { type: "input", prop: "deptName", label: "所属部门", disabled: true, }, { type: "input", prop: "nickName", label: "姓名", disabled: true, }, { type: "slot", slotName: "fileSlot", label: "联系方式", }, ]; }); const getList = async (req) => { sourceList.value.pagination = { ...sourceList.value.pagination, ...req }; loading.value = true; proxy .get("/internalAddressBook/page", sourceList.value.pagination) .then((message) => { sourceList.value.data = message.rows; sourceList.value.pagination.total = message.total; setTimeout(() => { loading.value = false; }, 200); }); }; const openModal = () => { dialogVisible.value = true; modalType.value = "add"; formData.data = {}; }; const submitForm = () => { byform.value.handleSubmit((valid) => { submitLoading.value = true; proxy.post("/internalAddressBook/" + modalType.value, formData.data).then( (res) => { ElMessage({ message: modalType.value == "add" ? "添加成功" : "编辑成功", type: "success", }); dialogVisible.value = false; submitLoading.value = false; getList(); }, (err) => (submitLoading.value = false) ); }); }; const getDtl = (row) => { modalType.value = "edit"; proxy .post("/internalAddressBook/detail", { userId: row.userId }) .then((res) => { res.forEach((x) => { x.type = x.type + ""; }); formData.data = { deptName: row.dept.deptName, nickName: row.nickName, internalAddressBookList: res, userId: row.userId, }; dialogVisible.value = true; }); }; const addRow = () => { formData.data.internalAddressBookList.push({ contactNumber: "", type: "", }); }; const handleRemove = (index) => { formData.data.internalAddressBookList.splice(index, 1); return ElMessage({ message: "删除成功!", type: "success", }); }; const contactInformationType = ref([]); const getDict = () => { const tenantId = useUserStore().user.tenantId; proxy .post("/dictTenantData/page", { pageNum: 1, pageSize: 999, tenantId: "@福建宏星!#¥%……&*()", dictCode: "contact_information", }) .then((res) => { contactInformationType.value = res.rows; }); }; const getTypeData = (item, type) => { return item.internalAddressBookList.filter((x) => x.type === type) || []; }; getList(); getDict(); </script> <style lang="scss" scoped> .tenant { padding: 20px; } </style>