diff --git a/src/MilitaryTrainingManagement/Controllers/OrganizationsController.cs b/src/MilitaryTrainingManagement/Controllers/OrganizationsController.cs index f792cfd..218a288 100644 --- a/src/MilitaryTrainingManagement/Controllers/OrganizationsController.cs +++ b/src/MilitaryTrainingManagement/Controllers/OrganizationsController.cs @@ -70,8 +70,47 @@ public class OrganizationsController : BaseApiController [HttpDelete("{id}")] public async Task 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 }); + } + } + + /// + /// 获取组织关联的账户列表 + /// + [HttpGet("{id}/accounts")] + public async Task 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); } /// @@ -108,4 +147,24 @@ public class OrganizationsController : BaseApiController return Ok(new { message = "账户创建成功", username = account.Username }); } + + /// + /// 删除账户 + /// + [HttpDelete("{organizationId}/accounts/{accountId}")] + public async Task 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 = "账户删除成功" }); + } } diff --git a/src/MilitaryTrainingManagement/Services/Implementations/OrganizationService.cs b/src/MilitaryTrainingManagement/Services/Implementations/OrganizationService.cs index 95854bb..9c09799 100644 --- a/src/MilitaryTrainingManagement/Services/Implementations/OrganizationService.cs +++ b/src/MilitaryTrainingManagement/Services/Implementations/OrganizationService.cs @@ -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(); } diff --git a/src/frontend/src/api/organizations.ts b/src/frontend/src/api/organizations.ts index edd0131..27ed786 100644 --- a/src/frontend/src/api/organizations.ts +++ b/src/frontend/src/api/organizations.ts @@ -33,5 +33,14 @@ export const organizationsApi = { async createAccount(organizationId: number, accountData: { username: string; password: string }): Promise { await apiClient.post(`/organizations/${organizationId}/accounts`, accountData) + }, + + async getAccounts(organizationId: number): Promise { + const response = await apiClient.get(`/organizations/${organizationId}/accounts`) + return response.data + }, + + async deleteAccount(organizationId: number, accountId: number): Promise { + await apiClient.delete(`/organizations/${organizationId}/accounts/${accountId}`) } } diff --git a/src/frontend/src/views/organizations/OrganizationList.vue b/src/frontend/src/views/organizations/OrganizationList.vue index b5bf0db..e5f553d 100644 --- a/src/frontend/src/views/organizations/OrganizationList.vue +++ b/src/frontend/src/views/organizations/OrganizationList.vue @@ -27,7 +27,7 @@ {{ formatDate(row.createdAt) }} - + @@ -80,6 +81,43 @@ 创建 + + + +
+ {{ selectedOrg.name }} +
+ + + + + + + + + + + + + + + + + + +
@@ -94,11 +132,14 @@ import { OrganizationalLevel } from '@/types' const organizations = ref([]) const showCreateDialog = ref(false) const showAccountDialog = ref(false) +const showAccountsDialog = ref(false) const editingOrg = ref(null) const parentOrg = ref(null) const selectedOrg = ref(null) const saving = ref(false) const savingAccount = ref(false) +const loadingAccounts = ref(false) +const accounts = ref([]) const formRef = ref() const accountFormRef = ref() @@ -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('确定要删除该组织吗?', '确认删除', {