逻辑修改

This commit is contained in:
18631081161 2026-01-14 21:46:39 +08:00
parent 46da547671
commit e1da1f9ae7
4 changed files with 149 additions and 3 deletions

View File

@ -70,8 +70,47 @@ public class OrganizationsController : BaseApiController
[HttpDelete("{id}")]
public async Task<IActionResult> Delete(int id)
{
await _organizationService.DeleteAsync(id);
return NoContent();
try
{
await _organizationService.DeleteAsync(id);
return NoContent();
}
catch (ArgumentException ex)
{
return NotFound(new { message = ex.Message });
}
catch (InvalidOperationException ex)
{
return BadRequest(new { message = ex.Message });
}
}
/// <summary>
/// 获取组织关联的账户列表
/// </summary>
[HttpGet("{id}/accounts")]
public async Task<IActionResult> GetAccounts(int id)
{
var unit = await _organizationService.GetByIdAsync(id);
if (unit == null)
{
return NotFound(new { message = "组织不存在" });
}
var accounts = await _context.UserAccounts
.Where(u => u.OrganizationalUnitId == id)
.Select(u => new
{
u.Id,
u.Username,
u.DisplayName,
u.IsActive,
u.CreatedAt,
u.LastLoginAt
})
.ToListAsync();
return Ok(accounts);
}
/// <summary>
@ -108,4 +147,24 @@ public class OrganizationsController : BaseApiController
return Ok(new { message = "账户创建成功", username = account.Username });
}
/// <summary>
/// 删除账户
/// </summary>
[HttpDelete("{organizationId}/accounts/{accountId}")]
public async Task<IActionResult> DeleteAccount(int organizationId, int accountId)
{
var account = await _context.UserAccounts
.FirstOrDefaultAsync(u => u.Id == accountId && u.OrganizationalUnitId == organizationId);
if (account == null)
{
return NotFound(new { message = "账户不存在" });
}
_context.UserAccounts.Remove(account);
await _context.SaveChangesAsync();
return Ok(new { message = "账户删除成功" });
}
}

View File

@ -135,6 +135,12 @@ public class OrganizationService : IOrganizationService
if (unit.Children.Any())
throw new InvalidOperationException("无法删除有下级单位的组织");
// 检查是否有关联的用户账户
var hasUsers = await _context.UserAccounts
.AnyAsync(u => u.OrganizationalUnitId == id);
if (hasUsers)
throw new InvalidOperationException("无法删除有关联用户的组织");
_context.OrganizationalUnits.Remove(unit);
await _context.SaveChangesAsync();
}

View File

@ -33,5 +33,14 @@ export const organizationsApi = {
async createAccount(organizationId: number, accountData: { username: string; password: string }): Promise<void> {
await apiClient.post(`/organizations/${organizationId}/accounts`, accountData)
},
async getAccounts(organizationId: number): Promise<any[]> {
const response = await apiClient.get<any[]>(`/organizations/${organizationId}/accounts`)
return response.data
},
async deleteAccount(organizationId: number, accountId: number): Promise<void> {
await apiClient.delete(`/organizations/${organizationId}/accounts/${accountId}`)
}
}

View File

@ -27,7 +27,7 @@
{{ formatDate(row.createdAt) }}
</template>
</el-table-column>
<el-table-column label="操作" width="280" fixed="right">
<el-table-column label="操作" width="320" fixed="right">
<template #default="{ row }">
<el-button
v-if="row.level < 4"
@ -39,6 +39,7 @@
添加{{ getChildLevelName(row.level) }}
</el-button>
<el-button type="warning" text size="small" @click="handleEdit(row)">编辑</el-button>
<el-button type="info" text size="small" @click="handleViewAccounts(row)">查看账号</el-button>
<el-button type="success" text size="small" @click="handleCreateAccount(row)">创建账户</el-button>
<el-button type="danger" text size="small" @click="handleDelete(row)">删除</el-button>
</template>
@ -80,6 +81,43 @@
<el-button type="primary" :loading="savingAccount" @click="handleSaveAccount">创建</el-button>
</template>
</el-dialog>
<!-- View Accounts Dialog -->
<el-dialog v-model="showAccountsDialog" title="组织账号列表" width="900px">
<div v-if="selectedOrg" style="margin-bottom: 16px;">
<el-tag type="info">{{ selectedOrg.name }}</el-tag>
</div>
<el-table :data="accounts" v-loading="loadingAccounts">
<el-table-column prop="username" label="用户名" min-width="120" />
<el-table-column prop="displayName" label="显示名称" min-width="140" />
<el-table-column prop="isActive" label="状态" width="80">
<template #default="{ row }">
<el-tag :type="row.isActive ? 'success' : 'danger'" size="small">
{{ row.isActive ? '激活' : '禁用' }}
</el-tag>
</template>
</el-table-column>
<el-table-column prop="createdAt" label="创建时间" min-width="160">
<template #default="{ row }">
{{ formatDate(row.createdAt) }}
</template>
</el-table-column>
<el-table-column prop="lastLoginAt" label="最后登录" min-width="160">
<template #default="{ row }">
{{ row.lastLoginAt ? formatDate(row.lastLoginAt) : '从未登录' }}
</template>
</el-table-column>
<el-table-column label="操作" width="80" fixed="right">
<template #default="{ row }">
<el-button type="danger" text size="small" @click="handleDeleteAccount(row)">删除</el-button>
</template>
</el-table-column>
</el-table>
<el-empty v-if="!loadingAccounts && accounts.length === 0" description="该组织暂无账号" />
<template #footer>
<el-button @click="showAccountsDialog = false">关闭</el-button>
</template>
</el-dialog>
</div>
</template>
@ -94,11 +132,14 @@ import { OrganizationalLevel } from '@/types'
const organizations = ref<OrganizationalUnit[]>([])
const showCreateDialog = ref(false)
const showAccountDialog = ref(false)
const showAccountsDialog = ref(false)
const editingOrg = ref<OrganizationalUnit | null>(null)
const parentOrg = ref<OrganizationalUnit | null>(null)
const selectedOrg = ref<OrganizationalUnit | null>(null)
const saving = ref(false)
const savingAccount = ref(false)
const loadingAccounts = ref(false)
const accounts = ref<any[]>([])
const formRef = ref<FormInstance>()
const accountFormRef = ref<FormInstance>()
@ -204,6 +245,37 @@ function handleCreateAccount(org: OrganizationalUnit) {
showAccountDialog.value = true
}
async function handleViewAccounts(org: OrganizationalUnit) {
selectedOrg.value = org
showAccountsDialog.value = true
loadingAccounts.value = true
try {
accounts.value = await organizationsApi.getAccounts(org.id)
} catch {
ElMessage.error('加载账号列表失败')
} finally {
loadingAccounts.value = false
}
}
async function handleDeleteAccount(account: any) {
if (!selectedOrg.value) return
try {
await ElMessageBox.confirm(`确定要删除账号 "${account.username}" 吗?`, '确认删除', {
type: 'warning'
})
await organizationsApi.deleteAccount(selectedOrg.value.id, account.id)
ElMessage.success('账号删除成功')
//
await handleViewAccounts(selectedOrg.value)
} catch (error: any) {
if (error !== 'cancel') {
ElMessage.error('删除账号失败')
}
}
}
async function handleDelete(org: OrganizationalUnit) {
try {
await ElMessageBox.confirm('确定要删除该组织吗?', '确认删除', {