{"record":{"id":"fcd77f3a3babcb18","repo":"jeecgboot/JeecgBoot","slug":"realnames","errorCode":null,"errorMessage":"{realnames}已存在该职位中","messagePattern":"(.+?)已存在该职位中","errorType":"exception","errorClass":"JeecgBootException","httpStatus":null,"severity":"warning","filePath":"jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserPositionServiceImpl.java","lineNumber":66,"sourceCode":"            //获取成员是否存在于职位中\n            Long count = sysUserPositionMapper.getUserPositionCount(userId, positionId);\n            if (count == 0) {\n                //插入到用户职位关系表里面\n                SysUserPosition userPosition = new SysUserPosition();\n                userPosition.setPositionId(positionId);\n                userPosition.setUserId(userId);\n                sysUserPositionMapper.insert(userPosition);\n            } else {\n                userBuilder.append(userId).append(SymbolConstant.COMMA);\n            }\n        }\n        //如果用户id存在，说明已存在用户职位关系表中,提示用户已存在\n        String uIds = userBuilder.toString();\n        if (oConvertUtils.isNotEmpty(uIds)) {\n            //查询用户列表\n            List<SysUser> sysUsers = userMapper.selectBatchIds(Arrays.asList(uIds.split(SymbolConstant.COMMA)));\n            String realnames = sysUsers.stream().map(SysUser::getRealname).collect(Collectors.joining(SymbolConstant.COMMA));\n            throw new JeecgBootException(realnames + \"已存在该职位中\");\n        }\n    }\n\n    @Override\n    public void removeByPositionId(String positionId) {\n        sysUserPositionMapper.removeByPositionId(positionId);\n    }\n\n    @Override\n    public void removePositionUser(String userIds, String positionId) {\n        String[] userIdArray = userIds.split(SymbolConstant.COMMA);\n\t\tsysUserPositionMapper.removePositionUser(Arrays.asList(userIdArray),positionId);\n    }\n\n}\n","sourceCodeStart":48,"sourceCodeEnd":82,"githubUrl":"https://github.com/jeecgboot/JeecgBoot/blob/96fb33f5ec68516da0b0147da06b2eb0419e063a/jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserPositionServiceImpl.java#L48-L82","documentation":"Thrown by SysUserPositionServiceImpl when batch-adding users to a position. It collects userIds that already have a user-position row into userBuilder, then resolves their realnames and reports which users are already in the position.","triggerScenarios":"POST to add-user-to-position with a userIds list containing one or more userIds that already exist in sys_user_position for the given positionId.","commonSituations":"Admin re-adds users already in the position; a previous add partially succeeded and was retried; duplicate userIds in the request; stale client-side state showing users as not-yet-added.","solutions":["Filter the request client-side to exclude userIds already in the position before submitting.","On the server, treat already-present as idempotent success instead of error if business allows.","Check the returned realnames against the intended add list and retry with only the missing users.","Remove duplicate userIds from the request payload."],"exampleFix":"// before: server throws on any existing user\naddUsersToPosition(allUserIds, positionId);\n\n// after: pre-filter existing members\nList<String> existing = userPositionMapper.selectExistingUserIds(positionId);\nList<String> toAdd = allUserIds.stream().filter(id -> !existing.contains(id)).collect(toList());\naddUsersToPosition(toAdd, positionId);","handlingStrategy":"validation","validationCode":"List<String> existing = userPositionMapper.selectExistingUserIds(positionId);\nList<String> toAdd = userIds.stream().filter(id -> !existing.contains(id)).collect(Collectors.toList());\nif (toAdd.isEmpty()) return Result.ok(\"无新增用户\");","typeGuard":"boolean hasNewMembers(List<String> userIds, String positionId) {\n  List<String> existing = userPositionMapper.selectExistingUserIds(positionId);\n  return userIds.stream().anyMatch(id -> !existing.contains(id));\n}","tryCatchPattern":"try { userPositionService.addUsers(userIds, positionId); }\ncatch (JeecgBootException e) {\n  if (e.getMessage().contains(\"已存在该职位\")) return Result.ok(\"部分用户已存在: \" + e.getMessage());\n  throw e;\n}","preventionTips":["Filter out existing members client-side before submit.","Refresh the position's member list after each add.","Consider idempotent semantics for re-adds."],"tags":["user-position","validation","duplicate"],"backgroundTag":null,"analyzedSha":"96fb33f5ec68516da0b0147da06b2eb0419e063a","analyzedAt":"2026-08-14T00:04:16.786Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}