修复工作人员资质关联与角色过滤

按安装、配送、运维菜单显式过滤工作人员,锁定资质所有者并使用姓名和角色回显。

扩展工作人员状态与多角色查询,补充权限校验、回归测试、操作日志和项目文档。
This commit is contained in:
czl231
2026-08-11 19:15:53 +08:00
parent 4b1f045806
commit 74c5e34275
20 changed files with 976 additions and 100 deletions

View File

@@ -149,9 +149,11 @@ func platformScopedRequestAllowed(ctx *gin.Context, menus []platformbase.Menu) b
return hasMenuIdentity(menus, "staff_add")
}
if ctx.Request.Method == "GET" {
required := staffMenuIdentity(ctx.Query("role_code"))
return required != "" && (hasMenuIdentity(menus, required) ||
(required == "staff_delivery" && hasMenuIdentity(menus, "gasorder_basic")))
return staffListRolesAllowed(
menus,
ctx.Query("role_code"),
ctx.Query("role_codes"),
)
}
return false
}
@@ -217,6 +219,33 @@ func staffMenuIdentity(roleCode string) string {
}
}
// staffListRolesAllowed 要求查询中的每一种工作人员角色都具备对应菜单权限。
func staffListRolesAllowed(menus []platformbase.Menu, roleCode, roleCodes string) bool {
roleCode = strings.TrimSpace(roleCode)
roleCodes = strings.TrimSpace(roleCodes)
if (roleCode == "") == (roleCodes == "") {
return false
}
requested := []string{roleCode}
if roleCodes != "" {
requested = strings.Split(roleCodes, ",")
}
seen := map[string]bool{}
for _, role := range requested {
role = strings.TrimSpace(role)
required := staffMenuIdentity(role)
if required == "" || seen[role] {
return false
}
seen[role] = true
if !hasMenuIdentity(menus, required) &&
!(required == "staff_delivery" && hasMenuIdentity(menus, "gasorder_basic")) {
return false
}
}
return true
}
func hasMenuIdentity(menus []platformbase.Menu, identity string) bool {
for _, menu := range menus {
if menu.Identity == identity {

View File

@@ -76,3 +76,31 @@ func TestLocationScopeValuesAreExplicit(t *testing.T) {
t.Fatal("ambiguous location scope was accepted")
}
}
func TestStaffListMultiRoleQueryRequiresEveryRoleMenu(t *testing.T) {
allMenus := []platformbase.Menu{
{Identity: "staff_installer"},
{Identity: "staff_delivery"},
{Identity: "staff_operations"},
}
if !staffListRolesAllowed(allMenus, "", "installer,delivery,operations") {
t.Fatal("authorized multi-role staff query was rejected")
}
partialMenus := []platformbase.Menu{{Identity: "staff_installer"}}
if staffListRolesAllowed(partialMenus, "", "installer,delivery,operations") {
t.Fatal("partial staff permission granted a multi-role query")
}
if staffListRolesAllowed(allMenus, "delivery", "installer,delivery") {
t.Fatal("ambiguous staff role filters were accepted")
}
}
func TestOrderMenuCanOnlyQueryDeliveryStaff(t *testing.T) {
menus := []platformbase.Menu{{Identity: "gasorder_basic"}}
if !staffListRolesAllowed(menus, "delivery", "") {
t.Fatal("order management could not query delivery staff")
}
if staffListRolesAllowed(menus, "installer", "") {
t.Fatal("order management could query installer staff")
}
}