flipped-aurora/gin-vue-admin · warning
primaryDeptId %d 必须属于合并后的部门集合 %v
Error message
primaryDeptId %d 必须属于合并后的部门集合 %v
What it means
Validation error thrown by org_member_assigner Handle when the explicitly requested primaryDeptId is not a member of the final merged department set. The tool refuses to set a user's primary department to one they would not belong to after the merge of current and new department IDs, because the upstream setUserDepartments API would reject or inconsistently store such a primary.
Source
Thrown at server/mcp/org_member_assigner.go:155
UserID: user.ID,
UserName: user.Username,
}
var messages []string
if len(deptIDs) > 0 {
merged, added := mergeUintSets(currentDeptIDs, deptIDs)
// 主部门语义:显式传参优先,否则保留用户现有主部门;上游对 0 值取集合首个
primary := user.DeptId
if value, ok := args["primaryDeptId"]; ok && value != nil {
explicit, err := parseUintParam(value, "primaryDeptId")
if err != nil {
return nil, err
}
primary = explicit
}
if primary != 0 && !containsUint(merged, primary) {
return nil, fmt.Errorf("primaryDeptId %d 必须属于合并后的部门集合 %v", primary, merged)
}
if len(added) > 0 || (primary != user.DeptId && primary != 0) {
if _, err := postUpstream[map[string]any](ctx, "/user/setUserDepartments", map[string]any{
"ID": user.ID,
"deptIds": merged,
"primaryDeptId": primary,
}); err != nil {
return nil, fmt.Errorf("设置用户部门失败: %w", err)
}
messages = append(messages, fmt.Sprintf("部门新增 %v", added))
} else {
messages = append(messages, "部门均已存在,未写入")
}
result.Departments = &orgAssignChange{Before: currentDeptIDs, After: merged, Added: added}
// 上游对 primaryDeptId=0 取部门集合首个;如实回报生效主部门,不因 0 值被 omitempty 隐去而误导
result.PrimaryDeptID = primary
if primary == 0 && len(merged) > 0 {View on GitHub (pinned to 3136500ef3)
Solutions
- Add the primaryDeptId value to the deptIDs array in the same tool call so it lands in the merged set
- Use primaryDeptId=0 (or omit it) to keep the user's existing primary department
- Verify the department ID exists via the org query tool and re-check for typos
Example fix
// before
{"userId": 5, "deptIds": [2,3], "primaryDeptId": 9}
// after
{"userId": 5, "deptIds": [2,3,9], "primaryDeptId": 9} Defensive patterns
Strategy: validation
Validate before calling
func canAssign(deptIDs, merged []uint, primaryDeptId uint) error {
if primaryDeptId == 0 {
return nil
}
for _, id := range merged {
if id == primaryDeptId {
return nil
}
}
return fmt.Errorf("primaryDeptId %d not in merged dept set %v", primaryDeptId, merged)
} Prevention
- Always include primaryDeptId in the deptIDs array of the same call
- Pass primaryDeptId=0 when you do not intend to change the primary department
- Look up department IDs with the org query tool instead of hardcoding them
When it happens
Trigger: Calling the org member assign MCP tool with a primaryDeptId that is neither among the user's existing deptIds nor in the deptIDs being added, while primaryDeptId != 0.
Common situations: Typo or stale department ID from a deleted dept; passing a parent/ancestor department expecting implicit membership; forgetting to include the primary dept in the deptIDs list of the same call.
Related errors
AI-assisted analysis of flipped-aurora/gin-vue-admin@3136500ef3 (2026-08-31).
Data as JSON: /api/errors/4aa1580426398494.
Report an issue: GitHub.