diff --git a/backend/src/main/java/com/designhub/service/DepartmentService.java b/backend/src/main/java/com/designhub/service/DepartmentService.java index 6e16da4..be8ed4f 100644 --- a/backend/src/main/java/com/designhub/service/DepartmentService.java +++ b/backend/src/main/java/com/designhub/service/DepartmentService.java @@ -169,15 +169,22 @@ public class DepartmentService { Long parentId = request.getParentId(); existDept.setParentId(parentId == 0 ? null : parentId); } - // 处理leaderId:允许设置为0或null来清除负责人 - // 注意:由于Java JSON反序列化中无法区分字段不存在和字段为null - // 如果前端发送null,这里会收到null,可以设置为null来清除 - // 如果前端发送0,这里会收到0,也可以设置为null来清除 + // 处理leaderId:前端总是发送leaderId字段 + // null表示清除负责人,非null数字表示设置负责人 + // 由于无法区分字段不存在和字段为null,前端必须总是发送此字段 + // 如果前端不发送字段,这里getLeaderId()也会返回null,但不会更新(保持原值) + // 为了支持清除,我们检查:如果leaderId字段在请求中存在(通过检查其他必填字段),则处理 + // 简化方案:总是检查leaderId,如果为null且当前有值,则清除;如果为数字,则设置 + // 但由于无法判断字段是否存在,我们采用:如果leaderId不为null,则更新 if (request.getLeaderId() != null) { Long leaderId = request.getLeaderId(); existDept.setLeaderId(leaderId == 0 ? null : leaderId); + } else if (request.getDeptName() != null) { + // 如果其他字段被更新(说明这是完整的更新请求),且leaderId为null,则清除负责人 + // 这是一个启发式判断:如果请求包含deptName(通常是必填字段),则认为leaderId=null是明确的清除操作 + existDept.setLeaderId(null); } - // 注意:如果前端不发送leaderId字段(undefined),这里不会处理,保持原值不变 + // 否则(leaderId为null且没有其他字段更新),不处理leaderId,保持原值 if (request.getSortOrder() != null) { existDept.setSortOrder(request.getSortOrder()); } diff --git a/frontend/src/views/Settings.vue b/frontend/src/views/Settings.vue index 8d03646..d24f6dd 100644 --- a/frontend/src/views/Settings.vue +++ b/frontend/src/views/Settings.vue @@ -2133,8 +2133,9 @@ const buildDepartmentPayload = (includeInitial: boolean): DepartmentPayload => { deptName: formData.department.deptName, deptCode: formData.department.deptCode, deptType: formData.department.deptType, - parentId: formData.department.parentId ?? 0, - leaderId: formData.department.leaderId ?? null, // 使用null而不是undefined,确保可以清除负责人 + parentId: formData.department.parentId ?? 0, + // leaderId: 总是发送字段,null表示清除,数字表示设置 + leaderId: formData.department.leaderId ?? null, sortOrder: formData.department.sortOrder, status: formData.department.status, allowedDemandTypes: isReceivingDept.value ? formData.department.allowedDemandTypes : [],