feat: 企微应用租户下拉选择 + corp_id 自动填入
All checks were successful
continuous-integration/drone/push Build is passing

- 租户表增加 corp_id 字段(企业微信企业ID)
- 租户管理页面支持配置 corp_id
- 企微应用页面租户从下拉选择
- 选择租户后自动填入 corp_id 并禁用编辑
- 提示用户如租户未配置 corp_id 需先去配置
This commit is contained in:
111
2026-01-24 10:20:02 +08:00
parent 0a799ee276
commit ab84f6b87d
4 changed files with 75 additions and 7 deletions

View File

@@ -1,5 +1,5 @@
<script setup>
import { ref, reactive, onMounted } from 'vue'
import { ref, reactive, onMounted, watch, computed } from 'vue'
import { ElMessage, ElMessageBox } from 'element-plus'
import api from '@/api'
import { useAuthStore } from '@/stores/auth'
@@ -15,6 +15,9 @@ const query = reactive({
tenant_id: ''
})
// 租户列表(用于下拉选择)
const tenantList = ref([])
// 对话框
const dialogVisible = ref(false)
const dialogTitle = ref('')
@@ -28,13 +31,37 @@ const form = reactive({
secret: ''
})
// 根据选中的租户获取 corp_id
const selectedTenant = computed(() => {
return tenantList.value.find(t => t.code === form.tenant_id)
})
// 监听租户选择变化,自动填入 corp_id
watch(() => form.tenant_id, (newVal) => {
if (newVal && !editingId.value) {
const tenant = tenantList.value.find(t => t.code === newVal)
if (tenant) {
form.corp_id = tenant.corp_id || ''
}
}
})
const rules = {
tenant_id: [{ required: true, message: '请输入租户ID', trigger: 'blur' }],
tenant_id: [{ required: true, message: '请选择租户', trigger: 'change' }],
name: [{ required: true, message: '请输入应用名称', trigger: 'blur' }],
corp_id: [{ required: true, message: '请输入企业ID', trigger: 'blur' }],
agent_id: [{ required: true, message: '请输入应用ID', trigger: 'blur' }]
}
// 获取租户列表
async function fetchTenants() {
try {
const res = await api.get('/api/tenants', { params: { size: 1000 } })
tenantList.value = res.data.items || []
} catch (e) {
console.error(e)
}
}
async function fetchList() {
loading.value = true
try {
@@ -68,6 +95,13 @@ function handleCreate() {
agent_id: '',
secret: ''
})
// 如果已选择租户,自动填入 corp_id
if (form.tenant_id) {
const tenant = tenantList.value.find(t => t.code === form.tenant_id)
if (tenant) {
form.corp_id = tenant.corp_id || ''
}
}
dialogVisible.value = true
}
@@ -138,6 +172,7 @@ async function handleViewSecret(row) {
}
onMounted(() => {
fetchTenants()
fetchList()
})
</script>
@@ -208,14 +243,34 @@ onMounted(() => {
<!-- 编辑对话框 -->
<el-dialog v-model="dialogVisible" :title="dialogTitle" width="500px">
<el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
<el-form-item label="租户ID" prop="tenant_id">
<el-input v-model="form.tenant_id" :disabled="!!editingId" placeholder="如: qiqi" />
<el-form-item label="租户" prop="tenant_id">
<el-select
v-model="form.tenant_id"
:disabled="!!editingId"
placeholder="请选择租户"
filterable
style="width: 100%"
>
<el-option
v-for="tenant in tenantList"
:key="tenant.code"
:label="`${tenant.name} (${tenant.code})`"
:value="tenant.code"
/>
</el-select>
</el-form-item>
<el-form-item label="应用名称" prop="name">
<el-input v-model="form.name" placeholder="如: 工具集企微应用" />
</el-form-item>
<el-form-item label="企业ID" prop="corp_id">
<el-input v-model="form.corp_id" placeholder="ww开头的企业ID" />
<el-form-item label="企业ID">
<el-input
v-model="form.corp_id"
disabled
:placeholder="selectedTenant?.corp_id ? '' : '请先在租户管理中配置企业ID'"
/>
<div v-if="form.tenant_id && !selectedTenant?.corp_id" class="el-form-item__error" style="position: static;">
该租户未配置企业ID请先到租户管理中配置
</div>
</el-form-item>
<el-form-item label="应用ID" prop="agent_id">
<el-input v-model="form.agent_id" placeholder="自建应用的 AgentId" />

View File

@@ -26,6 +26,7 @@ const formRef = ref(null)
const form = reactive({
code: '',
name: '',
corp_id: '',
status: 'active',
expired_at: null,
contact_info: {
@@ -69,6 +70,7 @@ function handleCreate() {
Object.assign(form, {
code: '',
name: '',
corp_id: '',
status: 'active',
expired_at: null,
contact_info: { contact: '', phone: '', email: '' }
@@ -82,6 +84,7 @@ function handleEdit(row) {
Object.assign(form, {
code: row.code,
name: row.name,
corp_id: row.corp_id || '',
status: row.status,
expired_at: row.expired_at,
contact_info: row.contact_info || { contact: '', phone: '', email: '' }
@@ -172,6 +175,7 @@ onMounted(() => {
<el-table-column prop="id" label="ID" width="80" />
<el-table-column prop="code" label="代码" width="120" />
<el-table-column prop="name" label="名称" min-width="150" />
<el-table-column prop="corp_id" label="企业ID" width="200" show-overflow-tooltip />
<el-table-column prop="status" label="状态" width="100">
<template #default="{ row }">
<el-tag :type="getStatusType(row.status)" size="small">
@@ -210,6 +214,9 @@ onMounted(() => {
<el-form-item label="租户名称" prop="name">
<el-input v-model="form.name" placeholder="公司/组织名称" />
</el-form-item>
<el-form-item label="企业ID">
<el-input v-model="form.corp_id" placeholder="企业微信企业IDww开头" />
</el-form-item>
<el-form-item label="状态">
<el-select v-model="form.status" style="width: 100%">
<el-option label="活跃" value="active" />