From 27992efca2da328db5ff511d9457e2d3c8ba8b1c Mon Sep 17 00:00:00 2001 From: 18631081161 <2088094923@qq.com> Date: Sat, 17 Jan 2026 00:37:13 +0800 Subject: [PATCH] =?UTF-8?q?=E8=BF=9E=E7=BA=A7=E5=88=AB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../Controllers/PersonnelController.cs | 4 +- .../Implementations/PersonnelService.cs | 64 +++++++++++++++---- .../src/views/personnel/PersonnelList.vue | 23 +++++-- 3 files changed, 71 insertions(+), 20 deletions(-) diff --git a/src/MilitaryTrainingManagement/Controllers/PersonnelController.cs b/src/MilitaryTrainingManagement/Controllers/PersonnelController.cs index 396af82..2099df4 100644 --- a/src/MilitaryTrainingManagement/Controllers/PersonnelController.cs +++ b/src/MilitaryTrainingManagement/Controllers/PersonnelController.cs @@ -513,7 +513,7 @@ public class PersonnelController : BaseApiController /// 审批人员 /// [HttpPost("{id}/approve")] - [Authorize(Policy = "RegimentLevel")] // 团级及以上权限 + [Authorize(Policy = "BattalionLevel")] // 营级及以上权限 public async Task Approve(int id) { var unitId = GetCurrentUnitId(); @@ -547,7 +547,7 @@ public class PersonnelController : BaseApiController /// 拒绝人员 /// [HttpPost("{id}/reject")] - [Authorize(Policy = "RegimentLevel")] // 团级及以上权限 + [Authorize(Policy = "BattalionLevel")] // 营级及以上权限 public async Task Reject(int id, [FromBody] RejectPersonnelRequest request) { var userId = GetCurrentUserId(); diff --git a/src/MilitaryTrainingManagement/Services/Implementations/PersonnelService.cs b/src/MilitaryTrainingManagement/Services/Implementations/PersonnelService.cs index 67559f2..3148fd2 100644 --- a/src/MilitaryTrainingManagement/Services/Implementations/PersonnelService.cs +++ b/src/MilitaryTrainingManagement/Services/Implementations/PersonnelService.cs @@ -672,13 +672,30 @@ public class PersonnelService : IPersonnelService if (requestByUnit == null) throw new ArgumentException("申报单位不存在"); - // 验证申报单位必须是当前审批单位 - if (personnel.ApprovedByUnitId != requestByUnitId) - throw new ArgumentException("只有当前审批单位才能发起向上申报"); - // 师级人才不能再向上申报 if (personnel.ApprovedLevel == PersonnelLevel.Division) throw new ArgumentException("师级人才不能再向上申报"); + + // 特殊情况:师部可以直接升级团级人才为师级 + // 此时师部既是申报单位也是审批单位 + if (requestByUnit.Level == OrganizationalLevel.Division && + personnel.ApprovedLevel == PersonnelLevel.Regiment) + { + // 师部直接升级团级人才,不需要验证是否是审批单位 + // 标记为待向上申报(由师部自己审批) + personnel.PendingUpgradeByUnitId = requestByUnitId; + + await _context.SaveChangesAsync(); + + _logger.LogInformation("团级人才 {PersonnelId} 已由师部 {UnitId} 发起直接升级请求", + personnelId, requestByUnitId); + + return personnel; + } + + // 验证申报单位必须是当前审批单位 + if (personnel.ApprovedByUnitId != requestByUnitId) + throw new ArgumentException("只有当前审批单位才能发起向上申报"); // 标记为待向上申报 personnel.PendingUpgradeByUnitId = requestByUnitId; @@ -711,16 +728,37 @@ public class PersonnelService : IPersonnelService var approvedByUnit = await _context.OrganizationalUnits.FindAsync(approvedByUnitId); if (approvedByUnit == null) throw new ArgumentException("审批单位不存在"); - - // 验证审批单位必须是申报单位的上级 - var isParent = await _organizationService.IsParentUnitAsync(approvedByUnitId, personnel.PendingUpgradeByUnitId.Value); - if (!isParent) - throw new ArgumentException("审批单位必须是申报单位的上级"); - - var previousLevel = personnel.ApprovedLevel; - // 人才等级升级为申报单位的等级 - var newLevel = (PersonnelLevel)(int)personnel.PendingUpgradeByUnit!.Level; + _logger.LogInformation("ApproveUpgrade: personnelId={PersonnelId}, approvedByUnitId={ApprovedByUnitId}, pendingUpgradeByUnitId={PendingUpgradeByUnitId}, approvedByUnitLevel={Level}, personnelApprovedLevel={PersonnelLevel}", + personnelId, approvedByUnitId, personnel.PendingUpgradeByUnitId.Value, approvedByUnit.Level, personnel.ApprovedLevel); + + var previousLevel = personnel.ApprovedLevel; + PersonnelLevel newLevel; + + // 特殊情况:师部直接升级团级人才为师级 + var isDivisionUnit = approvedByUnit.Level == OrganizationalLevel.Division; + var isRegimentPersonnel = personnel.ApprovedLevel == PersonnelLevel.Regiment; + + _logger.LogInformation("检查条件: isDivisionUnit={IsDivision}, isRegimentPersonnel={IsRegiment}", + isDivisionUnit, isRegimentPersonnel); + + if (isDivisionUnit && isRegimentPersonnel) + { + // 师部直接升级团级人才为师级 + newLevel = PersonnelLevel.Division; + _logger.LogInformation("师部直接升级团级人才为师级"); + } + else + { + // 验证审批单位必须是申报单位的上级 + var isParent = await _organizationService.IsParentUnitAsync(approvedByUnitId, personnel.PendingUpgradeByUnitId.Value); + _logger.LogInformation("检查上级关系: isParent={IsParent}", isParent); + if (!isParent) + throw new ArgumentException("审批单位必须是申报单位的上级"); + + // 人才等级升级为申报单位的等级 + newLevel = (PersonnelLevel)(int)personnel.PendingUpgradeByUnit!.Level; + } personnel.ApprovedLevel = newLevel; personnel.ApprovedByUnitId = approvedByUnitId; diff --git a/src/frontend/src/views/personnel/PersonnelList.vue b/src/frontend/src/views/personnel/PersonnelList.vue index 432f1e7..23cd755 100644 --- a/src/frontend/src/views/personnel/PersonnelList.vue +++ b/src/frontend/src/views/personnel/PersonnelList.vue @@ -283,29 +283,42 @@ function canUpgrade(person: Personnel): boolean { // 2. 不是师级人才(师级不能再向上) // 3. 没有待处理的向上申报请求 // 4. 当前用户是审批单位(可以发起向上申报) + // 或者:师部可以直接升级团级人才 if (!authStore.user || !person.approvedLevel || !person.approvedByUnitId) return false if (person.approvedLevel === PersonnelLevel.Division) return false if (person.pendingUpgradeByUnitId) return false // 已有待处理的向上申报 // 当前用户单位是审批单位,可以发起向上申报 - return person.approvedByUnitId === authStore.user.organizationalUnitId + if (person.approvedByUnitId === authStore.user.organizationalUnitId) return true + + // 特殊情况:师部可以直接升级团级人才为师级 + if (authStore.organizationalLevelNum === 1 && person.approvedLevel === PersonnelLevel.Regiment) { + return true + } + + return false } // 判断是否可以审批向上申报请求 function canApproveUpgrade(person: Personnel): boolean { if (!authStore.user || !person.pendingUpgradeByUnitId) return false - // 用户单位层级必须高于申报单位层级 + const userLevelNum = authStore.organizationalLevelNum - // 申报单位层级 = 人员等级 + 1(因为审批单位比人员等级高1级) const personnelLevelNum = { 'Division': 1, 'Regiment': 2, 'Battalion': 3, 'Company': 4 }[person.approvedLevel || 'Company'] || 4 - const upgradeByUnitLevel = personnelLevelNum - 1 // 申报单位层级 - return userLevelNum < upgradeByUnitLevel + // 申报单位层级 = 人员等级 - 1(因为审批单位比人员等级高1级) + // 例如:营级人才(3)由团级(2)申报,师级(1)审批 + const upgradeByUnitLevel = personnelLevelNum - 1 + + // 用户单位层级必须高于申报单位层级(数值越小层级越高) + // 特殊情况:师部(1)可以直接升级团级人才(2)为师级,此时申报单位也是师部(1) + // 所以需要 userLevelNum <= upgradeByUnitLevel + return userLevelNum <= upgradeByUnitLevel } // 判断是否可以审批该人员