{"record":{"id":"768b1e7180ff8de6","repo":"jeecgboot/JeecgBoot","slug":"error-768b1e","errorCode":null,"errorMessage":"离职失败，租户不存在","messagePattern":"离职失败，租户不存在","errorType":"exception","errorClass":"JeecgBootException","httpStatus":null,"severity":"error","filePath":"jeecg-boot/jeecg-module-system/jeecg-system-biz/src/main/java/org/jeecg/modules/system/service/impl/SysUserServiceImpl.java","lineNumber":957,"sourceCode":"\t\tloginUser.setOrgId(this.getDepartIdByOrCode(sysUser.getOrgCode()));\n\t\t// 查询当前登录用户的角色code（多个逗号分割）\n\t\tloginUser.setRoleCode(this.getJoinRoleCodeByUserId(sysUser.getId()));\n\t\treturn loginUser;\n\t}\n\n    @Override\n    @CacheEvict(value={CacheConstant.SYS_USERS_CACHE}, allEntries=true)\n    @Transactional(rollbackFor = Exception.class)\n    public void userQuit(String username) {\n        SysUser sysUser = userMapper.getUserByName(username);\n        if(null == sysUser){\n            throw new JeecgBootException(\"离职失败，该用户已不存在\");\n        }\n\t\t// 代码逻辑说明: [QQYUN-3951]租户用户离职重构------------\n\t\tint tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\n\t\t//更新用户租户表的状态为离职状态\n\t\tif(tenantId==0){\n\t\t\tthrow new JeecgBootException(\"离职失败，租户不存在\");\n\t\t}\n\t\tLambdaQueryWrapper<SysUserTenant> query = new LambdaQueryWrapper<>();\n\t\tquery.eq(SysUserTenant::getUserId,sysUser.getId());\n\t\tquery.eq(SysUserTenant::getTenantId,tenantId);\n\t\tSysUserTenant userTenant = new SysUserTenant();\n\t\tuserTenant.setStatus(CommonConstant.USER_TENANT_QUIT);\n\t\tuserTenantMapper.update(userTenant,query);\n    }\n\n    @Override\n    public List<SysUser> getQuitList(Integer tenantId) {\n        return userMapper.getTenantQuitList(tenantId);\n    }\n\n    @Override\n    public void updateStatusAndFlag(List<String> userIds, SysUser sysUser) {\n        userMapper.updateStatusAndFlag(userIds,sysUser);\n    }","sourceCodeStart":939,"sourceCodeEnd":975,"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/SysUserServiceImpl.java#L939-L975","documentation":"Thrown by SysUserServiceImpl.userQuit when TenantContext.getTenant() resolves to 0 (default/empty). Quitting requires a tenant context because it updates sys_user_tenant status to USER_TENANT_QUIT for that tenant.","triggerScenarios":"userQuit invoked with no tenant in the request header/context (TenantContext.getTenant returns null or '0', oConvertUtils.getInt defaults to 0).","commonSituations":"The X-Tenant-Id header / tenant context was not set (e.g. admin backdoor without tenant header); the interceptor that sets TenantContext was bypassed; the user is genuinely non-tenant and quit is not supported; token filter dropped tenant info.","solutions":["Ensure the tenant context header is set on the request before calling userQuit.","Verify the tenant interceptor/filter populates TenantContext for this route.","If the user truly has no tenant, quit is not the right operation - use account deletion instead.","Confirm TenantContext.getTenant() returns the intended tenant id, not the default 0."],"exampleFix":"// before: no tenant header\nuserService.userQuit(username); // tenantId==0 -> throws\n\n// after: set tenant context (interceptor) or pass explicitly\nTenantContext.setTenant(String.valueOf(targetTenantId));\nuserService.userQuit(username);","handlingStrategy":"validation","validationCode":"int tenantId = oConvertUtils.getInt(TenantContext.getTenant(), 0);\nif (tenantId == 0) return Result.error(\"缺少租户上下文\");\nuserService.userQuit(username);","typeGuard":"boolean hasTenantContext() {\n  return oConvertUtils.getInt(TenantContext.getTenant(), 0) != 0;\n}","tryCatchPattern":"try { userService.userQuit(username); }\ncatch (JeecgBootException e) {\n  if (e.getMessage().contains(\"租户不存在\")) return Result.error(\"请设置租户标识后重试\");\n  throw e;\n}","preventionTips":["Ensure the tenant interceptor sets TenantContext for quit routes.","Send the X-Tenant-Id header from the client.","Reject quit for genuinely non-tenant contexts."],"tags":["tenant","context","user-management"],"backgroundTag":null,"analyzedSha":"96fb33f5ec68516da0b0147da06b2eb0419e063a","analyzedAt":"2026-08-14T00:04:16.786Z","schemaVersion":2},"datasetVersion":"2026-08-14T00:17:13.853Z"}