连级别

This commit is contained in:
18631081161 2026-01-17 00:37:13 +08:00
parent de9592be03
commit 27992efca2
3 changed files with 71 additions and 20 deletions

View File

@ -513,7 +513,7 @@ public class PersonnelController : BaseApiController
/// 审批人员
/// </summary>
[HttpPost("{id}/approve")]
[Authorize(Policy = "RegimentLevel")] // 团级及以上权限
[Authorize(Policy = "BattalionLevel")] // 营级及以上权限
public async Task<IActionResult> Approve(int id)
{
var unitId = GetCurrentUnitId();
@ -547,7 +547,7 @@ public class PersonnelController : BaseApiController
/// 拒绝人员
/// </summary>
[HttpPost("{id}/reject")]
[Authorize(Policy = "RegimentLevel")] // 团级及以上权限
[Authorize(Policy = "BattalionLevel")] // 营级及以上权限
public async Task<IActionResult> Reject(int id, [FromBody] RejectPersonnelRequest request)
{
var userId = GetCurrentUserId();

View File

@ -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;

View File

@ -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
// = + 11
const personnelLevelNum = {
'Division': 1,
'Regiment': 2,
'Battalion': 3,
'Company': 4
}[person.approvedLevel || 'Company'] || 4
const upgradeByUnitLevel = personnelLevelNum - 1 //
return userLevelNum < upgradeByUnitLevel
// = - 11
// (3)(2)(1)
const upgradeByUnitLevel = personnelLevelNum - 1
//
// (1)(2)(1)
// userLevelNum <= upgradeByUnitLevel
return userLevelNum <= upgradeByUnitLevel
}
//