diff --git a/src/main/java/com/rj/entity/LbDepartmentUser.java b/src/main/java/com/rj/entity/LbDepartmentUser.java index cbbb1f5..a8d2936 100644 --- a/src/main/java/com/rj/entity/LbDepartmentUser.java +++ b/src/main/java/com/rj/entity/LbDepartmentUser.java @@ -56,7 +56,7 @@ public class LbDepartmentUser implements Serializable { private String industry; @TableField("org_chain") - @Schema(description = "上级链条(从直接上级到根上级,逗号分隔的用户ID)") + @Schema(description = "上级链条(从直接上级到根上级,节点内 id,name,phone 逗号分隔,节点间 -> 连接)") private String orgChain; @TableField("join_date") diff --git a/src/main/java/com/rj/service/impl/LbDepartmentUserServiceImpl.java b/src/main/java/com/rj/service/impl/LbDepartmentUserServiceImpl.java index f1bab28..d8ab0f2 100644 --- a/src/main/java/com/rj/service/impl/LbDepartmentUserServiceImpl.java +++ b/src/main/java/com/rj/service/impl/LbDepartmentUserServiceImpl.java @@ -513,8 +513,11 @@ public class LbDepartmentUserServiceImpl extends ServiceImplid,name,phone->...(节点内逗号分隔,节点间箭头连接) */ private String buildOrgChain(Long userId, Map userById) { LbUser current = userById.get(userId); @@ -522,21 +525,52 @@ public class LbDepartmentUserServiceImpl extends ServiceImpl chain = new ArrayList<>(); + List nodes = new ArrayList<>(); Set visited = new HashSet<>(); Long pid = current.getPid(); while (pid != null && pid > 0) { if (!visited.add(pid)) { break; } - chain.add(String.valueOf(pid)); - LbUser parent = userById.get(pid); - if (parent == null) { - break; + Long currentPid = pid; + LbUser parent = userById.get(currentPid); + String name; + String phone; + if (parent != null) { + name = sanitizeOrgChainField(resolveDisplayName(parent)); + phone = sanitizeOrgChainField(parent.getMobile()); + pid = parent.getPid(); + } else { + name = ""; + phone = ""; + pid = null; } - pid = parent.getPid(); + nodes.add(formatOrgChainNode(currentPid, name, phone)); } - return chain.isEmpty() ? null : String.join(",", chain); + return nodes.isEmpty() ? null : String.join(ORG_CHAIN_NODE_SEPARATOR, nodes); + } + + /** + * 节点格式:id;有 name/phone 时才追加逗号,避免末尾出现多余的 , 或 ,, + */ + private static String formatOrgChainNode(Long currentPid, String name, String phone) { + StringBuilder sb = new StringBuilder(String.valueOf(currentPid)); + if (!name.isEmpty()) { + sb.append(',').append(name); + } + if (!phone.isEmpty()) { + sb.append(',').append(phone); + } + return sb.toString(); + } + + private static String sanitizeOrgChainField(String value) { + if (value == null) { + return ""; + } + return value.trim() + .replace(",", "") + .replace(ORG_CHAIN_NODE_SEPARATOR, ""); } private String resolveDisplayName(LbUser user) { diff --git a/src/main/sql/lb_department_user_alter_add_org_chain.sql b/src/main/sql/lb_department_user_alter_add_org_chain.sql index 1af5547..bae4d51 100644 --- a/src/main/sql/lb_department_user_alter_add_org_chain.sql +++ b/src/main/sql/lb_department_user_alter_add_org_chain.sql @@ -1,2 +1,2 @@ ALTER TABLE `lb_department_user` - ADD COLUMN `org_chain` VARCHAR(2000) DEFAULT NULL COMMENT '上级链条(从直接上级到根上级,逗号分隔的用户ID)' AFTER `industry`; + ADD COLUMN `org_chain` VARCHAR(2000) DEFAULT NULL COMMENT '上级链条(从直接上级到根上级,节点内 id,name,phone 逗号分隔,节点间 -> 连接)' AFTER `industry`;