From e4edbef9e226afcc6cd4b96137880dabfe41f7b7 Mon Sep 17 00:00:00 2001 From: doublex001 <16157008+doublex001@user.noreply.gitee.com> Date: Mon, 28 Sep 2026 16:55:37 +0800 Subject: [PATCH] =?UTF-8?q?chore:=20=E8=81=94=E8=B0=83=E5=AE=A1=E8=AE=A1?= =?UTF-8?q?=E8=84=9A=E6=9C=AC=E4=B8=8E=20OpenAPI=20=E5=BF=AB=E7=85=A7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - openapi.json:后端 OpenAPI 3.1.0 完整快照(182 路径/220 path-methods),作为路径校正唯一准绳 - transform_api.py:89 函数路径批量校正(ALIGNED/WRONG→REAL/PHANTOM 分类 + 幽灵域折叠为 mock-only) - live_validate.py:测试号实机验证脚本(登录取 token 后逐一打真实路径) - gen_correction_map.py/audit_all_paths.py/extract_docx.py/openapi_paths.py:审计与文档提取辅助 - 排除 api.ts.bak 及探索性脚本 --- scripts/audit_all_paths.py | 83 +++++++++++++++ scripts/docx_text.txt | 119 +++++++++++++++++++++ scripts/extract_docx.py | 36 +++++++ scripts/gen_correction_map.py | 156 ++++++++++++++++++++++++++++ scripts/live_validate.py | 76 ++++++++++++++ scripts/openapi.json | 1 + scripts/openapi_paths.py | 20 ++++ scripts/transform_api.py | 188 ++++++++++++++++++++++++++++++++++ 8 files changed, 679 insertions(+) create mode 100644 scripts/audit_all_paths.py create mode 100644 scripts/docx_text.txt create mode 100644 scripts/extract_docx.py create mode 100644 scripts/gen_correction_map.py create mode 100644 scripts/live_validate.py create mode 100644 scripts/openapi.json create mode 100644 scripts/openapi_paths.py create mode 100644 scripts/transform_api.py diff --git a/scripts/audit_all_paths.py b/scripts/audit_all_paths.py new file mode 100644 index 0000000..a14790f --- /dev/null +++ b/scripts/audit_all_paths.py @@ -0,0 +1,83 @@ +import json, re + +with open("scripts/openapi.json", encoding="utf-8") as f: + spec = json.load(f) +real_paths = set() +for p, methods in spec.get("paths", {}).items(): + for m in methods: + real_paths.add(p) + +# Load api.ts +with open("src/api/api.ts", encoding="utf-8") as f: + text = f.read() +lines = text.splitlines() + +func_re = re.compile(r"^\s*(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(") +# static literal request path +static_req = re.compile(r"request(?:<[^>]*>)?\(\s*['\"]([^'\"]+)['\"]") +# template literal request path like request(`/x/${..}`) +tmpl_req = re.compile(r"request(?:<[^>]*>)?\(\s*`([^`]*)`") + +cur = None +funcs = {} # name -> {static:[], tmpl:[], dai:bool, line} +for i, ln in enumerate(lines): + m = func_re.match(ln) + if m: + cur = m.group(1) + funcs[cur] = {"static": [], "tmpl": [], "dai": False, "line": i+1} + if cur: + for sm in static_req.finditer(ln): + funcs[cur]["static"].append(sm.group(1)) + for tm in tmpl_req.finditer(ln): + funcs[cur]["tmpl"].append(tm.group(1)) + if "【待确认】" in ln: + funcs[cur]["dai"] = True + +# Determine if a guessed path has ANY real backing (prefix match ignoring method) +def has_real_backing(path): + # exact + if path in real_paths: + return True + # base segment match: first 2 segments + segs = [s for s in path.split("/") if s and not "{" in s and not "$" in s] + if len(segs) >= 1: + base = "/" + segs[0] + if any(rp.startswith(base + "/") or rp == base for rp in real_paths): + return "partial" + return False + +phantom_static = [] +ok_static = [] +partial_static = [] +tmpl_funcs = [] +for name, info in funcs.items(): + if not info["static"] and not info["tmpl"]: + continue + for sp in info["static"]: + b = has_real_backing(sp) + if b is True: + ok_static.append((name, sp)) + elif b == "partial": + partial_static.append((name, sp)) + else: + phantom_static.append((name, sp)) + for tp in info["tmpl"]: + tmpl_funcs.append((name, tp)) + +print("DISTINCT FUNCTIONS WITH request():", sum(1 for n,i in funcs.items() if i["static"] or i["tmpl"])) +print() +print("=== PHANTOM STATIC PATHS (no OpenAPI backing at all) ===") +for n, p in sorted(set(phantom_static)): + dai = "【待确认】" if funcs[n]["dai"] else "(已标'已校正'但仍是幽灵!)" + print(f" {n:42} -> {p:48} {dai}") +print(f"\nPHANTOM count (unique fn-path): {len(set(phantom_static))}") +print(f"OK count: {len(set(ok_static))}") +print(f"PARTIAL count: {len(set(partial_static))}") +print() +print("=== PARTIAL (base domain exists, path differs) ===") +for n, p in sorted(set(partial_static)): + print(f" {n:42} -> {p}") +print() +print("=== TEMPLATE-LITERAL request paths (need manual method check) ===") +for n, p in sorted(set(tmpl_funcs)): + print(f" {n:42} -> {p}") diff --git a/scripts/docx_text.txt b/scripts/docx_text.txt new file mode 100644 index 0000000..8f216a6 --- /dev/null +++ b/scripts/docx_text.txt @@ -0,0 +1,119 @@ +职来后端接口联调说明 +前端开发使用 线上联调环境 2026年9月22日 +结论:前端统一通过 HTTPS 域名访问后端,业务请求前缀为 https://job.youthome.com.cn/api/v1。除注册、登录、短信验证码、刷新 Token 等匿名接口外,其余接口需要在 Authorization 请求头携带 Access Token。 +一 联调地址 + +[TABLE] +用途 | 地址 | 使用说明 +业务接口基地址 | https://job.youthome.com.cn/api/v1 | 前端环境变量中的 API Base URL +健康检查 | https://job.youthome.com.cn/api/v1/health | 返回 code=200 且 data.status=UP 表示后端可用 +OpenAPI JSON | https://job.youthome.com.cn/api/v1/v3/api-docs | Apifox 导入或更新接口定义使用 +WebSocket | wss://job.youthome.com.cn/api/v1/ws | 仅在对应实时功能启用时使用;不要使用 ws:// + + +重要:不要直接请求服务器 IP、Jenkins 地址或 8010 端口。前端、Apifox 和浏览器都统一使用 HTTPS 域名,避免跨域、证书和环境切换问题。 +二 Apifox 配置方法 +在 Apifox 项目中选择导入数据,导入方式选 URL,填写 OpenAPI JSON 地址。 +环境前置 URL 设置为 https://job.youthome.com.cn/api/v1。接口路径本身只保留 /auth/me、/jobs 等相对路径。 +创建环境变量 AuthToken,用登录响应中的 accessToken 赋值。 +需要认证的接口统一设置请求头 Authorization: Bearer {{AuthToken}}。 +接口有调整时重新从 OpenAPI URL 增量导入,不要手工复制旧接口覆盖新定义。 +三 通用请求和响应规则 + +[TABLE] +项目 | 规则 +请求格式 | 普通业务接口使用 application/json;上传简历等文件接口使用 multipart/form-data。 +认证请求头 | Authorization: Bearer 。Refresh Token 不能代替 Access Token 访问业务接口。 +请求追踪 | 可传 X-Request-Id;后端会在响应头和响应体返回 requestId,报错联调时请一并提供。 +时间格式 | 按 OpenAPI 定义发送 ISO 8601 日期或日期时间,不要自行转换为中文日期。 +分页 | 以接口定义中的 page、size 为准;不要在前端假设页码起点。 +响应外层 | 通常为 code、message、data、requestId、timestamp。业务数据读取 data。 + + +Authorization: Bearer {{AuthToken}}Content-Type: application/jsonX-Request-Id: web-20260922-0001 +{ "code": 200, "message": "ok", "data": { }, "requestId": "...", "timestamp": "..."} +四 登录与会话使用顺序 + +[TABLE] +步骤 | 接口 | 前端处理 +1 | POST /auth/sms/send | 按 purpose 发送验证码;purpose 必须使用后端支持的固定值。 +2A | POST /auth/password/login | 手机号和密码登录;成功后保存 accessToken、refreshToken。 +2B | POST /auth/login | 短信验证码登录;现接口文档标为 Mock 登录,生产前端不要作为正式入口,除非产品和后端明确确认。 +3 | GET /auth/me | 登录后拉取用户 id、角色和当前身份信息。 +4 | POST /auth/refresh | Access Token 过期时,用 Refresh Token 换取新 Token。 +5 | POST /auth/logout | 退出登录;成功后清除前端保存的所有 Token 和用户状态。 + + +Token 保存与刷新建议 +Access Token 用于业务请求;Refresh Token 只提交给 /auth/refresh 和会话相关接口。 +遇到 401 时只允许一次串行刷新;刷新成功后重放原请求,刷新失败则清理会话并跳转登录页。 +不要把 Token 打印到控制台、错误上报、URL 查询参数或页面 DOM。 +不同浏览器标签页同时刷新时要加前端互斥,避免多个 Refresh Token 并发重放。 +五 学生 企业 管理员的区别 + +[TABLE] +身份 | 账号产生方式 | 登录方式 | 主要接口前缀 +STUDENT | 现有短信登录流程可自动创建学生账号 | 短信登录或已设置密码后的密码登录 | /profile/me、/applications、/offers、/interviews +COMPANY | POST /auth/company/register 专用注册 | 注册成功直接返回 Token;之后可密码登录 | /companies/me、/company、/jobs +ADMIN | 不提供公开注册,由管理员初始化或后台受控创建 | 使用现有认证方式登录 | /admin + + +前端路由判断:登录成功后以 /auth/me 返回的角色为准。不要让客户端提交 role 来决定身份,也不要仅依据页面入口猜测用户角色。 +六 企业注册与入驻流程 + +[TABLE] +顺序 | 接口 | 预期结果 +1 | POST /auth/sms/send | purpose 使用 company-register,获取企业注册验证码。 +2 | POST /auth/company/register | 提交手机号、验证码、密码和企业基础资料;成功返回 COMPANY Token。 +3 | GET /auth/me | 确认当前角色为 COMPANY。 +4 | GET /companies/me/onboarding | 读取 UNVERIFIED、PENDING、REJECTED 或 VERIFIED,以及 missingFields、allowedActions。 +5 | PUT /companies/me | 根据 missingFields 完善企业资料。 +6 | POST /companies/me/verification | 提交企业认证材料。 +7 | GET /companies/me/onboarding | 刷新聚合状态;前端按钮以 allowedActions 为准。 + + +企业注册请求示例 +POST /auth/company/register{ "phone": "19900000000", "code": "123456", "password": "符合密码策略的密码", "company": { "name": "示例科技有限公司", "industry": "互联网", "description": "企业简介", "website": "https://example.com", "address": "企业地址" }} +注意:客户端不能提交 userId、role、verified 或 passwordHash。注册响应中的 accessToken 和 refreshToken 按普通登录响应处理。 +七 常用业务接口导航 + +[TABLE] +业务模块 | 常用接口 | 认证要求 +公开岗位 | GET /jobs、GET /jobs/{jobId}、GET /jobs/search、GET /jobs/filters | 公开读取;具体以 OpenAPI security 定义为准 +学生资料 | GET/PUT /profile/me、POST/GET/DELETE /profile/me/resume | STUDENT +求职流程 | 投递、面试、Offer、消息等接口 | 登录后按角色和资源归属校验 +企业资料 | GET/PUT /companies/me | COMPANY +企业入驻 | GET /companies/me/onboarding、POST/GET /companies/me/verification | COMPANY +企业岗位 | POST/PUT /jobs 及发布关闭接口 | COMPANY;部分能力可能要求完成认证 +管理员 | /admin 下审核、风控、举报等接口 | ADMIN + + +完整字段、枚举、必填项、响应结构和全部接口以运行时 OpenAPI 为唯一联调依据。本文只提供入口和使用顺序。 +八 常见状态码处理 + +[TABLE] +HTTP | 含义 | 前端建议 +400 | 参数错误、验证码错误或业务输入不合法 | 展示安全业务文案;字段错误定位到表单项。 +401 | 未登录、Token 无效或过期 | 尝试一次刷新;失败后清理会话并回登录页。 +403 | 角色不允许或无资源权限 | 展示无权限页面,不要循环刷新 Token。 +404 | 资源不存在 | 展示资源不存在或返回列表页。 +409 | 账号、状态或并发冲突 | 刷新当前数据后提示用户重新操作。 +429 | 请求过于频繁 | 禁用按钮并显示倒计时,不要立即自动重试。 +500 | 服务内部错误 | 显示通用错误,并上报 requestId。 +503 | 依赖服务不可用或功能暂不可用 | 提示稍后重试,避免高频轮询。 + + +九 前端联调检查清单 +环境 Base URL 仅配置一次,接口路径中不重复拼接 /api/v1。 +登录后 /auth/me 能返回正确角色,Authorization 头格式正确。 +401 刷新流程不会无限循环,403 不触发刷新。 +企业注册先发送 company-register 用途验证码,再调用企业注册接口。 +企业页面从 /companies/me/onboarding 获取状态和 allowedActions,不在前端自行推导认证状态。 +上传接口使用 multipart/form-data,不手动覆盖浏览器生成的 boundary。 +报错时保留 HTTP 状态、业务 code、message、requestId 和请求时间;删除 Token、手机号、验证码及密码后再发给后端排查。 +联调前先访问健康检查;健康为 UP 后再判断具体业务接口问题。 +十 安全和协作约定 +禁止在前端代码、Git、群聊截图或 Apifox 公共变量中保存数据库、Redis、RabbitMQ、Jenkins 密码。 +禁止把 Access Token、Refresh Token、短信验证码和用户密码写入日志或错误上报。 +接口字段调整由后端更新 OpenAPI,前端重新导入;不要以聊天记录替代接口定义。 +需要后端排查时提供:环境、接口、方法、HTTP 状态、业务 code、requestId、发生时间和脱敏请求。 \ No newline at end of file diff --git a/scripts/extract_docx.py b/scripts/extract_docx.py new file mode 100644 index 0000000..da1755a --- /dev/null +++ b/scripts/extract_docx.py @@ -0,0 +1,36 @@ +import zipfile, sys +from xml.etree import ElementTree as ET + +path = "职来后端接口联调说明.docx" +z = zipfile.ZipFile(path) +xml = z.read("word/document.xml").decode("utf-8") + +ns = {"w": "http://schemas.openxmlformats.org/wordprocessingml/2006/main"} +root = ET.fromstring(xml) + +def para_text(p): + texts = [] + for t in p.iter("{http://schemas.openxmlformats.org/wordprocessingml/2006/main}t"): + texts.append(t.text or "") + return "".join(texts) + +body = root.find("w:body", ns) +out = [] +for el in body: + tag = el.tag.split("}")[-1] + if tag == "p": + out.append(para_text(el)) + elif tag == "tbl": + rows = [] + for tr in el.iter("{http://schemas.openxmlformats.org/wordprocessingml/2006/main}tr"): + cells = [para_text(p) for p in tr.iter("{http://schemas.openxmlformats.org/wordprocessingml/2006/main}p")] + rows.append(" | ".join(cells)) + out.append("\n[TABLE]\n" + "\n".join(rows) + "\n") + +full = "\n".join(out) +with open("scripts/docx_text.txt", "w", encoding="utf-8") as f: + f.write(full) +print("TOTAL CHARS:", len(full)) +for i, line in enumerate(out): + if any(k in line for k in ["OpenAPI", "接口", "路径", "endpoint", "/api", "GET", "POST", "§7", "七、"]): + print(f"[{i}] {line[:140]}") diff --git a/scripts/gen_correction_map.py b/scripts/gen_correction_map.py new file mode 100644 index 0000000..a3d5d02 --- /dev/null +++ b/scripts/gen_correction_map.py @@ -0,0 +1,156 @@ +import json, re + +with open("scripts/openapi.json", encoding="utf-8") as f: + spec = json.load(f) +real_paths = set() +real_path_methods = {} +for p, methods in spec.get("paths", {}).items(): + real_paths.add(p) + for m in methods: + real_path_methods.setdefault(p, []).append(m.upper()) + +with open("src/api/api.ts", encoding="utf-8") as f: + lines = f.readlines() + +func_re = re.compile(r"^\s*(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(") +static_req = re.compile(r"request(?:<[^>]*>)?\(\s*['\"]([^'\"]+)['\"]") +tmpl_req = re.compile(r"request(?:<[^>]*>)?\(\s*`([^`]*)`") +dai_re = re.compile(r"【待确认】") + +cur = None +funcs = {} +for i, ln in enumerate(lines): + m = func_re.match(ln) + if m: + cur = m.group(1) + funcs[cur] = {"static": [], "tmpl": [], "dai": False, "line": i+1} + if cur: + for sm in static_req.finditer(ln): + funcs[cur]["static"].append(sm.group(1)) + for tm in tmpl_req.finditer(ln): + funcs[cur]["tmpl"].append(tm.group(1)) + if dai_re.search(ln): + funcs[cur]["dai"] = True + +# Manual real-equivalent judgment for template/partial/path-wrong functions +# value: (verdict, real_path_or_None, note) +manual = { + # template literals - verify + "createJobReview": ("ALIGNED", "POST /jobs/{jobId}/reviews", "路径命中真实契约"), + "fetchEmployeeReviews": ("ALIGNED", "GET /jobs/{jobId}/reviews", "路径命中真实契约"), + "fetchJobDetail": ("ALIGNED", "GET /jobs/{jobId}", "路径命中真实契约"), + "fetchCandidateDetail": ("WRONG->REAL", "/company/candidates/{applicationId}", "前端猜 /enterprise/candidates,真路径在 /company 域"), + "fetchInterviewScore": ("WRONG->REAL", "GET /interviews/{interviewId}/score", "前端猜 /enterprise/interviews,真路径在 /interviews 域"), + "fetchInterviewScoreDraft": ("WRONG->REAL", "PUT /interviews/{interviewId}/score", "真路径无 /draft 子路径,保存草稿用 PUT /interviews/{id}/score"), + "fetchConversation": ("WRONG->REAL", "GET /conversations/{id}", "前端猜 /chat/conversations,真路径 /conversations/{id}"), + "deleteSalaryRecord": ("PHANTOM", None, "无 /salary 域,后端未提供"), + "fetchLegalDocument": ("PHANTOM", None, "无 /legal 域,后端未提供"), + "fetchPrivacyDetailSetting": ("PHANTOM", None, "无 /settings 域,后端未提供"), + "fetchSalaryData": ("PHANTOM", None, "无 /jobs/{id}/salary,后端未提供薪资明细端点"), + "fetchJobOverallScore": ("PHANTOM", None, "无 /jobs/{id}/score,综合分见 /jobs/{id}/competition-ranking 或 /profile/me/candidate-scoring"), + # partial static + "fetchJobPreference": ("WRONG->REAL", "GET/PUT /profile/me/preferences", "前端猜 /profile/me/job-preference,真路径 /profile/me/preferences"), + "saveJobPreference": ("WRONG->REAL", "PUT /profile/me/preferences", "同上"), + "fetchPendingOfferCount": ("PHANTOM", None, "无 /offers/pending/count,可用 /offers/statistics 替代(需确认)"), + "fetchRankData": ("WRONG->REAL", "GET /jobs/{jobId}/competition-ranking", "前端猜 /jobs/rank,真为按岗位竞争力排名,语义不同(需 jobId)"), + "fetchWeightSettings": ("PHANTOM", None, "无 /jobs/weight-settings,权重见 /profile/me/review-weights、/review-weight-templates"), + # already-correct static + "fetchJobList": ("ALIGNED", "GET /jobs", "命中真实契约"), + "fetchOfferCompareData": ("ALIGNED", "GET /offers/compare", "命中真实契约"), + "fetchUserProfile": ("ALIGNED", "GET /profile/me", "命中真实契约"), + # path-wrong (phantom base) that have real equivalents elsewhere + "fetchConversations": ("WRONG->REAL", "GET /conversations", "前端猜 /messages/conversations,真 /conversations"), + "fetchNotifications": ("WRONG->REAL", "GET /notifications", "前端猜 /messages/notifications,真 /notifications"), + "fetchInterviews": ("WRONG->REAL", "GET /interviews/me", "前端猜 /messages/interviews,真 /interviews/me(我的面试列表)"), + "fetchMatchResult": ("WRONG->REAL", "GET /applications/{id}/match 或 /jobs/{jobId}/match", "前端猜 /messages/match-result,真为投递/岗位匹配诊断"), + "fetchResume": ("WRONG->REAL", "GET /profile/me/resume", "前端猜 /resume,真 /profile/me/resume(下载简历)"), + "fetchFavorites": ("WRONG->REAL", "GET /jobs/favorites", "前端猜 /profile/me/favorites,真 /jobs/favorites"), + "fetchJobProgress": ("WRONG->REAL", "GET /profile/me/career-progress", "前端猜 /tools/job-progress,真 /profile/me/career-progress(统一求职进度聚合)"), + "fetchResumeSavedAt": ("PHANTOM", None, "无 /resume/saved-at,简历保存时间可由 /profile/me/resume-versions 派生"), + "fetchResumeExportSettings": ("PHANTOM", None, "无 /resume/export-settings,导出设置本地维护"), + "saveResumeBasicInfo": ("WRONG->REAL", "POST /profile/me/resume (multipart)", "前端猜 /resume/basic-info,真为上传简历文件(multipart),结构化字段在 PUT /profile/me"), + "saveResumeEducation": ("PHANTOM", None, "无 /resume/education,简历整体由 /profile/me/resume + resume-versions 管理"), + "saveResumeExperience": ("PHANTOM", None, "同上"), + "saveResumeProjects": ("PHANTOM", None, "同上"), + "saveResumeSelfEvaluation": ("PHANTOM", None, "同上"), + "saveResumeSkills": ("PHANTOM", None, "同上"), + "saveResumeSnapshot": ("PHANTOM", None, "同上"), + "saveSalaryRecord": ("PHANTOM", None, "无 /salary/records"), + "saveWeightSettings": ("PHANTOM", None, "无 /weight-settings"), +} + +def base_has_real(p): + segs = [s for s in p.split("/") if s and "{" not in s and "$" not in s] + if not segs: + return False + base = "/" + segs[0] + return any(rp == base or rp.startswith(base + "/") for rp in real_paths) + +verdicts = {} +for name, info in funcs.items(): + if not info["static"] and not info["tmpl"]: + continue + if name in manual: + v, rp, note = manual[name] + verdicts[name] = (v, rp, note, info["dai"], info["line"]) + continue + # auto + paths = info["static"] + info["tmpl"] + # for static-only auto + allphantom = True + anyok = False + for p in info["static"]: + if p in real_paths: + anyok = True; allphantom = False + elif base_has_real(p): + allphantom = False + if anyok: + verdicts[name] = ("ALIGNED", ", ".join(info["static"]), "命中真实契约", info["dai"], info["line"]) + elif allphantom is False and info["static"]: + verdicts[name] = ("PHANTOM", ", ".join(info["static"]), "父域不存在于 OpenAPI", info["dai"], info["line"]) + else: + verdicts[name] = ("PHANTOM", ", ".join(paths), "未命中 OpenAPI", info["dai"], info["line"]) + +# also catch functions flagged dai but no request captured (e.g. buildPrivacySummaryText) - skip + +order = {"ALIGNED":0, "WRONG->REAL":1, "PHANTOM":2} +rows = sorted(verdicts.items(), key=lambda kv: (order.get(kv[1][0],9), kv[0])) + +from collections import Counter +c = Counter(v[0] for v in verdicts.values()) +print("SUMMARY:", dict(c), "TOTAL FUNCS MAPPED:", len(verdicts)) + +md = ["# 联调路径校正映射表(基于 job.youthome.com.cn OpenAPI 实测)", ""] +md.append(f"> 生成日期:2026-09-28 | 数据源:`scripts/openapi.json`(182 条真实路径 / 220 path-methods)") +md.append(f"> 审计范围:api.ts 内全部 `request()` 调用({len(verdicts)} 个函数)") +md.append(f"> 结论:ALIGNED(已对齐)= {c.get('ALIGNED',0)},WRONG→REAL(路径错但有真实等价)= {c.get('WRONG->REAL',0)},PHANTOM(幽灵域,后端无契约)= {c.get('PHANTOM',0)}") +md.append("") +md.append("## 一、已对齐(无需改路径)") +md.append("") +md.append("| 函数 | 真实路径 | 原标记 |") +md.append("|---|---|---|") +for n,(v,rp,note,dai,line) in rows: + if v=="ALIGNED": + md.append(f"| `{n}` | `{rp}` | {'【待确认】' if dai else '已校正'} |") +md.append("") +md.append("## 二、路径错但有真实等价端点(需改路径)") +md.append("") +md.append("| 函数 | 当前(错) | 应改为(真实) | 说明 |") +md.append("|---|---|---|---|") +for n,(v,rp,note,dai,line) in rows: + if v=="WRONG->REAL": + curpath = ", ".join(funcs[n]["static"]+funcs[n]["tmpl"]) + md.append(f"| `{n}` | `{curpath}` | `{rp}` | {note} |") +md.append("") +md.append("## 三、幽灵域(后端 OpenAPI 无契约,必须退回 mock-only)") +md.append("") +md.append("| 函数 | 当前(幽灵)路径 | 说明 |") +md.append("|---|---|---|") +for n,(v,rp,note,dai,line) in rows: + if v=="PHANTOM": + curpath = ", ".join(funcs[n]["static"]+funcs[n]["tmpl"]) + md.append(f"| `{n}` | `{curpath}` | {note} |") +md.append("") +with open("docs/联调路径校正映射.md", "w", encoding="utf-8") as f: + f.write("\n".join(md)) +print("WROTE docs/联调路径校正映射.md") diff --git a/scripts/live_validate.py b/scripts/live_validate.py new file mode 100644 index 0000000..20819ae --- /dev/null +++ b/scripts/live_validate.py @@ -0,0 +1,76 @@ +import json, urllib.request, urllib.error + +BASE = "https://job.youthome.com.cn/api/v1" + +def req(method, path, token=None, body=None): + url = BASE + path + data = json.dumps(body).encode() if body is not None else None + r = urllib.request.Request(url, data=data, method=method) + r.add_header("Content-Type", "application/json") + if token: + r.add_header("Authorization", "Bearer " + token) + try: + with urllib.request.urlopen(r, timeout=20) as resp: + raw = resp.read().decode() + status = resp.status + except urllib.error.HTTPError as e: + raw = e.read().decode(errors="replace") + status = e.code + except Exception as e: + return None, str(e), None + try: + j = json.loads(raw) + except Exception: + return status, raw[:200], None + return status, j, raw + +# 1) login +s, j, _ = req("POST", "/auth/password/login", body={"phone": "19900009021", "password": "ZhilaiTest!2026#A"}) +token = (j or {}).get("data", {}).get("accessToken") if j else None +print("LOGIN:", s, "hasToken=", bool(token), "role=", (j or {}).get("data", {}).get("role"), "expiresIn=", (j or {}).get("data", {}).get("en")) +print("="*100) + +# 2) validate ID-less GET endpoints (student token) +idless = [ + ("GET", "/jobs", "fetchJobList(ALIGNED)"), + ("GET", "/offers/compare", "fetchOfferCompareData(ALIGNED)"), + ("GET", "/profile/me", "fetchUserProfile(ALIGNED)"), + ("GET", "/conversations", "fetchConversations(WRONG->REAL /conversations)"), + ("GET", "/notifications", "fetchNotifications(WRONG->REAL /notifications)"), + ("GET", "/notifications/unread-count", "bonus real"), + ("GET", "/interviews/me", "fetchInterviews(WRONG->REAL /interviews/me)"), + ("GET", "/jobs/favorites", "fetchFavorites(WRONG->REAL /jobs/favorites)"), + ("GET", "/profile/me/career-progress", "fetchJobProgress(WRONG->REAL /profile/me/career-progress)"), + ("GET", "/profile/me/preferences", "fetchJobPreference(WRONG->REAL /profile/me/preferences)"), + ("GET", "/profile/me/resume", "fetchResume(WRONG->REAL /profile/me/resume)"), + ("GET", "/profile/me/candidate-scoring", "bonus real"), + ("GET", "/applications/me", "bonus real /applications/me"), + ("GET", "/assessments/me", "bonus real /assessments/me"), + ("GET", "/abilities/me", "bonus real /abilities/me"), +] +for m, p, label in idless: + s, j, _ = req(m, p, token) + code = (j or {}).get("code") if isinstance(j, dict) else None + data = (j or {}).get("data") + dtype = type(data).__name__ + keys = list(data.keys())[:12] if isinstance(data, dict) else (f"len={len(data)}" if isinstance(data, list) else None) + print(f"{m:4} {p:42} [{label}]") + print(f" http={s} code={code} data_type={dtype} sample={keys}") + +print("="*100) +# 3) ID-needing endpoints: best-effort with placeholder id (status ambiguous if 404) +idneed = [ + ("GET", "/jobs/1", "fetchJobDetail(ALIGNED) needs jobId"), + ("GET", "/jobs/1/reviews", "fetchEmployeeReviews(ALIGNED)"), + ("GET", "/jobs/1/competition-ranking", "fetchRankData(WRONG->REAL)"), + ("GET", "/jobs/1/match", "fetchMatchResult alt"), + ("GET", "/conversations/1", "fetchConversation(WRONG->REAL /conversations/{id})"), + ("GET", "/applications/1/match", "fetchMatchResult(WRONG->REAL)"), + ("GET", "/company/candidates/1", "fetchCandidateDetail(WRONG->REAL, ENTERPRISE role)"), + ("GET", "/interviews/1/score", "fetchInterviewScore(WRONG->REAL)"), +] +for m, p, label in idneed: + s, j, _ = req(m, p, token) + code = (j or {}).get("code") if isinstance(j, dict) else None + msg = (j or {}).get("message") if isinstance(j, dict) else None + print(f"{m:4} {p:42} [{label}] http={s} code={code} msg={msg}") diff --git a/scripts/openapi.json b/scripts/openapi.json new file mode 100644 index 0000000..ebaab7a --- /dev/null +++ b/scripts/openapi.json @@ -0,0 +1 @@ +{"openapi":"3.1.0","info":{"title":"职来 API","version":"v1"},"servers":[{"url":"http://job.youthome.com.cn/api/v1","description":"Generated server url"}],"tags":[{"name":"岗位收藏","description":"学生收藏/取消收藏岗位,查看收藏列表"},{"name":"API","description":"API 信息入口"},{"name":"评分运营看板","description":"企业评分运营看板、评分排名与评分趋势"},{"name":"风险治理","description":"ADMIN 防刷风险概览与运营规则配置"},{"name":"通知","description":"站内通知查询、已读管理"},{"name":"双向匹配沟通","description":"匹配成功后创建或获取直聊会话(幂等)"},{"name":"企业认证","description":"企业认证提交、审核管理"},{"name":"企业评价管理","description":"企业查看自有岗位评价并提交官方回复"},{"name":"评分公平性监测","description":"ADMIN 只读聚合监测;不返回候选人或申诉身份信息"},{"name":"同岗位竞争力排名","description":"学生查看某岗位候选人池内的竞争力排名(匿名 Top 5)"},{"name":"求职者评分体系","description":"8 维候选人生成评分、综合分、趋势与企业只读评分卡"},{"name":"投递","description":"学生投递、撤回、查询;企业查看和审核投递;时间线"},{"name":"四维能力测评","description":"能力测评类型、答卷、保存答案、提交、结果与历史"},{"name":"Offer","description":"企业录用邀请:创建、发送、接受/拒绝/洽谈、到期失效、提醒与时间线"},{"name":"岗位","description":"岗位创建、管理、查询"},{"name":"官方回复审核","description":"管理员审核企业官方回复"},{"name":"评价审核","description":"评价审核与防刷:待审列表、审核决策、审核历史(仅 ADMIN)"},{"name":"简历版本","description":"学生简历版本管理、默认简历、导出任务"},{"name":"双向匹配阈值","description":"企业与求职者的匹配阈值配置"},{"name":"求职进度","description":"学生端聚合投递、面试、评分、Offer、竞争力排名与通知计数"},{"name":"结构化面试评分","description":"面试评分保存、查看、提交、历史"},{"name":"举报","description":"用户举报与查询"},{"name":"消息","description":"会话创建、消息发送、已读管理"},{"name":"RIASEC 职业兴趣测评","description":"测评类型、题目、答卷、保存答案、提交与结果查询"},{"name":"评分治理","description":"求职者评分申诉、审核、回滚与审计"},{"name":"账号注销","description":"当前用户账号注销申请、状态查询与取消(所有登录角色均可操作自己的账号)"},{"name":"候选人反馈","description":"企业对已投递候选人的评价反馈"},{"name":"举报管理","description":"ADMIN 查看与处理举报"},{"name":"求职者评分卡","description":"求职者评价聚合与评分卡"},{"name":"企业人才发现","description":"学生显式授权后,认证企业按自有岗位发现匿名候选人"},{"name":"企业人才邀约","description":"企业发起邀约,学生同意后建立站内会话"},{"name":"双向匹配","description":"求职者意愿分、企业 HR 适配分、匹配状态"},{"name":"系统","description":"健康检查、应用信息"},{"name":"个人资料","description":"学生个人资料查询、更新与简历管理"},{"name":"屏蔽","description":"用户屏蔽与解除屏蔽"},{"name":"岗位匹配","description":"学生查看岗位匹配诊断(确定性规则)"},{"name":"面试","description":"面试创建、查看、响应、取消、完成"},{"name":"求职偏好","description":"学生求职偏好查询与保存"},{"name":"岗位评价","description":"学生对已发布岗位进行评价"},{"name":"企业","description":"企业资料创建、查询与更新"},{"name":"个人数据导出","description":"为当前登录用户导出其个人业务数据(异步 ZIP)"},{"name":"隐私设置","description":"学生对自己简历可见性与联系方式可见性的隐私设置(仅 STUDENT 角色)"},{"name":"认证","description":"登录、验证码、Token 刷新与登出、用户信息"}],"paths":{"/profile/me":{"get":{"tags":["个人资料"],"summary":"查询当前学生资料","description":"查询当前登录学生(仅 STUDENT 角色)自己的学生资料。身份仅从 JWT/SecurityContext 获取,不接受 userId、studentUserId 等请求参数;本接口无 Path、Query、Body 参数。若尚未创建个人资料:HTTP 200,data 为空对象 {}(非 null),且不会自动创建数据库记录。当前未设置接口级限流。","operationId":"getMyProfile","responses":{"200":{"description":"成功;有资料返回资料对象,无资料返回空对象 {};message=ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponseStudentProfileResponse"},"examples":{"success-with-data":{"summary":"有资料","description":"success-with-data","value":{"code":200,"message":"ok","data":{"id":1,"userId":2,"realName":"张三","education":"本科","school":"某某大学","graduationYear":2026,"resumeUrl":"/uploads/resumes/2/resume.pdf","skills":"[Java, Spring Boot]","createdAt":"2026-08-24T10:00:00"},"timestamp":"2026-08-24T10:00:00Z"}}}}}},"401":{"description":"未登录、Token 缺失/非法/过期;运行时实际返回 code=401、message=not authenticated","content":{"application/json":{"examples":{"unauthorized":{"description":"unauthorized","value":{"code":401,"message":"not authenticated","timestamp":"2026-08-24T10:00:00Z"}}}}}},"403":{"description":"已登录但不是 STUDENT 角色(COMPANY/ADMIN);code=2002、message=forbidden","content":{"application/json":{"examples":{"forbidden":{"description":"forbidden","value":{"code":2002,"message":"forbidden","data":null,"timestamp":"2026-08-24T10:00:00Z"}}}}}}},"security":[{"bearerAuth":[]}]},"put":{"tags":["个人资料"],"summary":"更新学生资料","description":"仅更新传入的非 null 字段;不存在则自动创建","operationId":"updateMyProfile","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentProfileUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/profile/me/talent-discovery":{"get":{"tags":["企业人才发现"],"summary":"查询人才发现授权","operationId":"getPreference","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseTalentDiscoveryPreferenceResponse"}}}}},"security":[{"bearerAuth":[]}]},"put":{"tags":["企业人才发现"],"summary":"更新人才发现授权","description":"仅当前学生本人可更新;expectedVersion 用于乐观锁并发控制。","operationId":"updatePreference","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalentDiscoveryPreferenceUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseTalentDiscoveryPreferenceResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/profile/me/review-weights":{"get":{"tags":["student-review-weight-controller"],"operationId":"getMyWeights","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReviewWeightResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"403":{"description":"非 STUDENT 角色","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}},"put":{"tags":["student-review-weight-controller"],"operationId":"saveWeights","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveWeightRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReviewWeightResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"403":{"description":"非 STUDENT 角色","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/profile/me/resume-versions/{id}":{"get":{"tags":["简历版本"],"summary":"简历版本详情","description":"仅本人可查看;他人 403,不存在 404","operationId":"get","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"put":{"tags":["简历版本"],"summary":"修改简历版本","description":"本人;可选重命名 + 可选替换文件(替换时删除旧文件)","operationId":"update","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"name","in":"query","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}}}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"delete":{"tags":["简历版本"],"summary":"删除简历版本","description":"默认版本需先设其他默认;导出进行中不可删;删除文件并移除记录","operationId":"delete","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/profile/me/privacy":{"get":{"tags":["隐私设置"],"summary":"查询当前学生隐私设置","description":"查询当前登录学生(仅 STUDENT 角色)的隐私设置。身份仅从 JWT/SecurityContext 获取,不接受 userId、studentUserId 等请求参数;本接口无 Path、Query、Body 参数。若尚未创建设置:HTTP 200,返回默认对象(PRIVATE / contactVisible=false / version=0),且不会自动创建数据库记录。","operationId":"getMyPrivacySettings","responses":{"200":{"description":"成功;返回隐私设置对象(无记录时返回默认对象);message=ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponsePrivacySettingsResponse"},"examples":{"success-with-data":{"summary":"已有设置记录","description":"success-with-data","value":{"code":200,"message":"ok","data":{"id":1,"studentUserId":2,"resumeVisibility":"APPLIED_COMPANIES","contactVisible":true,"version":0,"createdAt":"2026-08-25T10:00:00","updatedAt":"2026-08-25T10:00:00"},"timestamp":"2026-08-25T10:00:00Z"}}}}}},"401":{"description":"未登录、Token 缺失/非法/过期;运行时实际返回 code=401、message=not authenticated","content":{"application/json":{"examples":{"unauthorized":{"description":"unauthorized","value":{"code":401,"message":"not authenticated","timestamp":"2026-08-25T10:00:00Z"}}}}}},"403":{"description":"已登录但不是 STUDENT 角色(COMPANY/ADMIN);code=2002、message=forbidden","content":{"application/json":{"examples":{"forbidden":{"description":"forbidden","value":{"code":2002,"message":"forbidden","data":null,"timestamp":"2026-08-25T10:00:00Z"}}}}}}},"security":[{"bearerAuth":[]}]},"put":{"tags":["隐私设置"],"summary":"更新当前学生隐私设置","description":"更新当前登录学生(仅 STUDENT 角色)的隐私设置,执行 upsert(同一学生至多一行)。身份仅从 JWT/SecurityContext 获取,不接受 userId、studentUserId 等请求参数。resumeVisibility 必填,取值 PRIVATE / APPLIED_COMPANIES / VERIFIED_COMPANIES;contactVisible 必填。version 可选:不传或传 0 表示非严格校验;传了且与当前版本不一致时返回 409/9201。","operationId":"updateMyPrivacySettings","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PrivacySettingsUpdateRequest"}}},"required":true},"responses":{"200":{"description":"成功;返回更新后的隐私设置对象;message=ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponsePrivacySettingsResponse"}}}},"400":{"description":"请求体校验失败(缺少必填字段或非法枚举);code=1001、message=bad request","content":{"application/json":{"examples":{"bad-request":{"description":"bad-request","value":{"code":1001,"message":"bad request","data":null,"timestamp":"2026-08-25T10:00:00Z"}}}}}},"401":{"description":"未登录、Token 缺失/非法/过期;code=401、message=not authenticated","content":{"application/json":{"examples":{"unauthorized":{"description":"unauthorized","value":{"code":401,"message":"not authenticated","timestamp":"2026-08-25T10:00:00Z"}}}}}},"403":{"description":"已登录但不是 STUDENT 角色(COMPANY/ADMIN);code=2002、message=forbidden","content":{"application/json":{"examples":{"forbidden":{"description":"forbidden","value":{"code":2002,"message":"forbidden","data":null,"timestamp":"2026-08-25T10:00:00Z"}}}}}},"409":{"description":"乐观锁版本冲突(version 与当前不一致);code=9201、message=privacy settings concurrent update","content":{"application/json":{"examples":{"conflict":{"description":"conflict","value":{"code":9201,"message":"privacy settings concurrent update","data":null,"timestamp":"2026-08-25T10:00:00Z"}}}}}}},"security":[{"bearerAuth":[]}]}},"/profile/me/preferences":{"get":{"tags":["求职偏好"],"summary":"查询求职偏好","description":"仅 STUDENT;无记录时返回空偏好对象","operationId":"getPreferences","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"put":{"tags":["求职偏好"],"summary":"保存求职偏好","description":"仅 STUDENT;upsert,完全替换传入字段","operationId":"savePreferences","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentPreferenceRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/profile/me/match-rule":{"get":{"tags":["双向匹配阈值"],"summary":"查询学生匹配阈值","description":"未配置返回默认 60","operationId":"getStudentRule","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"put":{"tags":["双向匹配阈值"],"summary":"更新学生匹配阈值","description":"requiredHrScore 0-100;首次更新创建配置","operationId":"updateStudentRule","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/StudentMatchRuleRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/offers/{id}":{"get":{"tags":["Offer"],"summary":"Offer 详情","description":"仅目标候选人、所属企业可访问;其他账号返回无权限错误","operationId":"get_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"put":{"tags":["Offer"],"summary":"修改 Offer","description":"仅所属企业、仅 DRAFT 状态可修改;其余状态返回业务错误","operationId":"update_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/{jobId}":{"get":{"tags":["岗位"],"summary":"查询岗位详情","description":"企业可查看自己管理的岗位详情","operationId":"getJob","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"put":{"tags":["岗位"],"summary":"更新岗位","description":"仅岗位所属企业可修改","operationId":"updateJob","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/{jobId}/reviews/{reviewId}":{"get":{"tags":["岗位评价"],"summary":"岗位评价详情","description":"公开访问;返回单条 PUBLISHED 评价与八维评分","operationId":"get_2","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"reviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"put":{"tags":["岗位评价"],"summary":"修改评价","description":"仅评价本人可以修改","operationId":"update_2","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"reviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobReviewUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"delete":{"tags":["岗位评价"],"summary":"删除评价","description":"仅评价本人可以删除","operationId":"delete_1","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"reviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/interviews/{interviewId}":{"get":{"tags":["面试"],"summary":"面试详情","description":"学生本人或企业可查看面试详情","operationId":"get_3","parameters":[{"name":"interviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"put":{"tags":["面试"],"summary":"修改面试","description":"企业修改面试时间、地点等信息,仅 SCHEDULED/CONFIRMED 状态可修改","operationId":"update_3","parameters":[{"name":"interviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/interviews/{interviewId}/score":{"get":{"tags":["结构化面试评分"],"summary":"查看评分","description":"企业 owner 可查看草稿与已提交;学生只能在提交后查看","operationId":"get_4","parameters":[{"name":"interviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseInterviewScoreResponse"}}}}}},"put":{"tags":["结构化面试评分"],"summary":"保存评分草稿","description":"企业为已完成的面试保存评分草稿(支持重复保存)","operationId":"save","parameters":[{"name":"interviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewScoreSaveRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseInterviewScoreResponse"}}}}}}},"/companies/me":{"get":{"tags":["企业"],"summary":"查询当前企业资料","description":"返回当前登录用户绑定的企业资料,未绑定企业返回 404","operationId":"getMyCompany","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"put":{"tags":["企业"],"summary":"更新企业资料","description":"仅更新传入的非 null 字段;未绑定企业时返回 404","operationId":"updateMyCompany","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"post":{"tags":["企业"],"summary":"创建企业资料","description":"仅 COMPANY 角色可调用;已存在时返回 409","operationId":"createMyCompany","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyCreateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/companies/me/match-rule":{"get":{"tags":["双向匹配阈值"],"summary":"查询企业匹配阈值","description":"未配置返回默认 60","operationId":"getCompanyRule","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"put":{"tags":["双向匹配阈值"],"summary":"更新企业匹配阈值","description":"requiredCandidateScore 0-100;首次更新创建配置","operationId":"updateCompanyRule","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyMatchRuleRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/companies/me/jobs/{jobId}/recommendation-profile":{"get":{"tags":["job-recommendation-controller"],"operationId":"profile","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRecommendationProfileResponse"}}}}}},"put":{"tags":["job-recommendation-controller"],"operationId":"updateProfile","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationProfileRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRecommendationProfileResponse"}}}}}}},"/companies/me/job-reviews/{reviewId}/reply":{"put":{"tags":["企业评价管理"],"summary":"修订被驳回回复","description":"仅 REJECTED 回复可修订;使用 expectedVersion 防并发覆盖","operationId":"reviseReply","parameters":[{"name":"reviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/UpdateCompanyReviewReplyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompanyReviewReplyResponse"}}}}}},"post":{"tags":["企业评价管理"],"summary":"创建官方回复","description":"仅岗位所属 COMPANY;安全文本自动公开,风险文本进入管理员审核","operationId":"createReply","parameters":[{"name":"reviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateCompanyReviewReplyRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompanyReviewReplyResponse"}}}}}}},"/blocks/{blockedUserId}":{"put":{"tags":["屏蔽"],"summary":"屏蔽用户","description":"幂等:已屏蔽返回 200 不新增。屏蔽自己 400/9608;目标不存在 404/4001。默认:对外不泄露是谁屏蔽了谁,仅屏蔽站内信。","operationId":"block","parameters":[{"name":"blockedUserId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseBlockRelationResponse"}}}},"400":{"description":"屏蔽自己(9608)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseBlockRelationResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseBlockRelationResponse"}}}},"404":{"description":"目标用户不存在(4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseBlockRelationResponse"}}}}}},"delete":{"tags":["屏蔽"],"summary":"解除屏蔽","description":"幂等:不存在时返回 200 不报错。","operationId":"unblock","parameters":[{"name":"blockedUserId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseVoid"}}}},"400":{"description":"屏蔽自己(9608)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseVoid"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseVoid"}}}}}}},"/applications/{id}/hr-suitability-score":{"put":{"tags":["双向匹配"],"summary":"提交企业 HR 适配分","description":"仅岗位所属企业;0-100;MATCHED/CLOSED 后不可修改","operationId":"submitHrSuitabilityScore","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoreRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/applications/{id}/candidate-interest-score":{"put":{"tags":["双向匹配"],"summary":"提交求职者岗位意愿分","description":"仅投递本人(STUDENT);0-100;MATCHED/CLOSED 后不可修改","operationId":"submitCandidateInterestScore","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ScoreRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/applications/{applicationId}/feedback":{"get":{"tags":["候选人反馈"],"summary":"查询候选人反馈","description":"该投递的企业或学生可查看","operationId":"get_5","parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateFeedbackResponse"}}}}}},"put":{"tags":["候选人反馈"],"summary":"修改候选人反馈","description":"仅岗位所属企业","operationId":"update_4","parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateFeedbackRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateFeedbackResponse"}}}}}},"post":{"tags":["候选人反馈"],"summary":"创建候选人反馈","description":"仅岗位所属企业;同一投递只能反馈一次","operationId":"create","parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CandidateFeedbackRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateFeedbackResponse"}}}}}},"delete":{"tags":["候选人反馈"],"summary":"删除候选人反馈","description":"仅岗位所属企业","operationId":"delete_2","parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/admin/scoring/risk/rules/{ruleCode}":{"put":{"tags":["风险治理"],"summary":"更新风险规则(ADMIN)","operationId":"updateRule","parameters":[{"name":"ruleCode","in":"path","required":true,"schema":{"type":"string"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskRuleUpdateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskRuleResponse"}}}},"400":{"description":"参数非法(1001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskRuleResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskRuleResponse"}}}},"403":{"description":"非 ADMIN(2002/4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskRuleResponse"}}}},"404":{"description":"规则不存在(9901)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskRuleResponse"}}}},"409":{"description":"并发更新(9903)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskRuleResponse"}}}}}}},"/reports":{"post":{"tags":["举报"],"summary":"提交举报","description":"targetType=USER 需 targetUserId;targetType=MESSAGE 需 messageId(服务端推导发送者为被举报人)。幂等键重放:同键同请求返回原单 200,同键不同请求 409/9606;待处理重复 409/9603;举报自己 400/9602;限流 429/9609。","operationId":"create_1","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateReportRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"400":{"description":"参数错误(1001/9602/9607)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"403":{"description":"无权访问该消息(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"404":{"description":"目标用户不存在(4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"409":{"description":"重复举报/幂等冲突(9603/9606)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"429":{"description":"举报限流(9609)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}}}}},"/profile/me/talent-invitations/{invitationId}/decision":{"post":{"tags":["企业人才邀约"],"summary":"处理人才邀约","description":"学生接受后才创建 TALENT_INVITATION 站内会话","operationId":"decide","parameters":[{"name":"invitationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/TalentInvitationDecisionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseStudentTalentInvitationResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/profile/me/resume":{"get":{"tags":["个人资料"],"summary":"下载简历","description":"下载当前学生上传的简历文件,仅 STUDENT 角色","operationId":"downloadResume","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","format":"byte"}}}}}},"post":{"tags":["个人资料"],"summary":"上传简历","description":"仅 STUDENT 角色;PDF/DOC/DOCX,≤10MB;上传新简历时替换旧文件","operationId":"uploadResume","requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"delete":{"tags":["个人资料"],"summary":"删除简历","description":"删除当前学生的简历文件并清空 resumeUrl,仅 STUDENT 角色","operationId":"deleteResume","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/profile/me/resume-versions":{"get":{"tags":["简历版本"],"summary":"简历版本列表","description":"本人 ACTIVE 版本,version_no 倒序","operationId":"list","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListMapStringObject"}}}}}},"post":{"tags":["简历版本"],"summary":"创建简历版本","description":"仅本人(STUDENT);PDF/DOC/DOCX ≤10MB;可附版本名","operationId":"create_2","parameters":[{"name":"name","in":"query","required":false,"schema":{"type":"string"}}],"requestBody":{"content":{"multipart/form-data":{"schema":{"type":"object","properties":{"file":{"type":"string","format":"binary"}},"required":["file"]}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/profile/me/resume-versions/{id}/export":{"post":{"tags":["简历版本"],"summary":"创建简历导出任务","description":"异步复制该版本文件到导出目录;返回任务状态","operationId":"createExportTask","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/profile/me/resume-versions/{id}/default":{"post":{"tags":["简历版本"],"summary":"设为默认简历","description":"同用户最多一个默认;已默认幂等;并发冲突 409","operationId":"setDefault","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/profile/me/job-recommendations/{jobId}/feedback":{"post":{"tags":["job-recommendation-controller"],"operationId":"feedback","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationFeedbackRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRecommendationFeedbackResponse"}}}}}},"delete":{"tags":["job-recommendation-controller"],"operationId":"revokeFeedback","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"expectedVersion","in":"query","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseVoid"}}}}}}},"/profile/me/deletion":{"get":{"tags":["账号注销"],"summary":"查询当前账号注销状态","description":"查询当前登录用户注销状态。无记录时返回默认对象(NONE/version=0),且不自动创建数据库记录;身份仅从 JWT/SecurityContext 获取,不接受 userId 等身份参数。","operationId":"getStatus","responses":{"200":{"description":"成功;返回注销状态对象(无记录时为默认 NONE);message=ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponseAccountDeletionResponse"}}}},"401":{"description":"未登录、Token 缺失/非法/过期;code=401、message=not authenticated","content":{"application/json":{}}}},"security":[{"bearerAuth":[]}]},"post":{"tags":["账号注销"],"summary":"申请注销当前账号","description":"当前登录用户申请注销。NONE → PENDING;PENDING 重复提交返回 200 当前状态(幂等,不重复写审计);COMPLETED 再次申请返回 409/9301。身份仅从 JWT/SecurityContext 获取,不接受 userId 等身份参数。","operationId":"initiate","responses":{"200":{"description":"成功;返回当前注销状态(NONE/PENDING);message=ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponseAccountDeletionResponse"}}}},"401":{"description":"未登录、Token 缺失/非法/过期;code=401、message=not authenticated","content":{"application/json":{}}},"403":{"description":"访问被拒绝;code=2002、message=forbidden(当前未使用),保留契约","content":{"application/json":{}}},"409":{"description":"状态冲突:9301(COMPLETED 再申请)、9306(最后一个有效 ADMIN 不能注销)","content":{"application/json":{}}}},"security":[{"bearerAuth":[]}]}},"/profile/me/deletion/cancel":{"post":{"tags":["账号注销"],"summary":"取消当前账号注销","description":"仅 PENDING 且未超过 effectiveAt 时可取消(PENDING → NONE);非 PENDING 重复取消返回当前状态保持幂等;已超过冷静期返回 409/9305;COMPLETED 不得恢复(返回 409/9301)。身份仅从 JWT/SecurityContext 获取,不接受 userId 等身份参数。","operationId":"cancel","responses":{"200":{"description":"成功;返回取消后的注销状态(NONE 或无记录默认);message=ok","content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApiResponseAccountDeletionResponse"}}}},"401":{"description":"未登录、Token 缺失/非法/过期;code=401、message=not authenticated","content":{"application/json":{}}},"409":{"description":"状态冲突:9305(已超过冷静期)、9301(COMPLETED 不得恢复)","content":{"application/json":{}}}},"security":[{"bearerAuth":[]}]}},"/profile/me/data-export-tasks":{"get":{"tags":["个人数据导出"],"summary":"查询个人数据导出任务列表","description":"仅本人;按创建时间倒序分页","operationId":"list_1","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseDataExportTaskResponse"}}}}}},"post":{"tags":["个人数据导出"],"summary":"创建个人数据导出任务","description":"异步生成 ZIP;同 idempotencyKey 重放返回原任务;注销进行中禁止创建","operationId":"create_3","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateDataExportRequest"}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseDataExportTaskResponse"}}}}}}},"/profile/me/candidate-scoring/appeals":{"get":{"tags":["评分治理"],"summary":"我的申诉列表","description":"仅 STUDENT 本人","operationId":"listMyAppeals","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"post":{"tags":["评分治理"],"summary":"提交评分申诉","description":"仅 STUDENT 本人;同一学生+维度+周期 PENDING/APPROVED 唯一","operationId":"createAppeal","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAppealRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAppealResponse"}}}}}}},"/profile/me/candidate-scoring/appeals/{appealId}/cancel":{"post":{"tags":["评分治理"],"summary":"撤销申诉","description":"仅本人;仅 PENDING 可撤销","operationId":"cancelAppeal","parameters":[{"name":"appealId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAppealResponse"}}}}}}},"/offers":{"get":{"tags":["Offer"],"summary":"Offer 列表","description":"候选人查看收到的、企业查看发出的 Offer;支持 status、applicationId 筛选与分页","operationId":"list_2","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"applicationId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"post":{"tags":["Offer"],"summary":"创建 Offer","description":"仅企业账号;投递存在、岗位属于本企业、投递状态可发、无有效 Offer;默认 DRAFT","operationId":"create_4","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferCreateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/offers/{id}/remind":{"post":{"tags":["Offer"],"summary":"手动提醒","description":"仅所属企业;仅 SENT/NEGOTIATING 可提醒;相同提醒不重复创建","operationId":"remind","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/offers/{id}/counter-offers":{"get":{"tags":["Offer"],"summary":"还价列表","description":"候选人查看本人 Offer 的还价、企业查看本企业 Offer 的还价","operationId":"listCounterOffers","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListMapStringObject"}}}}}},"post":{"tags":["Offer"],"summary":"发起还价","description":"仅候选人本人;仅 SENT/NEGOTIATING 可发起;SENT 时自动进入 NEGOTIATING","operationId":"createCounterOffer","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CounterOfferCreateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/notifications/{id}/read":{"post":{"tags":["通知"],"summary":"标记已读","description":"标记单条通知已读(幂等)","operationId":"markRead","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/notifications/read-all":{"post":{"tags":["通知"],"summary":"全部已读","description":"标记当前用户全部通知已读(幂等)","operationId":"markAllRead","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs":{"get":{"tags":["岗位"],"summary":"查询已发布岗位列表","description":"仅返回 PUBLISHED 岗位,支持关键词、城市、用工类型、薪资筛选和分页","operationId":"listJobs","parameters":[{"name":"keyword","in":"query","required":false,"schema":{"type":"string"}},{"name":"city","in":"query","required":false,"schema":{"type":"string"}},{"name":"employmentType","in":"query","required":false,"schema":{"type":"string"}},{"name":"salaryMin","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"salaryMax","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"post":{"tags":["岗位"],"summary":"创建岗位","description":"仅企业账号可调用,新岗位默认 DRAFT 状态","operationId":"createJob","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobCreateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/{jobId}/reviews":{"get":{"tags":["岗位评价"],"summary":"查询岗位评价列表","description":"公开访问;仅返回 PUBLISHED 评价,分页;每条含八维评分","operationId":"list_3","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"post":{"tags":["岗位评价"],"summary":"创建岗位评价","description":"仅 STUDENT;同一学生对同一岗位只能评价一次","operationId":"create_5","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobReviewCreateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/{jobId}/favorite":{"post":{"tags":["岗位收藏"],"summary":"收藏岗位","description":"仅 STUDENT;仅 PUBLISHED;幂等","operationId":"favorite","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"delete":{"tags":["岗位收藏"],"summary":"取消收藏","description":"仅 STUDENT;幂等,未收藏也返回 200","operationId":"unfavorite","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/interviews/{interviewId}/score/submit":{"post":{"tags":["结构化面试评分"],"summary":"提交评分","description":"将草稿提交为终态,提交后不可修改","operationId":"submit","parameters":[{"name":"interviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseInterviewScoreResponse"}}}}}}},"/interviews/{interviewId}/respond":{"post":{"tags":["面试"],"summary":"响应面试邀请","description":"学生接受、拒绝或申请改期","operationId":"respond","parameters":[{"name":"interviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewRespondRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/interviews/{interviewId}/complete":{"post":{"tags":["面试"],"summary":"完成面试","description":"企业在面试时间结束后将面试标记为完成","operationId":"complete","parameters":[{"name":"interviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"type":"object","additionalProperties":{"type":"string"}}}}},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/interviews/{interviewId}/cancel":{"post":{"tags":["面试"],"summary":"取消面试","description":"企业取消已安排的面试","operationId":"cancel_1","parameters":[{"name":"interviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewCancelRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/conversations":{"get":{"tags":["消息"],"summary":"会话列表","description":"当前用户参与的所有会话","operationId":"listConversations","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListMapStringObject"}}}}}},"post":{"tags":["消息"],"summary":"创建/获取会话","description":"创建或返回与另一用户的 DIRECT 会话","operationId":"createConversation","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateConversationRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/conversations/{id}/read":{"post":{"tags":["消息"],"summary":"标记已读","description":"将当前会话所有消息标记为已读","operationId":"markRead_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/conversations/{conversationId}/messages/{messageId}/recall":{"post":{"tags":["消息"],"summary":"撤回消息","description":"仅原发送者可在发送后两分钟内撤回消息;重复撤回幂等返回当前状态","operationId":"recallMessage","parameters":[{"name":"conversationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"messageId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMessageResponse"}}}}}}},"/conversations/messages":{"post":{"tags":["消息"],"summary":"发送消息","description":"在会话中发送消息,仅成员可发送","operationId":"sendMessage","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SendMessageRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/companies/me/verification":{"get":{"tags":["企业认证"],"summary":"查询企业认证状态","description":"企业查询自己的认证状态和历史","operationId":"getMyVerification","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}},"post":{"tags":["企业认证"],"summary":"提交企业认证","description":"企业提交认证材料(营业执照等),只能提交自己的认证","operationId":"submit_1","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationSubmitRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/companies/me/jobs/{jobId}/talent-invitations":{"post":{"tags":["企业人才邀约"],"summary":"创建人才邀约","operationId":"create_6","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateTalentInvitationRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompanyTalentInvitationResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/auth/sms/send":{"post":{"tags":["认证"],"summary":"发送短信验证码","description":"开发/测试使用 Mock 发送实现;生产环境未接入短信网关时返回服务不可用。验证码不会写入日志。","operationId":"sendSmsCode","parameters":[{"name":"phone","in":"query","required":true,"schema":{"type":"string","minLength":1,"pattern":"[0-9]{11}"}},{"name":"purpose","in":"query","required":false,"schema":{"type":"string","default":"login"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringString"}}}}}}},"/auth/refresh":{"post":{"tags":["认证"],"summary":"刷新 Token","description":"使用 Refresh Token 换取新的 Access/Refresh Token 对;旧 Refresh Token 立即失效","operationId":"refresh","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RefreshTokenRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseTokenPairResponse"}}}}}}},"/auth/password/set":{"post":{"tags":["认证"],"summary":"首次设置密码","operationId":"setPassword","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordSetRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePasswordOperationResponse"}}}}}}},"/auth/password/reset":{"post":{"tags":["认证"],"summary":"短信找回并重置密码","operationId":"resetPassword","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordResetRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePasswordOperationResponse"}}}}}}},"/auth/password/login":{"post":{"tags":["认证"],"summary":"手机号密码登录","description":"使用手机号和密码登录,返回 Access/Refresh Token;不自动创建账号","operationId":"passwordLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordLoginRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/auth/password/change":{"post":{"tags":["认证"],"summary":"修改密码","operationId":"changePassword","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/PasswordChangeRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePasswordOperationResponse"}}}}}}},"/auth/logout":{"post":{"tags":["认证"],"summary":"登出","description":"撤销当前登录会话;需要 Access Token,不接受任何请求体","operationId":"logout","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringString"}}}}}}},"/auth/login":{"post":{"tags":["认证"],"summary":"Mock 登录","description":"使用手机号+验证码登录,返回 Access/Refresh Token 并创建服务端登录会话","operationId":"mockLogin","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/LoginRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/auth/company/register":{"post":{"tags":["认证"],"summary":"企业注册","description":"使用 company-register 短信验证码创建企业账号和企业资料","operationId":"companyRegister","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CompanyRegistrationRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompanyRegistrationResponse"}}}}}}},"/assessments/attempts":{"post":{"tags":["RIASEC 职业兴趣测评"],"summary":"创建答卷","description":"照六维各抽 5 题共 30 道并持久化,刷新不重抽。幂等键重放返回原答卷;同键不同定义 409/9709;已有活跃答卷 409/9708。仅 STUDENT。","operationId":"createAttempt","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAssessmentAttemptRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}},"403":{"description":"非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}},"404":{"description":"测评类型不存在(9701)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}},"409":{"description":"活跃答卷/幂等冲突(9708/9709)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}}}}},"/assessments/attempts/{attemptId}/submit":{"post":{"tags":["RIASEC 职业兴趣测评"],"summary":"提交答卷","description":"30 题全答且每维各 5 题后方可提交(否则 400/9706);提交后生成结果并写审计;重复提交返回原结果,不重复生成与审计。仅本人。","operationId":"submitAttempt","parameters":[{"name":"attemptId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentResultResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentResultResponse"}}}},"403":{"description":"非本人或非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentResultResponse"}}}},"404":{"description":"答卷不存在(9702)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentResultResponse"}}}},"409":{"description":"非法状态(9703)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentResultResponse"}}}},"400":{"description":"未完成(9706)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentResultResponse"}}}}}}},"/applications":{"post":{"tags":["投递"],"summary":"投递岗位","description":"只能投递 PUBLISHED 状态的岗位,不可重复投递","operationId":"apply","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationCreateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/applications/{id}/withdraw":{"post":{"tags":["投递"],"summary":"撤回投递","description":"仅 SUBMITTED/VIEWED 状态可撤回,撤回后不可逆","operationId":"withdraw","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/applications/{id}/conversation":{"post":{"tags":["双向匹配沟通"],"summary":"创建/获取匹配会话","description":"仅 MATCHED 双方可调用;重复调用返回同一会话","operationId":"createOrGetConversation","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/applications/{applicationId}/interviews":{"get":{"tags":["面试"],"summary":"查询投递的面试列表","description":"学生本人或岗位所属企业可查看","operationId":"listByApplication","parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListMapStringObject"}}}}}},"post":{"tags":["面试"],"summary":"创建面试邀请","description":"企业为投递记录创建面试邀请","operationId":"create_7","parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/InterviewCreateRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/admin/scoring/risk/events/{eventId}/actions":{"post":{"tags":["风险治理"],"summary":"风险事件人工操作(ADMIN)","operationId":"actionEvent","parameters":[{"name":"eventId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RiskEventActionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskEventResponse"}}}},"400":{"description":"参数非法(1001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskEventResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskEventResponse"}}}},"403":{"description":"非 ADMIN(2002/4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskEventResponse"}}}},"404":{"description":"事件不存在(9902)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskEventResponse"}}}},"409":{"description":"非法流转/并发(9904/9905)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskEventResponse"}}}}}}},"/admin/reviews/{reviewId}/decision":{"post":{"tags":["评价审核"],"summary":"评价审核决策","description":"仅 ADMIN;仅 PENDING 可审,重复提交 409;决策写入历史与 audit_logs","operationId":"decide_1","parameters":[{"name":"reviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewDecisionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/admin/review-replies/{replyId}/decision":{"post":{"tags":["官方回复审核"],"summary":"官方回复审核决策","description":"仅 ADMIN;PENDING 回复可 APPROVE 或 REJECT","operationId":"decide_2","parameters":[{"name":"replyId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReviewReplyDecisionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAdminReviewReplyResponse"}}}}}}},"/admin/reports/{id}/decision":{"post":{"tags":["举报管理"],"summary":"举报处理决定(ADMIN)","description":"仅 ADMIN;decision 仅 RESOLVED/REJECTED;REJECTED 必填 note;仅 PENDING 可处理,重复 409/9604,乐观锁冲突 409/9601-9605;处理后向举报人发送一条 REPORT_DECISION 通知(幂等)。","operationId":"decide_3","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ReportDecisionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"400":{"description":"参数错误(REJECTED 缺 note)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"403":{"description":"非 ADMIN(2002/4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"404":{"description":"举报不存在(9601)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"409":{"description":"重复决定/非法流转(9604/9605)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}}}}},"/admin/job-recommendation-profiles/{jobId}/decision":{"post":{"tags":["job-recommendation-controller"],"operationId":"decide_4","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/RecommendationDecisionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRecommendationProfileResponse"}}}}}}},"/admin/companies/verifications/{id}/decision":{"post":{"tags":["企业认证"],"summary":"审核决定","description":"管理员通过或拒绝认证申请,拒绝时必须填写原因","operationId":"decide_5","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/VerificationDecisionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/admin/candidate-scoring/appeals/{appealId}/rollback":{"post":{"tags":["评分治理"],"summary":"执行回滚","description":"仅 ADMIN;记录前态+确定性重算+新版本;年 3 次上限","operationId":"rollbackAppeal","parameters":[{"name":"appealId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAppealResponse"}}}}}}},"/admin/candidate-scoring/appeals/{appealId}/decision":{"post":{"tags":["评分治理"],"summary":"审核决定","description":"仅 ADMIN;APPROVE/REJECT,REJECT 必须填 reason","operationId":"decideAppeal","parameters":[{"name":"appealId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/AppealDecisionRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAppealResponse"}}}}}}},"/abilities/attempts":{"post":{"tags":["四维能力测评"],"summary":"创建能力答卷","description":"按四维各抽 6 题(每维三个 competencyTag 各 2)共 24 道并持久化,刷新不重抽。同幂等键重放返回原答卷;有效结果冷却期内 409/9810;90 天完成次数达上限 429/9811。仅 STUDENT。","operationId":"createAttempt_1","requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/CreateAbilityAttemptRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"403":{"description":"非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"404":{"description":"类型不存在(9801)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"409":{"description":"活跃/幂等/冷却(9808/9809/9810)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"429":{"description":"重测次数上限(9811)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}}}}},"/abilities/attempts/{attemptId}/submit":{"post":{"tags":["四维能力测评"],"summary":"提交能力测评答卷","description":"24/24 且四维各 6 方可提交(否则 400/9806);超时标 EXPIRED 不生成结果;并发提交最多一条结果与一条审计;重复提交幂等返回原结果。仅本人。","operationId":"submitAttempt_1","parameters":[{"name":"attemptId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityResultResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityResultResponse"}}}},"403":{"description":"非本人或非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityResultResponse"}}}},"404":{"description":"答卷不存在(9802)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityResultResponse"}}}},"400":{"description":"未完成(9806)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityResultResponse"}}}},"409":{"description":"非法状态(9803)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityResultResponse"}}}}}}},"/offers/{id}/status":{"patch":{"tags":["Offer"],"summary":"Offer 状态变更","description":"DRAFT→SENT 企业;SENT/NEGOTIATING→ACCEPTED/REJECTED/NEGOTIATING 候选人;重复提交幂等","operationId":"changeStatus","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/OfferStatusRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/offers/{id}/counter-offers/{coId}/reject":{"patch":{"tags":["Offer"],"summary":"拒绝还价","description":"仅所属企业;拒绝后 Offer 保持 NEGOTIATING","operationId":"rejectCounterOffer","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"coId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/offers/{id}/counter-offers/{coId}/accept":{"patch":{"tags":["Offer"],"summary":"接受还价","description":"仅所属企业;接受后更新 Offer 薪资/入职日期并变为 ACCEPTED","operationId":"acceptCounterOffer","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"coId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/{jobId}/status":{"patch":{"tags":["岗位"],"summary":"发布/关闭岗位","description":"DRAFT→PUBLISHED,PUBLISHED→CLOSED;禁止非法回退","operationId":"updateStatus","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/JobStatusRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/assessments/attempts/{attemptId}/answers":{"patch":{"tags":["RIASEC 职业兴趣测评"],"summary":"保存答案","description":"单题或批量保存,重复保存 upsert;value 1-5;题目必须属于本答卷;版本冲突 409/9707;首次保存后状态置为 IN_PROGRESS。仅本人。","operationId":"saveAnswers","parameters":[{"name":"attemptId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveAssessmentAnswersRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}},"403":{"description":"非本人或非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}},"404":{"description":"答卷不存在(9702)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}},"409":{"description":"非法状态/并发(9703/9707)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}}}}},"/applications/{id}/status":{"patch":{"tags":["投递"],"summary":"更新投递状态(企业)","description":"SUBMITTED→VIEWED→INTERVIEW→REJECTED/HIRED","operationId":"updateStatus_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/ApplicationStatusRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/abilities/attempts/{attemptId}/answers":{"patch":{"tags":["四维能力测评"],"summary":"保存能力测评答案","description":"upsert;首次有效保存启动 30 分钟倒计时且并发安全;不延长;到期禁止保存;并发保存冲突 409/9807。仅本人。","operationId":"saveAnswers_1","parameters":[{"name":"attemptId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"requestBody":{"content":{"application/json":{"schema":{"$ref":"#/components/schemas/SaveAbilityAnswersRequest"}}},"required":true},"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"403":{"description":"非本人或非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"404":{"description":"答卷不存在(9802)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"400":{"description":"答案非法/未答完整(9805/9806)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"409":{"description":"非法状态/并发/到期(9803/9807)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}}}}},"/review-weight-templates":{"get":{"tags":["student-review-weight-controller"],"operationId":"getTemplates","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListWeightTemplateResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/resume-export-tasks/{taskId}":{"get":{"tags":["简历版本"],"summary":"导出任务状态","description":"仅本人可查询;SUCCESS 含输出文件,FAILED 含失败原因","operationId":"getExportTask","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/resume-export-tasks/{taskId}/download":{"get":{"tags":["简历版本"],"summary":"下载导出产物","description":"仅本人且任务 SUCCESS 可下载;attachment;不暴露内部路径","operationId":"downloadExportTask","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","format":"byte"}}}}}}},"/reports/{id}":{"get":{"tags":["举报"],"summary":"我的举报详情","description":"当前举报人本人或 ADMIN 可查看;其他用户 403/2002。ADMIN 可见处置历史与更完整画像;被举报人无法查看举报人身份。","operationId":"getDetail","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"403":{"description":"非举报人且非 ADMIN(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"404":{"description":"举报不存在(9601)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}}}}},"/reports/me":{"get":{"tags":["举报"],"summary":"我的举报列表","description":"仅返回当前用户创建的举报;支持 status/page/size;不含其他举报人信息、联系方式、消息全文。","operationId":"listMine","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseReportResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseReportResponse"}}}}}}},"/profile/me/talent-invitations":{"get":{"tags":["企业人才邀约"],"summary":"学生收到的邀约列表","operationId":"listStudent","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseStudentTalentInvitationPageResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/profile/me/talent-invitations/{invitationId}":{"get":{"tags":["企业人才邀约"],"summary":"学生邀约详情","operationId":"getStudent","parameters":[{"name":"invitationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseStudentTalentInvitationResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/profile/me/job-recommendations":{"get":{"tags":["job-recommendation-controller"],"operationId":"recommendations","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseJobRecommendationItem"}}}}}}},"/profile/me/data-export-tasks/{taskId}":{"get":{"tags":["个人数据导出"],"summary":"查询个人数据导出任务详情","description":"仅本人;不暴露存储路径与内部字段","operationId":"get_6","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseDataExportTaskResponse"}}}}}}},"/profile/me/data-export-tasks/{taskId}/download":{"get":{"tags":["个人数据导出"],"summary":"下载个人数据导出 ZIP","description":"仅本人且 COMPLETED 未过期可下载;attachment","operationId":"download","parameters":[{"name":"taskId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","format":"byte"}}}}}}},"/profile/me/career-progress":{"get":{"tags":["求职进度"],"summary":"统一求职进度聚合","description":"只读学生端接口:汇总当前学生的投递分页、岗位、下一场面试、最近已提交结构化面试评分、可展示 Offer、同岗位竞争力排名,以及待办/通知计数(仅计数,不含通知详情)。身份仅从 JWT/SecurityContext 获取。","operationId":"getCareerProgress","parameters":[{"name":"page","in":"query","description":"页码,从 0 开始,默认 0","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","description":"每页条数,1–50,默认 20","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"status","in":"query","description":"投递状态过滤,可选 SUBMITTED/VIEWED/INTERVIEW/HIRED/REJECTED/WITHDRAWN","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCareerProgressResponse"}}}},"400":{"description":"page/size/status 参数非法","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCareerProgressResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCareerProgressResponse"}}}},"403":{"description":"非 STUDENT 角色","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCareerProgressResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/profile/me/candidate-scoring":{"get":{"tags":["求职者评分体系"],"summary":"综合评分卡","description":"仅 STUDENT;返回本人 8 维评分、综合分、权重与状态","operationId":"getOverview","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateScoringOverviewResponse"}}}}}}},"/profile/me/candidate-scoring/trend":{"get":{"tags":["求职者评分体系"],"summary":"评分趋势","description":"仅 STUDENT;基于快照按月返回综合分与维度分(months 1-24)","operationId":"getTrend","parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":6}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateScoringTrendResponse"}}}}}}},"/profile/me/candidate-scoring/dimensions/{dimension}":{"get":{"tags":["求职者评分体系"],"summary":"单维度明细","description":"仅 STUDENT;返回某维度分项、归因与数据源;非法 dimension 返回 400","operationId":"getDimensionDetail","parameters":[{"name":"dimension","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseDimensionScoreDetailResponse"}}}}}}},"/profile/me/candidate-scoring/appeals/{appealId}":{"get":{"tags":["评分治理"],"summary":"申诉详情","description":"本人或 ADMIN","operationId":"getAppeal","parameters":[{"name":"appealId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAppealResponse"}}}}}}},"/profile/me/candidate-score-trend":{"get":{"tags":["求职者评分卡"],"summary":"查询评分趋势","description":"仅 STUDENT;返回最近月份的反馈趋势","operationId":"getTrend_1","parameters":[{"name":"months","in":"query","description":"统计月数,默认 6,范围 1-24","required":false,"schema":{"type":"integer","format":"int32","default":6}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateScoreTrendResponse"}}}},"400":{"description":"参数不合法","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateScoreTrendResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"403":{"description":"非 STUDENT 角色","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/profile/me/candidate-score-card":{"get":{"tags":["求职者评分卡"],"summary":"查询求职者评分卡","description":"仅 STUDENT;返回自己的评价聚合卡","operationId":"getScoreCard","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateScoreCardResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"403":{"description":"非 STUDENT 角色","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/profile/me/candidate-percentile":{"get":{"tags":["求职者评分卡"],"summary":"查询百分位","description":"仅 STUDENT;返回自己在候选人中的评分百分位","operationId":"getPercentile","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidatePercentileResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"403":{"description":"非 STUDENT 角色","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/offers/{id}/timeline":{"get":{"tags":["Offer"],"summary":"Offer 状态时间线","description":"完整状态变更历史,含操作者、原因与请求 ID","operationId":"timeline","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListMapStringObject"}}}}}}},"/offers/statistics":{"get":{"tags":["Offer"],"summary":"Offer 统计","description":"仅企业;统计本企业 Offer 状态分布、接受率、平均响应时间","operationId":"statistics","parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":6}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/offers/compare":{"get":{"tags":["Offer"],"summary":"Offer 比较","description":"仅候选人本人;比较 2-5 个非 DRAFT 的 Offer","operationId":"compare","parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListMapStringObject"}}}}}}},"/notifications":{"get":{"tags":["通知"],"summary":"通知列表","description":"当前用户的通知,分页,按时间倒序","operationId":"list_4","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/notifications/unread-count":{"get":{"tags":["通知"],"summary":"未读数","description":"当前用户未读通知数","operationId":"unreadCount","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/{jobId}/reviews/summary":{"get":{"tags":["岗位评价"],"summary":"评分汇总","description":"公开访问;统计 PUBLISHED 评价的平均分、分布和热门标签","operationId":"summary","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/{jobId}/personalized-review-score":{"get":{"tags":["student-review-weight-controller"],"operationId":"getPersonalizedScore","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePersonalizedScoreResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}},"403":{"description":"非 STUDENT 角色","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponse"}}}}}}},"/jobs/{jobId}/match":{"get":{"tags":["岗位匹配"],"summary":"岗位匹配诊断","description":"仅 STUDENT;返回匹配分、硬性条件、缺口和说明","operationId":"diagnose","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/{jobId}/competition-ranking":{"get":{"tags":["同岗位竞争力排名"],"summary":"同岗位竞争力排名","description":"仅 STUDENT 且已投递该岗位;返回本人排名/综合分/百分位/维度/缺口及匿名 Top 5。COMPANY/ADMIN 或未投递学生返回 403;岗位不存在或非 PUBLISHED 返回 404。","operationId":"getRanking","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompetitionRankingResponse"}}}},"400":{"description":"jobId 为空或 <=0","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompetitionRankingResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompetitionRankingResponse"}}}},"403":{"description":"非 STUDENT 或学生未投递该岗位","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompetitionRankingResponse"}}}},"404":{"description":"岗位不存在或非 PUBLISHED","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompetitionRankingResponse"}}}}}}},"/jobs/search":{"get":{"tags":["岗位"],"summary":"岗位高级搜索","description":"仅返回 PUBLISHED 岗位,支持关键词、城市、用工类型、薪资、公司筛选、排序和分页","operationId":"searchJobs","parameters":[{"name":"keyword","in":"query","required":false,"schema":{"type":"string"}},{"name":"city","in":"query","required":false,"schema":{"type":"string"}},{"name":"employmentType","in":"query","required":false,"schema":{"type":"string"}},{"name":"salaryMin","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"salaryMax","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"companyId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/public/{jobId}":{"get":{"tags":["岗位"],"summary":"查询岗位详情(公开)","description":"仅返回 PUBLISHED 岗位详情;CLOSED 也可查看详情","operationId":"getPublicJob","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/filters":{"get":{"tags":["岗位"],"summary":"岗位筛选选项","description":"返回当前 PUBLISHED 岗位可用的城市、用工类型和薪资范围","operationId":"getFilters","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/favorites":{"get":{"tags":["岗位收藏"],"summary":"我的收藏列表","description":"仅 STUDENT;分页,按收藏时间倒序","operationId":"listFavorites","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/jobs/compare":{"get":{"tags":["岗位评价"],"summary":"岗位对比","description":"公开访问;ids 为 2-3 个公开岗位;返回公开岗位字段与公开评分","operationId":"compare_1","parameters":[{"name":"ids","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListMapStringObject"}}}}}}},"/job-recommendation-taxonomies":{"get":{"tags":["job-recommendation-controller"],"operationId":"taxonomies","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListTaxonomyResponse"}}}}}}},"/interviews/{interviewId}/timeline":{"get":{"tags":["面试"],"summary":"面试状态时间线","description":"查看面试状态变更历史","operationId":"timeline_1","parameters":[{"name":"interviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListMapStringObject"}}}}}}},"/interviews/{interviewId}/score/history":{"get":{"tags":["结构化面试评分"],"summary":"评分历史","description":"查看评分快照历史;无历史返回空数组","operationId":"history","parameters":[{"name":"interviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListInterviewScoreHistoryItem"}}}}}}},"/interviews/me":{"get":{"tags":["面试"],"summary":"我的面试列表","description":"查看当前用户相关的面试,支持 status/from/to 筛选和分页","operationId":"listMyInterviews","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/info":{"get":{"tags":["系统"],"summary":"应用信息","description":"返回应用版本、运行时信息","operationId":"info","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/health":{"get":{"tags":["系统"],"summary":"应用健康检查","description":"返回应用及依赖服务状态","operationId":"health","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/health/details":{"get":{"tags":["health-controller"],"operationId":"healthDetails","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/conversations/{id}":{"get":{"tags":["消息"],"summary":"会话详情","description":"查看会话信息和未读数","operationId":"getConversation","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/conversations/{id}/messages":{"get":{"tags":["消息"],"summary":"消息列表","description":"分页查询会话消息,倒序;仅成员可查看","operationId":"listMessages","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMessagePageResponse"}}}}}}},"/company/scoring/dashboard/trend":{"get":{"tags":["评分运营看板"],"summary":"企业评分趋势","description":"仅 COMPANY;months 1–24","operationId":"getTrend_2","parameters":[{"name":"months","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":6}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseScoreTrendResponse"}}}}}}},"/company/scoring/dashboard/overview":{"get":{"tags":["评分运营看板"],"summary":"企业评分运营概览","description":"仅 COMPANY;只返回本企业数据","operationId":"getOverview_1","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseDashboardOverviewResponse"}}}}}}},"/company/scoring/dashboard/job-rankings":{"get":{"tags":["评分运营看板"],"summary":"岗位评分排名","description":"仅 COMPANY;avgRating DESC, jobId DESC;审核通过评价","operationId":"getJobRankings","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseJobRankingListResponse"}}}}}}},"/company/scoring/dashboard/job-rankings/{jobId}":{"get":{"tags":["评分运营看板"],"summary":"单岗位评分排名","description":"仅 COMPANY;跨企业 403/8004","operationId":"getJobRanking","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseJobRankingItem"}}}}}}},"/company/scoring/dashboard/candidate-rankings":{"get":{"tags":["评分运营看板"],"summary":"候选人评分排名","description":"仅 COMPANY;按学生去重;overallScore DESC, applicationId DESC","operationId":"getCandidateRankings","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateRankingListResponse"}}}}}}},"/company/scoring/dashboard/candidate-rankings/{applicationId}":{"get":{"tags":["评分运营看板"],"summary":"单候选人评分排名明细","description":"仅 COMPANY;跨企业 403/8004","operationId":"getCandidateRanking","parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateRankingDetailResponse"}}}}}}},"/company/candidates":{"get":{"tags":["投递"],"summary":"企业候选人列表","description":"跨岗位查询本企业所有候选人投递,支持按岗位、状态、关键词筛选,支持分页和排序","operationId":"listCompanyCandidates","parameters":[{"name":"jobId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"keyword","in":"query","required":false,"schema":{"type":"string"}},{"name":"sort","in":"query","required":false,"schema":{"type":"string"}},{"name":"order","in":"query","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateListResponse"}}}}}}},"/company/candidates/{applicationId}":{"get":{"tags":["投递"],"summary":"企业候选人详情","description":"查看投递详情及候选人公开资料,只能查看本企业岗位下的投递","operationId":"getCompanyCandidateDetail","parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCandidateDetailView"}}}}}}},"/company/candidates/{applicationId}/scoring":{"get":{"tags":["求职者评分体系"],"summary":"企业候选人评分卡","description":"仅岗位所属企业;只读,仅返回 applicationId/overallScore/status/dimensions/generatedAt/rulesVersion,不泄露候选人敏感信息","operationId":"getCompanyScoring","parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompanyCandidateScoringResponse"}}}}}}},"/company/candidates/{applicationId}/resume":{"get":{"tags":["投递"],"summary":"企业下载候选人简历","description":"按候选人隐私设置授权后返回简历文件流;不返回存储路径、学生 ID 或联系方式","operationId":"downloadCandidateResume","parameters":[{"name":"applicationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"type":"string","format":"byte"}}}}}}},"/company/applications":{"get":{"tags":["投递"],"summary":"查看岗位投递列表(企业)","description":"企业查看自己发布的某个岗位收到的投递,支持 status 筛选和分页","operationId":"listCompanyApplications","parameters":[{"name":"jobId","in":"query","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/companies/{companyId}":{"get":{"tags":["企业"],"summary":"查询企业公开详情","description":"匿名可访问,仅返回 6 个公开字段","operationId":"getPublicCompany","parameters":[{"name":"companyId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompanyPublicView"}}}}}}},"/companies/{companyId}/jobs":{"get":{"tags":["企业"],"summary":"查询企业公开岗位列表","description":"匿名可访问,仅返回 PUBLISHED 岗位","operationId":"getCompanyJobs","parameters":[{"name":"companyId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"sort","in":"query","required":false,"schema":{"type":"string","default":"latest"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/companies/me/talent-invitations":{"get":{"tags":["企业人才邀约"],"summary":"企业邀约列表","operationId":"listCompany","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompanyTalentInvitationPageResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/companies/me/talent-invitations/{invitationId}":{"get":{"tags":["企业人才邀约"],"summary":"企业邀约详情","operationId":"getCompany","parameters":[{"name":"invitationId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompanyTalentInvitationResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/companies/me/onboarding":{"get":{"tags":["企业"],"summary":"查询企业入驻状态","description":"返回当前企业资料、认证状态和允许动作","operationId":"getMyOnboarding","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompanyOnboardingResponse"}}}}}}},"/companies/me/jobs/{jobId}/talent-recommendations":{"get":{"tags":["企业人才发现"],"summary":"查询岗位人才发现推荐","description":"仅已认证企业可查询本人已发布且具备审核通过画像的岗位;候选卡不包含学生身份或测评详情。","operationId":"recommendations_1","parameters":[{"name":"jobId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseTalentDiscoveryPageResponse"}}}}},"security":[{"bearerAuth":[]}]}},"/companies/me/job-reviews":{"get":{"tags":["企业评价管理"],"summary":"企业评价列表","description":"仅岗位所属 COMPANY;分页查看本企业岗位评价与回复状态","operationId":"list_5","parameters":[{"name":"jobId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"rating","in":"query","required":false,"schema":{"type":"integer","format":"int32"}},{"name":"reviewModerationStatus","in":"query","required":false,"schema":{"type":"string"}},{"name":"replyStatus","in":"query","required":false,"schema":{"type":"string"}},{"name":"createdFrom","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdTo","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReviewReplyPageResponse"}}}}}}},"/companies/me/job-reviews/{reviewId}":{"get":{"tags":["企业评价管理"],"summary":"企业评价详情","description":"仅岗位所属 COMPANY;不返回评价作者身份","operationId":"detail","parameters":[{"name":"reviewId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseCompanyReviewDetailResponse"}}}}}}},"/blocks/me":{"get":{"tags":["屏蔽"],"summary":"我的屏蔽列表","description":"仅返回当前用户主动屏蔽的目标安全画像,不含对方联系方式/密码/简历地址。","operationId":"listMine_1","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseBlockRelationResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseBlockRelationResponse"}}}}}}},"/auth/me":{"get":{"tags":["认证"],"summary":"当前用户信息","description":"需要 JWT 认证","operationId":"me","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/assessments/{type}/questions":{"get":{"tags":["RIASEC 职业兴趣测评"],"summary":"题目列表","description":"返回指定测评的 ACTIVE 题目,隐藏维度/reverseScored/source/版本等内部字段。","operationId":"listQuestions","parameters":[{"name":"type","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListAssessmentQuestionResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListAssessmentQuestionResponse"}}}},"404":{"description":"测评类型不存在(9701)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListAssessmentQuestionResponse"}}}}}}},"/assessments/types":{"get":{"tags":["RIASEC 职业兴趣测评"],"summary":"测评类型列表","description":"返回全部 ACTIVE 测评定义。任意已登录用户可访问;未登录 401。","operationId":"listTypes","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListAssessmentTypeResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListAssessmentTypeResponse"}}}}}}},"/assessments/me":{"get":{"tags":["RIASEC 职业兴趣测评"],"summary":"我的测评历史","description":"分页返回当前学生的全部答卷与结果概要。仅 STUDENT 本人可访问。","operationId":"listMine_2","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseAssessmentHistoryItem"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseAssessmentHistoryItem"}}}},"403":{"description":"非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseAssessmentHistoryItem"}}}}}}},"/assessments/attempts/{attemptId}":{"get":{"tags":["RIASEC 职业兴趣测评"],"summary":"答卷详情","description":"返回本次抽中的 30 道题(固定顺序)、已保存答案、进度与当前状态。仅本人可访问;非 STUDENT 403。","operationId":"getAttempt","parameters":[{"name":"attemptId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}},"403":{"description":"非本人或非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}},"404":{"description":"答卷不存在(9702)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentAttemptResponse"}}}}}}},"/assessments/attempts/{attemptId}/result":{"get":{"tags":["RIASEC 职业兴趣测评"],"summary":"查看结果","description":"答卷 COMPLETED 后返回聚合分、类型排名、探索方向。仅本人可访问。","operationId":"getResult","parameters":[{"name":"attemptId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentResultResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentResultResponse"}}}},"403":{"description":"非本人或非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentResultResponse"}}}},"404":{"description":"答卷不存在(9702)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentResultResponse"}}}},"409":{"description":"答卷未完成(9703)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAssessmentResultResponse"}}}}}}},"/applications/{id}":{"get":{"tags":["投递"],"summary":"投递详情","description":"查看自己的投递记录详情","operationId":"getApplication","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/applications/{id}/timeline":{"get":{"tags":["投递"],"summary":"投递状态时间线","description":"学生本人或岗位所属企业可查看状态变更历史","operationId":"timeline_2","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListMapStringObject"}}}}}}},"/applications/{id}/match":{"get":{"tags":["双向匹配"],"summary":"查询投递匹配状态","description":"仅投递求职者或岗位所属企业;不暴露内部路径/事件 ID","operationId":"getMatch","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/applications/me":{"get":{"tags":["投递"],"summary":"我的投递列表","description":"查看当前学生自己的投递记录,支持 status 筛选和分页","operationId":"listMyApplications","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/admin/scoring/risk/trend":{"get":{"tags":["风险治理"],"summary":"风险趋势(ADMIN)","operationId":"trend","parameters":[{"name":"bucket","in":"query","required":true,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskTrendResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskTrendResponse"}}}},"403":{"description":"非 ADMIN(2002/4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskTrendResponse"}}}},"400":{"description":"非法 bucket/筛选(9906)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskTrendResponse"}}}}}}},"/admin/scoring/risk/rules":{"get":{"tags":["风险治理"],"summary":"风险规则列表(ADMIN)","operationId":"rules","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListRiskRuleResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListRiskRuleResponse"}}}},"403":{"description":"非 ADMIN(2002/4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListRiskRuleResponse"}}}}}}},"/admin/scoring/risk/overview":{"get":{"tags":["风险治理"],"summary":"风险概览(ADMIN)","operationId":"overview","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskOverviewResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskOverviewResponse"}}}},"403":{"description":"非 ADMIN(2002/4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskOverviewResponse"}}}},"400":{"description":"非法筛选(9906)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskOverviewResponse"}}}}}}},"/admin/scoring/risk/events":{"get":{"tags":["风险治理"],"summary":"风险事件分页(ADMIN)","operationId":"events","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"severity","in":"query","required":false,"schema":{"type":"string"}},{"name":"ruleCode","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseRiskEventResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseRiskEventResponse"}}}},"403":{"description":"非 ADMIN(2002/4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseRiskEventResponse"}}}},"400":{"description":"非法筛选/分页(9906/1001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseRiskEventResponse"}}}}}}},"/admin/scoring/risk/distribution":{"get":{"tags":["风险治理"],"summary":"风险分布(ADMIN)","operationId":"distribution","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskDistributionResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskDistributionResponse"}}}},"403":{"description":"非 ADMIN(2002/4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskDistributionResponse"}}}},"400":{"description":"非法筛选(9906)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseRiskDistributionResponse"}}}}}}},"/admin/scoring/fairness/ranking-stability":{"get":{"tags":["评分公平性监测"],"summary":"排名稳定性","description":"仅 ADMIN;当前没有持久化排名快照,返回 UNAVAILABLE","operationId":"rankingStability","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseUnavailable"}}}}}}},"/admin/scoring/fairness/overview":{"get":{"tags":["评分公平性监测"],"summary":"评分完整性概览","description":"仅 ADMIN;按现存月度快照聚合,样本不足时隐藏统计明细","operationId":"overview_1","parameters":[{"name":"period","in":"query","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseOverview"}}}}}}},"/admin/scoring/fairness/drift":{"get":{"tags":["评分公平性监测"],"summary":"评分历史漂移","description":"仅 ADMIN;当前快照可覆盖,历史漂移暂不可计算","operationId":"drift","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseUnavailable"}}}}}}},"/admin/scoring/fairness/dimensions":{"get":{"tags":["评分公平性监测"],"summary":"评分维度分布","description":"仅 ADMIN;dimension 仅允许八个评分维度","operationId":"dimensions","parameters":[{"name":"period","in":"query","required":true,"schema":{"type":"string"}},{"name":"dimension","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseDimensions"}}}}}}},"/admin/scoring/fairness/appeals":{"get":{"tags":["评分公平性监测"],"summary":"申诉纠错聚合","description":"仅 ADMIN;按申诉创建队列聚合,隐藏小样本明细","operationId":"appeals","parameters":[{"name":"from","in":"query","required":false,"schema":{"type":"string"}},{"name":"to","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAppeals"}}}}}}},"/admin/scoring/dashboard/overview":{"get":{"tags":["评分运营看板"],"summary":"全局运营概览","description":"仅 ADMIN","operationId":"getAdminOverview","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAdminDashboardOverviewResponse"}}}}}}},"/admin/reviews/pending":{"get":{"tags":["评价审核"],"summary":"待审评价列表","description":"仅 ADMIN;分页 + jobId/riskLevel/createdFrom/createdTo 筛选;不返回明文 IP/UA","operationId":"pending","parameters":[{"name":"jobId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"riskLevel","in":"query","required":false,"schema":{"type":"string"}},{"name":"createdFrom","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdTo","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/admin/reviews/history":{"get":{"tags":["评价审核"],"summary":"审核历史","description":"仅 ADMIN;分页返回审核结果、审核人、时间与原因","operationId":"history_1","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/admin/review-replies/pending":{"get":{"tags":["官方回复审核"],"summary":"待审官方回复","description":"仅 ADMIN;分页查看风险回复","operationId":"pending_1","parameters":[{"name":"companyId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"jobId","in":"query","required":false,"schema":{"type":"integer","format":"int64"}},{"name":"riskLevel","in":"query","required":false,"schema":{"type":"string"}},{"name":"createdFrom","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"createdTo","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAdminReviewReplyPageResponse"}}}}}}},"/admin/reports":{"get":{"tags":["举报管理"],"summary":"举报列表(ADMIN)","description":"仅 ADMIN;支持 status/targetType/category/page/size 筛选;响应脱敏。","operationId":"adminList","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"targetType","in":"query","required":false,"schema":{"type":"string"}},{"name":"category","in":"query","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseReportResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseReportResponse"}}}},"403":{"description":"非 ADMIN(2002/4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseReportResponse"}}}}}}},"/admin/reports/{id}":{"get":{"tags":["举报管理"],"summary":"举报详情(ADMIN)","description":"仅 ADMIN;可见脱敏证据、MESSAGE 脱敏内容、会话上下文最小信息与处置历史;不返回密码/JWT/手机号/邮箱/resumeUrl。","operationId":"adminDetail","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"403":{"description":"非 ADMIN(2002/4001)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}},"404":{"description":"举报不存在(9601)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseReportResponse"}}}}}}},"/admin/job-recommendation-profiles":{"get":{"tags":["job-recommendation-controller"],"operationId":"adminProfiles","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}},{"name":"status","in":"query","required":false,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseRecommendationProfileResponse"}}}}}}},"/admin/companies/verifications":{"get":{"tags":["企业认证"],"summary":"待审核认证列表","description":"管理员查看认证申请列表,支持 status/from/to 筛选和分页","operationId":"listVerifications","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"from","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"to","in":"query","required":false,"schema":{"type":"string","format":"date-time"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/admin/companies/verifications/{id}":{"get":{"tags":["企业认证"],"summary":"认证详情","description":"管理员查看认证申请详情","operationId":"getDetail_1","parameters":[{"name":"id","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/admin/companies/verifications/history":{"get":{"tags":["企业认证"],"summary":"认证审核历史","description":"管理员查看某个认证申请的审核历史","operationId":"listHistory","parameters":[{"name":"verificationId","in":"query","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListMapStringObject"}}}}}}},"/admin/candidate-scoring/snapshots/{candidateUserId}/{dimension}/{period}/history":{"get":{"tags":["评分治理"],"summary":"快照变更审计","description":"仅 ADMIN;按学生+维度+周期查看回滚前后完整变化","operationId":"getSnapshotHistory","parameters":[{"name":"candidateUserId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}},{"name":"dimension","in":"path","required":true,"schema":{"type":"string"}},{"name":"period","in":"path","required":true,"schema":{"type":"string"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListSnapshotHistoryItem"}}}}}}},"/admin/candidate-scoring/appeals":{"get":{"tags":["评分治理"],"summary":"全部申诉列表","description":"仅 ADMIN","operationId":"listAllAppeals","parameters":[{"name":"status","in":"query","required":false,"schema":{"type":"string"}},{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}},"/admin/candidate-scoring/appeals/{appealId}/history":{"get":{"tags":["评分治理"],"summary":"申诉历史","description":"本人(脱敏,无 actorUserId)或 ADMIN(全量);此路径的本人放行先于 ADMIN 通用规则","operationId":"getAppealHistory","parameters":[{"name":"appealId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListAppealHistoryItem"}}}}}}},"/abilities/types":{"get":{"tags":["四维能力测评"],"summary":"能力测评类型列表","description":"返回全部 ACTIVE 能力测评定义,不返回题库/答案/评分规则。任意已登录用户。","operationId":"listTypes_1","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListAbilityTypeResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseListAbilityTypeResponse"}}}}}}},"/abilities/me":{"get":{"tags":["四维能力测评"],"summary":"我的能力测评历史","description":"分页返回当前学生全部答卷与结果概要。仅 STUDENT 本人。","operationId":"listMine_3","parameters":[{"name":"page","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":0}},{"name":"size","in":"query","required":false,"schema":{"type":"integer","format":"int32","default":20}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseAbilityHistoryItem"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseAbilityHistoryItem"}}}},"403":{"description":"非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponsePageResponseAbilityHistoryItem"}}}}}}},"/abilities/attempts/{attemptId}":{"get":{"tags":["四维能力测评"],"summary":"能力答卷详情","description":"返回本次 24 道题(固定顺序)、已选答案、进度与倒计时。仅本人;超时自动标 EXPIRED。","operationId":"getAttempt_1","parameters":[{"name":"attemptId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"403":{"description":"非本人或非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}},"404":{"description":"答卷不存在(9802)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityAttemptResponse"}}}}}}},"/abilities/attempts/{attemptId}/result":{"get":{"tags":["四维能力测评"],"summary":"查看能力测评结果","description":"返回四维分、综合分、短板、提升建议、雷达与每题解析。仅本人;未生成结果 404/9804。","operationId":"getResult_1","parameters":[{"name":"attemptId","in":"path","required":true,"schema":{"type":"integer","format":"int64"}}],"responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityResultResponse"}}}},"401":{"description":"未登录","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityResultResponse"}}}},"403":{"description":"非本人或非 STUDENT(2002)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityResultResponse"}}}},"404":{"description":"结果不存在(9804)","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseAbilityResultResponse"}}}}}}},"/":{"get":{"tags":["API"],"summary":"API 信息","description":"返回 API v0.1 基本信息","operationId":"index","responses":{"200":{"description":"OK","content":{"*/*":{"schema":{"$ref":"#/components/schemas/ApiResponseMapStringObject"}}}}}}}},"components":{"schemas":{"StudentProfileUpdateRequest":{"type":"object","properties":{"realName":{"type":"string","maxLength":50,"minLength":0},"bio":{"type":"string"},"location":{"type":"string","maxLength":100,"minLength":0},"education":{"type":"string","maxLength":100,"minLength":0},"school":{"type":"string","maxLength":150,"minLength":0},"graduationYear":{"type":"integer","format":"int32"},"resumeUrl":{"type":"string","maxLength":500,"minLength":0},"skills":{"type":"array","items":{"type":"string"}}}},"ApiResponseMapStringObject":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"object","additionalProperties":{}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"TalentDiscoveryPreferenceUpdateRequest":{"type":"object","properties":{"enabled":{"type":"boolean","description":"是否允许进入企业人才发现候选池"},"expectedVersion":{"type":"integer","format":"int64","description":"期望的当前版本;首次创建可省略或传 0"}},"required":["enabled"]},"SaveWeightRequest":{"type":"object","properties":{"templateCode":{"type":"string"},"weights":{"type":"object","additionalProperties":{"type":"number"}}}},"ApiResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"ApiResponseReviewWeightResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/ReviewWeightResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"ReviewWeightResponse":{"type":"object","properties":{"source":{"type":"string"},"templateCode":{"type":"string"},"configuredWeights":{"type":"object","additionalProperties":{"type":"number"}},"updatedAt":{"type":"string","format":"date-time"}}},"PrivacySettingsUpdateRequest":{"type":"object","properties":{"resumeVisibility":{"type":"string","description":"简历可见性(必填)","enum":["PRIVATE","APPLIED_COMPANIES","VERIFIED_COMPANIES"],"example":"APPLIED_COMPANIES"},"contactVisible":{"type":"boolean","description":"联系方式是否对企业可见(必填)","example":true},"version":{"type":"integer","format":"int64","description":"乐观锁版本号(可选);不传或传 0 表示非严格校验","example":0}},"required":["contactVisible","resumeVisibility"]},"StudentPreferenceRequest":{"type":"object","properties":{"expectedSalaryMin":{"type":"integer","format":"int32","minimum":0},"expectedSalaryMax":{"type":"integer","format":"int32","minimum":0},"preferredCities":{"type":"array","items":{"type":"string","maxLength":100,"minLength":1},"maxItems":20,"minItems":0},"employmentTypes":{"type":"array","items":{"type":"string","maxLength":100,"minLength":1},"maxItems":20,"minItems":0},"preferredIndustries":{"type":"array","items":{"type":"string","maxLength":100,"minLength":1},"maxItems":20,"minItems":0},"preferredJobTypes":{"type":"array","items":{"type":"string","maxLength":100,"minLength":1},"maxItems":20,"minItems":0},"remoteAllowed":{"type":"boolean"},"salaryRangeValid":{"type":"boolean"}}},"StudentMatchRuleRequest":{"type":"object","properties":{"requiredHrScore":{"type":"integer","format":"int32","maximum":100,"minimum":0}},"required":["requiredHrScore"]},"OfferUpdateRequest":{"type":"object","properties":{"title":{"type":"string","maxLength":120,"minLength":0},"salaryMin":{"type":"integer","format":"int32","minimum":0},"salaryMax":{"type":"integer","format":"int32","minimum":0},"salaryCurrency":{"type":"string","maxLength":10,"minLength":0},"salaryPeriod":{"type":"string","pattern":"^(MONTH|YEAR|HOUR)$"},"workCity":{"type":"string","maxLength":80,"minLength":0},"employmentType":{"type":"string","pattern":"^(FULL_TIME|PART_TIME|INTERN|INTERNSHIP)$"},"probationMonths":{"type":"integer","format":"int32","minimum":0},"benefits":{"type":"string","maxLength":2000,"minLength":0},"description":{"type":"string","maxLength":5000,"minLength":0},"expireAt":{"type":"string","format":"date-time"},"onboardingDate":{"type":"string","format":"date"},"baseSalary":{"type":"integer","format":"int32","minimum":0},"housingAllowance":{"type":"integer","format":"int32","minimum":0},"annualBonusMonths":{"type":"integer","format":"int32","minimum":0},"otherAllowances":{"type":"string","maxLength":1000,"minLength":0}}},"JobUpdateRequest":{"type":"object","properties":{"title":{"type":"string","maxLength":120,"minLength":0},"description":{"type":"string"},"requirements":{"type":"string"},"city":{"type":"string","maxLength":80,"minLength":0},"employmentType":{"type":"string","maxLength":30,"minLength":0},"salaryMin":{"type":"integer","format":"int32"},"salaryMax":{"type":"integer","format":"int32"}}},"JobReviewUpdateRequest":{"type":"object","properties":{"rating":{"type":"integer","format":"int32","maximum":5,"minimum":1},"content":{"type":"string","maxLength":1000,"minLength":1},"tags":{"type":"array","items":{"type":"string","maxLength":50,"minLength":1},"maxItems":10,"minItems":0},"status":{"type":"string","pattern":"^(PUBLISHED|HIDDEN)$"},"dimensionScores":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}}}},"InterviewUpdateRequest":{"type":"object","properties":{"title":{"type":"string"},"startAt":{"type":"string","format":"date-time"},"endAt":{"type":"string","format":"date-time"},"timezone":{"type":"string"},"meetingUrl":{"type":"string"},"address":{"type":"string"},"interviewerName":{"type":"string"},"notes":{"type":"string"},"timeRangeValid":{"type":"boolean"}}},"InterviewScoreSaveRequest":{"type":"object","properties":{"technicalScore":{"type":"integer","format":"int32","maximum":5,"minimum":1},"communicationScore":{"type":"integer","format":"int32","maximum":5,"minimum":1},"problemSolvingScore":{"type":"integer","format":"int32","maximum":5,"minimum":1},"roleFitScore":{"type":"integer","format":"int32","maximum":5,"minimum":1},"professionalismScore":{"type":"integer","format":"int32","maximum":5,"minimum":1},"recommendation":{"type":"string","maxLength":20,"minLength":0},"comment":{"type":"string","maxLength":2000,"minLength":0}}},"ApiResponseInterviewScoreResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/InterviewScoreResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"InterviewScoreResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"interviewId":{"type":"integer","format":"int64"},"applicationId":{"type":"integer","format":"int64"},"status":{"type":"string"},"technicalScore":{"type":"integer","format":"int32"},"communicationScore":{"type":"integer","format":"int32"},"problemSolvingScore":{"type":"integer","format":"int32"},"roleFitScore":{"type":"integer","format":"int32"},"professionalismScore":{"type":"integer","format":"int32"},"overallScore":{"type":"number"},"recommendation":{"type":"string"},"comment":{"type":"string"},"submittedAt":{"type":"string","format":"date-time"},"version":{"type":"integer","format":"int64"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"CompanyUpdateRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":120,"minLength":0},"logoUrl":{"type":"string","maxLength":500,"minLength":0},"description":{"type":"string"},"industry":{"type":"string","maxLength":80,"minLength":0},"website":{"type":"string","maxLength":255,"minLength":0},"address":{"type":"string","maxLength":255,"minLength":0}},"required":["name"]},"CompanyMatchRuleRequest":{"type":"object","properties":{"requiredCandidateScore":{"type":"integer","format":"int32","maximum":100,"minimum":0}},"required":["requiredCandidateScore"]},"RecommendationProfileRequest":{"type":"object","properties":{"industryCode":{"type":"string","minLength":1},"jobFamilyCode":{"type":"string","minLength":1},"riasecWeights":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"abilityExpectations":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"enabled":{"type":"boolean"},"expectedVersion":{"type":"integer","format":"int64"}},"required":["enabled","expectedVersion","industryCode","jobFamilyCode"]},"ApiResponseRecommendationProfileResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/RecommendationProfileResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"RecommendationProfileResponse":{"type":"object","properties":{"jobId":{"type":"integer","format":"int64"},"industryCode":{"type":"string"},"jobFamilyCode":{"type":"string"},"riasecWeights":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"abilityExpectations":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"enabled":{"type":"boolean"},"reviewStatus":{"type":"string"},"reviewReason":{"type":"string"},"version":{"type":"integer","format":"int64"},"updatedAt":{"type":"string","format":"date-time"}}},"UpdateCompanyReviewReplyRequest":{"type":"object","properties":{"content":{"type":"string","maxLength":500,"minLength":1},"expectedVersion":{"type":"integer","format":"int64"}},"required":["expectedVersion"]},"ApiResponseCompanyReviewReplyResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CompanyReviewReplyResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CompanyReviewReplyResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"content":{"type":"string"},"status":{"type":"string"},"version":{"type":"integer","format":"int64"},"updatedAt":{"type":"string","format":"date-time"},"rejectionReason":{"type":"string"}}},"ApiResponseBlockRelationResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/BlockRelationResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"BlockRelationResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"blockedUserId":{"type":"integer","format":"int64"},"nickname":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}},"ScoreRequest":{"type":"object","properties":{"score":{"type":"integer","format":"int32","maximum":100,"minimum":0}},"required":["score"]},"CandidateFeedbackRequest":{"type":"object","properties":{"rating":{"type":"integer","format":"int32","maximum":5,"minimum":1},"content":{"type":"string","maxLength":1000,"minLength":0},"tags":{"type":"array","items":{"type":"string","maxLength":50,"minLength":1},"maxItems":10,"minItems":0}},"required":["content","rating"]},"ApiResponseCandidateFeedbackResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CandidateFeedbackResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CandidateFeedbackResponse":{"type":"object","description":"脱敏后的候选人反馈","properties":{"id":{"type":"integer","format":"int64","description":"反馈 ID","example":1},"applicationId":{"type":"integer","format":"int64","description":"投递 ID","example":31},"rating":{"type":"integer","format":"int32","description":"评分,范围 1-5","example":5},"content":{"type":"string","description":"反馈内容","example":"沟通良好"},"tags":{"type":"array","description":"反馈标签","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time","description":"创建时间","example":"2026-08-25T10:00:00"},"updatedAt":{"type":"string","format":"date-time","description":"更新时间","example":"2026-08-25T10:00:00"}}},"RiskRuleUpdateRequest":{"type":"object","properties":{"enabled":{"type":"boolean"},"thresholdCount":{"type":"integer","format":"int32","maximum":100,"minimum":1},"windowMinutes":{"type":"integer","format":"int32","maximum":1440,"minimum":1},"severity":{"type":"string"},"expectedVersion":{"type":"integer","format":"int64"}},"required":["enabled","expectedVersion","severity","thresholdCount","windowMinutes"]},"ApiResponseRiskRuleResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/RiskRuleResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"RiskRuleResponse":{"type":"object","properties":{"ruleCode":{"type":"string"},"sourceAction":{"type":"string"},"thresholdCount":{"type":"integer","format":"int32"},"windowMinutes":{"type":"integer","format":"int32"},"severity":{"type":"string"},"enabled":{"type":"boolean"},"version":{"type":"integer","format":"int64"}}},"CreateReportRequest":{"type":"object","description":"提交举报请求","properties":{"targetType":{"type":"string","description":"举报目标类型:USER / MESSAGE","example":"USER","minLength":1,"pattern":"USER|MESSAGE"},"targetUserId":{"type":"integer","format":"int64","description":"目标用户ID(targetType=USER 时必填)","example":5},"messageId":{"type":"integer","format":"int64","description":"目标消息ID(targetType=MESSAGE 时必填)","example":101},"category":{"type":"string","description":"举报分类","example":"HARASSMENT","maxLength":40,"minLength":0},"reason":{"type":"string","description":"举报理由","example":"对方持续发送骚扰消息","maxLength":1000,"minLength":1},"evidenceUrls":{"type":"array","description":"证据URL列表(最多5个,仅 http/https,最长500字符)","items":{"type":"string","maxLength":500,"minLength":0},"maxItems":5,"minItems":0},"idempotencyKey":{"type":"string","description":"幂等键(可选,最长64字符)","maxLength":64,"minLength":0}},"required":["category","reason","targetType"]},"ApiResponseReportResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/ReportResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"DecisionHistoryItem":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"fromStatus":{"type":"string"},"toStatus":{"type":"string"},"actorUserId":{"type":"integer","format":"int64"},"actorRole":{"type":"string"},"note":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}},"ReportResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"targetType":{"type":"string"},"targetUserId":{"type":"integer","format":"int64"},"messageId":{"type":"integer","format":"int64"},"reportedUserId":{"type":"integer","format":"int64"},"category":{"type":"string"},"reason":{"type":"string"},"evidenceUrls":{"type":"array","items":{"type":"string"}},"status":{"type":"string"},"decision":{"type":"string"},"decisionNote":{"type":"string"},"decidedAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"messagePreview":{"type":"string"},"reportedUser":{"$ref":"#/components/schemas/ReportedUser"},"history":{"type":"array","items":{"$ref":"#/components/schemas/DecisionHistoryItem"}}}},"ReportedUser":{"type":"object","properties":{"userId":{"type":"integer","format":"int64"},"nickname":{"type":"string"},"role":{"type":"string"}}},"TalentInvitationDecisionRequest":{"type":"object","properties":{"decision":{"type":"string","minLength":1,"pattern":"^(ACCEPT|REJECT)$"},"expectedVersion":{"type":"integer","format":"int64"}},"required":["decision","expectedVersion"]},"RecommendationFeedbackRequest":{"type":"object","properties":{"feedbackType":{"type":"string","minLength":1},"reasonType":{"type":"string"},"idempotencyKey":{"type":"string","minLength":1},"expectedVersion":{"type":"integer","format":"int64"}},"required":["expectedVersion","feedbackType","idempotencyKey"]},"ApiResponseRecommendationFeedbackResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/RecommendationFeedbackResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"RecommendationFeedbackResponse":{"type":"object","properties":{"jobId":{"type":"integer","format":"int64"},"feedbackType":{"type":"string"},"reasonType":{"type":"string"},"status":{"type":"string"},"version":{"type":"integer","format":"int64"}}},"CreateDataExportRequest":{"type":"object","properties":{"format":{"type":"string"},"idempotencyKey":{"type":"string","maxLength":64,"minLength":0}}},"ApiResponseDataExportTaskResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/DataExportTaskResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"DataExportTaskResponse":{"type":"object","properties":{"taskId":{"type":"integer","format":"int64"},"status":{"type":"string"},"format":{"type":"string"},"requestedAt":{"type":"string","format":"date-time"},"startedAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"sizeBytes":{"type":"integer","format":"int64"},"downloadAvailable":{"type":"boolean"},"errorCode":{"type":"string"}}},"CreateAppealRequest":{"type":"object","properties":{"dimension":{"type":"string","minLength":1},"period":{"type":"string","minLength":1},"reason":{"type":"string"},"idempotencyKey":{"type":"string","maxLength":64,"minLength":0}},"required":["dimension","period"]},"ApiResponseAppealResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/AppealResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"AppealResponse":{"type":"object","properties":{"appealId":{"type":"integer","format":"int64"},"candidateId":{"type":"integer","format":"int64"},"dimension":{"type":"string"},"period":{"type":"string"},"status":{"type":"string"},"reason":{"type":"string"},"decision":{"type":"string"},"decisionReason":{"type":"string"},"reviewerId":{"type":"integer","format":"int64"},"reviewedAt":{"type":"string","format":"date-time"},"rollbackAt":{"type":"string","format":"date-time"},"scoreAtAppeal":{"type":"number"},"snapshotVersionAtAppeal":{"type":"integer","format":"int64"},"rulesVersion":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"OfferCreateRequest":{"type":"object","properties":{"applicationId":{"type":"integer","format":"int64"},"title":{"type":"string","maxLength":120,"minLength":0},"salaryMin":{"type":"integer","format":"int32","minimum":0},"salaryMax":{"type":"integer","format":"int32","minimum":0},"salaryCurrency":{"type":"string","maxLength":10,"minLength":0},"salaryPeriod":{"type":"string","pattern":"^(MONTH|YEAR|HOUR)$"},"workCity":{"type":"string","maxLength":80,"minLength":0},"employmentType":{"type":"string","pattern":"^(FULL_TIME|PART_TIME|INTERN|INTERNSHIP)$"},"probationMonths":{"type":"integer","format":"int32","minimum":0},"benefits":{"type":"string","maxLength":2000,"minLength":0},"description":{"type":"string","maxLength":5000,"minLength":0},"expireAt":{"type":"string","format":"date-time"},"onboardingDate":{"type":"string","format":"date"},"baseSalary":{"type":"integer","format":"int32","minimum":0},"housingAllowance":{"type":"integer","format":"int32","minimum":0},"annualBonusMonths":{"type":"integer","format":"int32","minimum":0},"otherAllowances":{"type":"string","maxLength":1000,"minLength":0}},"required":["applicationId","description","expireAt","title","workCity"]},"CounterOfferCreateRequest":{"type":"object","properties":{"proposedSalaryMin":{"type":"integer","format":"int32","minimum":0},"proposedSalaryMax":{"type":"integer","format":"int32","minimum":0},"proposedOnboardingDate":{"type":"string","format":"date"},"reason":{"type":"string","maxLength":2000,"minLength":0}}},"JobCreateRequest":{"type":"object","properties":{"title":{"type":"string","maxLength":120,"minLength":0},"description":{"type":"string","minLength":1},"requirements":{"type":"string"},"city":{"type":"string","maxLength":80,"minLength":0},"employmentType":{"type":"string","maxLength":30,"minLength":0},"salaryMin":{"type":"integer","format":"int32"},"salaryMax":{"type":"integer","format":"int32"}},"required":["city","description","employmentType","title"]},"JobReviewCreateRequest":{"type":"object","properties":{"rating":{"type":"integer","format":"int32","maximum":5,"minimum":1},"content":{"type":"string","maxLength":1000,"minLength":0},"tags":{"type":"array","items":{"type":"string","maxLength":50,"minLength":1},"maxItems":10,"minItems":0},"dimensionScores":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}}},"required":["content","rating"]},"InterviewRespondRequest":{"type":"object","properties":{"action":{"type":"string","minLength":1},"reason":{"type":"string"}},"required":["action"]},"InterviewCancelRequest":{"type":"object","properties":{"reason":{"type":"string"}}},"CreateConversationRequest":{"type":"object","properties":{"participantUserId":{"type":"integer","format":"int64"}},"required":["participantUserId"]},"ApiResponseMessageResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/MessageResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"MessageResponse":{"type":"object","description":"脱敏消息响应","properties":{"id":{"type":"integer","format":"int64"},"conversationId":{"type":"integer","format":"int64"},"senderUserId":{"type":"integer","format":"int64"},"senderScope":{"type":"string"},"content":{"type":"string"},"status":{"type":"string"},"recalledAt":{"type":"string","format":"date-time"},"createdAt":{"type":"string","format":"date-time"},"isRead":{"type":"boolean"}}},"SendMessageRequest":{"type":"object","properties":{"conversationId":{"type":"integer","format":"int64"},"content":{"type":"string","maxLength":2000,"minLength":0}},"required":["content","conversationId"]},"CompanyCreateRequest":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"minLength":0},"logoUrl":{"type":"string"},"description":{"type":"string"},"industry":{"type":"string"},"website":{"type":"string"},"address":{"type":"string"}},"required":["name"]},"VerificationSubmitRequest":{"type":"object","properties":{"materialsJson":{"type":"string","minLength":1}},"required":["materialsJson"]},"CreateTalentInvitationRequest":{"type":"object","properties":{"candidateKey":{"type":"string","maxLength":128,"minLength":0},"message":{"type":"string","maxLength":300,"minLength":0},"idempotencyKey":{"type":"string","maxLength":64,"minLength":0}},"required":["candidateKey","idempotencyKey","message"]},"CreateCompanyReviewReplyRequest":{"type":"object","properties":{"content":{"type":"string","maxLength":500,"minLength":0},"idempotencyKey":{"type":"string","maxLength":64,"minLength":0}},"required":["content","idempotencyKey"]},"ApiResponseMapStringString":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"object","additionalProperties":{"type":"string"}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"RefreshTokenRequest":{"type":"object","description":"刷新请求","properties":{"refreshToken":{"type":"string","description":"登录或上一次刷新返回的 Refresh Token","maxLength":4096,"minLength":0}},"required":["refreshToken"]},"ApiResponseTokenPairResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/TokenPairResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"TokenPairResponse":{"type":"object","description":"刷新后的 Token 对","properties":{"accessToken":{"type":"string","description":"新的 Access Token"},"refreshToken":{"type":"string","description":"新的 Refresh Token"},"expiresIn":{"type":"integer","format":"int64","description":"Access Token 有效期(秒)"}}},"PasswordSetRequest":{"type":"object","properties":{"smsCode":{"type":"string","minLength":1},"newPassword":{"type":"string","minLength":1}},"required":["newPassword","smsCode"]},"ApiResponsePasswordOperationResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/PasswordOperationResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"PasswordOperationResponse":{"type":"object","properties":{"passwordConfigured":{"type":"boolean"},"reauthenticationRequired":{"type":"boolean"}}},"PasswordResetRequest":{"type":"object","properties":{"phone":{"type":"string","minLength":1,"pattern":"[0-9]{11}"},"smsCode":{"type":"string","minLength":1},"newPassword":{"type":"string","minLength":1}},"required":["newPassword","phone","smsCode"]},"PasswordLoginRequest":{"type":"object","properties":{"phone":{"type":"string","minLength":1,"pattern":"[0-9]{11}"},"password":{"type":"string","minLength":1}},"required":["password","phone"]},"PasswordChangeRequest":{"type":"object","properties":{"currentPassword":{"type":"string","minLength":1},"newPassword":{"type":"string","minLength":1}},"required":["currentPassword","newPassword"]},"LoginRequest":{"type":"object","properties":{"phone":{"type":"string","minLength":1,"pattern":"[0-9]{11}"},"code":{"type":"string","minLength":1,"pattern":"[0-9]{6}"},"purpose":{"type":"string"}},"required":["code","phone"]},"CompanyDetails":{"type":"object","properties":{"name":{"type":"string","maxLength":100,"minLength":0},"logoUrl":{"type":"string","maxLength":500,"minLength":0},"description":{"type":"string"},"industry":{"type":"string","maxLength":80,"minLength":0},"website":{"type":"string","maxLength":255,"minLength":0},"address":{"type":"string","maxLength":255,"minLength":0}},"required":["name"]},"CompanyRegistrationRequest":{"type":"object","properties":{"phone":{"type":"string","minLength":1,"pattern":"[0-9]{11}"},"code":{"type":"string","minLength":1,"pattern":"[0-9]{6}"},"password":{"type":"string","maxLength":64,"minLength":12},"company":{"$ref":"#/components/schemas/CompanyDetails"}},"required":["code","company","password","phone"]},"ApiResponseCompanyRegistrationResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CompanyRegistrationResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CompanyRegistrationResponse":{"type":"object","properties":{"userId":{"type":"integer","format":"int64"},"companyId":{"type":"integer","format":"int64"},"role":{"type":"string"},"onboardingStatus":{"type":"string"},"accessToken":{"type":"string"},"refreshToken":{"type":"string"},"expiresIn":{"type":"integer","format":"int64"}}},"CreateAssessmentAttemptRequest":{"type":"object","properties":{"typeCode":{"type":"string","maxLength":40,"minLength":0},"idempotencyKey":{"type":"string","maxLength":64,"minLength":0}},"required":["typeCode"]},"ApiResponseAssessmentAttemptResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/AssessmentAttemptResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"AssessmentAttemptResponse":{"type":"object","properties":{"attemptId":{"type":"integer","format":"int64"},"status":{"type":"string"},"totalQuestions":{"type":"integer","format":"int32"},"answeredCount":{"type":"integer","format":"int32"},"completionRate":{"type":"number"},"questionSetVersion":{"type":"string"},"version":{"type":"integer","format":"int64"},"questions":{"type":"array","items":{"$ref":"#/components/schemas/AssessmentQuestionResponse"}}}},"AssessmentQuestionResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"position":{"type":"integer","format":"int32"},"stem":{"type":"string"},"scaleType":{"type":"string"},"value":{"type":"integer","format":"int32"}}},"ApiResponseAssessmentResultResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/AssessmentResultResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"AssessmentResultResponse":{"type":"object","properties":{"attemptId":{"type":"integer","format":"int64"},"typeCode":{"type":"string"},"status":{"type":"string"},"primaryCode":{"type":"string"},"primaryType":{"type":"string"},"dimensionScores":{"type":"array","items":{"$ref":"#/components/schemas/DimensionScore"}},"typeRanking":{"type":"array","items":{"type":"string"}},"answeredCount":{"type":"integer","format":"int32"},"completionRate":{"type":"number"},"questionSetVersion":{"type":"string"},"rulesVersion":{"type":"string"},"generatedAt":{"type":"string"},"disclaimer":{"type":"string"},"explorationDirections":{"type":"array","items":{"type":"string"}}}},"DimensionScore":{"type":"object","properties":{"dimension":{"type":"string"},"score":{"type":"number"},"answeredCount":{"type":"integer","format":"int32"}}},"ApplicationCreateRequest":{"type":"object","properties":{"jobId":{"type":"integer","format":"int64"}},"required":["jobId"]},"InterviewCreateRequest":{"type":"object","properties":{"roundNo":{"type":"integer","format":"int32"},"title":{"type":"string","maxLength":200,"minLength":0},"interviewType":{"type":"string","minLength":1},"startAt":{"type":"string","format":"date-time"},"endAt":{"type":"string","format":"date-time"},"timezone":{"type":"string"},"meetingUrl":{"type":"string"},"address":{"type":"string"},"interviewerName":{"type":"string","maxLength":100,"minLength":0},"notes":{"type":"string"}},"required":["endAt","interviewType","startAt","title"]},"RiskEventActionRequest":{"type":"object","properties":{"action":{"type":"string","minLength":1},"reasonCode":{"type":"string","minLength":1},"expectedVersion":{"type":"integer","format":"int64"}},"required":["action","expectedVersion","reasonCode"]},"ApiResponseRiskEventResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/RiskEventResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"RiskEventResponse":{"type":"object","properties":{"eventId":{"type":"integer","format":"int64"},"ruleCode":{"type":"string"},"sourceAction":{"type":"string"},"severity":{"type":"string"},"status":{"type":"string"},"occurrenceCount":{"type":"integer","format":"int32"},"windowStartedAt":{"type":"string","format":"date-time"},"windowEndedAt":{"type":"string","format":"date-time"},"detectedAt":{"type":"string","format":"date-time"},"version":{"type":"integer","format":"int64"}}},"ReviewDecisionRequest":{"type":"object","properties":{"decision":{"type":"string","minLength":1,"pattern":"^(APPROVED|REJECTED)$"},"reason":{"type":"string","maxLength":500,"minLength":0}},"required":["decision"]},"ReviewReplyDecisionRequest":{"type":"object","properties":{"decision":{"type":"string","minLength":1},"reason":{"type":"string","maxLength":500,"minLength":0}},"required":["decision"]},"AdminReviewReplyResponse":{"type":"object","properties":{"replyId":{"type":"integer","format":"int64"},"reviewId":{"type":"integer","format":"int64"},"jobId":{"type":"integer","format":"int64"},"jobTitle":{"type":"string"},"companyId":{"type":"integer","format":"int64"},"companyName":{"type":"string"},"rating":{"type":"integer","format":"int32"},"reviewContent":{"type":"string"},"reviewModerationStatus":{"type":"string"},"replyContent":{"type":"string"},"replyStatus":{"type":"string"},"version":{"type":"integer","format":"int64"},"riskScore":{"type":"number"},"riskLevel":{"type":"string"},"reasonCodes":{"type":"array","items":{"type":"string"}},"createdAt":{"type":"string","format":"date-time"}}},"ApiResponseAdminReviewReplyResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/AdminReviewReplyResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"ReportDecisionRequest":{"type":"object","description":"举报处理决定请求","properties":{"decision":{"type":"string","description":"处理决定:RESOLVED / REJECTED","example":"RESOLVED","minLength":1,"pattern":"RESOLVED|REJECTED"},"note":{"type":"string","description":"处理备注(REJECTED 时必填)","maxLength":1000,"minLength":0}},"required":["decision"]},"RecommendationDecisionRequest":{"type":"object","properties":{"decision":{"type":"string","minLength":1},"reasonCode":{"type":"string"},"expectedVersion":{"type":"integer","format":"int64"}},"required":["decision","expectedVersion"]},"VerificationDecisionRequest":{"type":"object","properties":{"decision":{"type":"string","minLength":1},"reason":{"type":"string"}},"required":["decision"]},"AppealDecisionRequest":{"type":"object","properties":{"decision":{"type":"string","minLength":1},"reason":{"type":"string"}},"required":["decision"]},"CreateAbilityAttemptRequest":{"type":"object","properties":{"typeCode":{"type":"string","minLength":1},"idempotencyKey":{"type":"string"}},"required":["typeCode"]},"AbilityAttemptQuestionView":{"type":"object","properties":{"attemptQuestionId":{"type":"integer","format":"int64"},"position":{"type":"integer","format":"int32"},"itemType":{"type":"string"},"stem":{"type":"string"},"options":{"type":"array","items":{"$ref":"#/components/schemas/AbilityOptionView"}},"selectedOptionId":{"type":"string"}}},"AbilityAttemptResponse":{"type":"object","properties":{"attemptId":{"type":"integer","format":"int64"},"status":{"type":"string"},"answeredCount":{"type":"integer","format":"int32"},"totalQuestions":{"type":"integer","format":"int32"},"completionRate":{"type":"number"},"startedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"remainingSeconds":{"type":"integer","format":"int64"},"questions":{"type":"array","items":{"$ref":"#/components/schemas/AbilityAttemptQuestionView"}}}},"AbilityOptionView":{"type":"object","properties":{"optionId":{"type":"string"},"text":{"type":"string"}}},"ApiResponseAbilityAttemptResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/AbilityAttemptResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"AbilityResultResponse":{"type":"object","properties":{"attemptId":{"type":"integer","format":"int64"},"typeCode":{"type":"string"},"status":{"type":"string"},"validityStatus":{"type":"string"},"validUntil":{"type":"string","format":"date-time"},"dimensionScores":{"type":"array","items":{"$ref":"#/components/schemas/DimensionScore"}},"overallScore":{"type":"number"},"weaknesses":{"type":"array","items":{"$ref":"#/components/schemas/Weakness"}},"improvementAreas":{"type":"array","items":{"$ref":"#/components/schemas/ImprovementArea"}},"radar":{"type":"array","items":{"$ref":"#/components/schemas/RadarEntry"}},"answeredCount":{"type":"integer","format":"int32"},"completionRate":{"type":"number"},"questionFeedback":{"type":"array","items":{"$ref":"#/components/schemas/QuestionFeedback"}},"questionSetVersion":{"type":"string"},"rulesVersion":{"type":"string"},"generatedAt":{"type":"string","format":"date-time"},"disclaimer":{"type":"string"}}},"ApiResponseAbilityResultResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/AbilityResultResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"ImprovementArea":{"type":"object","properties":{"dimension":{"type":"string"},"currentScore":{"type":"number"},"summary":{"type":"string"},"actions":{"type":"array","items":{"type":"string"}}}},"QuestionFeedback":{"type":"object","properties":{"attemptQuestionId":{"type":"integer","format":"int64"},"position":{"type":"integer","format":"int32"},"stem":{"type":"string"},"selectedOptionId":{"type":"string"},"awardedScore":{"type":"integer","format":"int32"},"maxScore":{"type":"integer","format":"int32"},"explanation":{"type":"string"}}},"RadarEntry":{"type":"object","properties":{"code":{"type":"string"},"value":{"type":"number"}}},"Weakness":{"type":"object","properties":{"code":{"type":"string"},"score":{"type":"number"}}},"OfferStatusRequest":{"type":"object","properties":{"status":{"type":"string","minLength":1,"pattern":"^(SENT|NEGOTIATING|ACCEPTED|REJECTED|EXPIRED|WITHDRAWN)$"},"reason":{"type":"string","maxLength":255,"minLength":0}},"required":["status"]},"JobStatusRequest":{"type":"object","properties":{"status":{"type":"string","minLength":1,"pattern":"^(PUBLISHED|CLOSED)$"}},"required":["status"]},"AnswerItem":{"type":"object","properties":{"questionId":{"type":"integer","format":"int64"},"value":{"type":"integer","format":"int32","maximum":5,"minimum":1}},"required":["questionId","value"]},"SaveAssessmentAnswersRequest":{"type":"object","properties":{"version":{"type":"integer","format":"int64","minimum":0},"answers":{"type":"array","items":{"$ref":"#/components/schemas/AnswerItem"},"minItems":1}},"required":["answers","version"]},"ApplicationStatusRequest":{"type":"object","properties":{"status":{"type":"string","minLength":1,"pattern":"^(VIEWED|INTERVIEW|REJECTED|HIRED)$"}},"required":["status"]},"SaveAbilityAnswersRequest":{"type":"object","properties":{"answers":{"type":"array","items":{"$ref":"#/components/schemas/AnswerItem"},"minItems":1}},"required":["answers"]},"ApiResponseListWeightTemplateResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/WeightTemplateResponse"}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"WeightTemplateResponse":{"type":"object","properties":{"code":{"type":"string"},"name":{"type":"string"},"description":{"type":"string"},"weights":{"type":"object","additionalProperties":{"type":"number"}}}},"ApiResponsePageResponseReportResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/PageResponseReportResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"PageResponseReportResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/ReportResponse"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseListMapStringObject":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"array","items":{"type":"object","additionalProperties":{}}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"ApiResponsePageResponseJobRecommendationItem":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/PageResponseJobRecommendationItem"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"JobRecommendationItem":{"type":"object","properties":{"jobId":{"type":"integer","format":"int64"},"title":{"type":"string"},"city":{"type":"string"},"employmentType":{"type":"string"},"salaryMin":{"type":"integer","format":"int32"},"salaryMax":{"type":"integer","format":"int32"},"mode":{"type":"string"},"score":{"type":"number"},"reasons":{"type":"array","items":{"type":"string"}}}},"PageResponseJobRecommendationItem":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/JobRecommendationItem"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponsePageResponseDataExportTaskResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/PageResponseDataExportTaskResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"PageResponseDataExportTaskResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DataExportTaskResponse"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseCareerProgressResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CareerProgressResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CareerProgressItem":{"type":"object","properties":{"applicationId":{"type":"integer","format":"int64"},"applicationStatus":{"type":"string"},"appliedAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"job":{"$ref":"#/components/schemas/JobSummary"},"nextInterview":{"$ref":"#/components/schemas/InterviewSummary"},"latestSubmittedInterviewScore":{"$ref":"#/components/schemas/ScoreSummary"},"offer":{"$ref":"#/components/schemas/OfferSummary"},"competition":{"$ref":"#/components/schemas/CompetitionSummary"}}},"CareerProgressResponse":{"type":"object","properties":{"todo":{"$ref":"#/components/schemas/ProgressTodoSummary"},"applications":{"$ref":"#/components/schemas/PaginatedApplications"},"generatedAt":{"type":"string","format":"date-time"}}},"CompetitionSummary":{"type":"object","properties":{"eligible":{"type":"boolean"},"rank":{"type":"integer","format":"int32"},"cohortSize":{"type":"integer","format":"int32"},"overallScore":{"type":"number"},"percentile":{"type":"number"},"status":{"type":"string"},"mySnapshotPeriod":{"type":"string"},"rulesVersion":{"type":"string"}}},"InterviewSummary":{"type":"object","properties":{"interviewId":{"type":"integer","format":"int64"},"roundNo":{"type":"integer","format":"int32"},"title":{"type":"string"},"interviewType":{"type":"string"},"startAt":{"type":"string","format":"date-time"},"endAt":{"type":"string","format":"date-time"},"status":{"type":"string"}}},"JobSummary":{"type":"object","properties":{"jobId":{"type":"integer","format":"int64"},"title":{"type":"string"},"companyName":{"type":"string"},"city":{"type":"string"},"employmentType":{"type":"string"},"jobStatus":{"type":"string"}}},"OfferSummary":{"type":"object","properties":{"offerId":{"type":"integer","format":"int64"},"status":{"type":"string"},"title":{"type":"string"},"expireAt":{"type":"string","format":"date-time"},"onboardingDate":{"type":"string","format":"date"}}},"PaginatedApplications":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CareerProgressItem"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ProgressTodoSummary":{"type":"object","properties":{"pendingInterviewResponseCount":{"type":"integer","format":"int64"},"upcomingConfirmedInterviewCount":{"type":"integer","format":"int64"},"pendingOfferResponseCount":{"type":"integer","format":"int64"},"unreadNotificationCount":{"type":"integer","format":"int64"},"unreadReportDecisionCount":{"type":"integer","format":"int64"}}},"ScoreSummary":{"type":"object","properties":{"interviewId":{"type":"integer","format":"int64"},"overallScore":{"type":"number"},"recommendation":{"type":"string"},"submittedAt":{"type":"string","format":"date-time"}}},"ApiResponseCandidateScoringOverviewResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CandidateScoringOverviewResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CandidateScoringOverviewResponse":{"type":"object","properties":{"candidateId":{"type":"integer","format":"int64"},"status":{"type":"string"},"overallScore":{"type":"number"},"weights":{"type":"object","additionalProperties":{"type":"number"}},"dimensions":{"type":"array","items":{"$ref":"#/components/schemas/DimensionItem"}},"rulesVersion":{"type":"string"},"generatedAt":{"type":"string","format":"date-time"},"explanationVersion":{"type":"string"},"coverage":{"$ref":"#/components/schemas/Coverage"},"comparabilityNotice":{"type":"string"}}},"Coverage":{"type":"object","properties":{"computableDimensions":{"type":"integer","format":"int32"},"totalDimensions":{"type":"integer","format":"int32"},"includedDimensions":{"type":"array","items":{"type":"string"}},"excludedDimensions":{"type":"array","items":{"$ref":"#/components/schemas/ExcludedDimension"}}}},"DimensionItem":{"type":"object","properties":{"dimension":{"type":"string"},"score":{"type":"number"},"status":{"type":"string"},"weight":{"type":"number"},"summary":{"type":"string"}}},"ExcludedDimension":{"type":"object","properties":{"dimension":{"type":"string"},"status":{"type":"string"},"reason":{"type":"string"}}},"ApiResponseCandidateScoringTrendResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CandidateScoringTrendResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CandidateScoringTrendResponse":{"type":"object","properties":{"candidateId":{"type":"integer","format":"int64"},"months":{"type":"integer","format":"int32"},"items":{"type":"array","items":{"$ref":"#/components/schemas/TrendItem"}}}},"TrendItem":{"type":"object","properties":{"period":{"type":"string"},"overallScore":{"type":"number"},"rulesVersion":{"type":"string"},"dimensions":{"type":"object","additionalProperties":{"type":"number"}}}},"ApiResponseDimensionScoreDetailResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/DimensionScoreDetailResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"DataSourceItem":{"type":"object","properties":{"source":{"type":"string"},"time":{"type":"string","format":"date-time"},"note":{"type":"string"}}},"DimensionScoreDetailResponse":{"type":"object","properties":{"dimension":{"type":"string"},"score":{"type":"number"},"status":{"type":"string"},"subScores":{"type":"array","items":{"$ref":"#/components/schemas/SubScore"}},"reasons":{"type":"array","items":{"type":"string"}},"dataSources":{"type":"array","items":{"$ref":"#/components/schemas/DataSourceItem"}},"updatedAt":{"type":"string","format":"date-time"},"rulesVersion":{"type":"string"},"displayName":{"type":"string"},"whatItMeasures":{"type":"string"},"interpretation":{"type":"string"},"limitations":{"type":"array","items":{"type":"string"}},"evidenceLevel":{"type":"string"},"ruleContributions":{"type":"array","items":{"$ref":"#/components/schemas/RuleContribution"}},"improvementActions":{"type":"array","items":{"type":"string"}},"explanationVersion":{"type":"string"},"validity":{"$ref":"#/components/schemas/Validity"},"calculatedAt":{"type":"string","format":"date-time"}}},"RuleContribution":{"type":"object","properties":{"ruleCode":{"type":"string"},"outcome":{"type":"string"},"contribution":{"type":"number"},"maxContribution":{"type":"number"},"label":{"type":"string"},"observation":{"type":"string"},"explanation":{"type":"string"}}},"SubScore":{"type":"object","properties":{"name":{"type":"string"},"score":{"type":"number"},"weight":{"type":"number"},"description":{"type":"string"}}},"Validity":{"type":"object","properties":{"completedAt":{"type":"string","format":"date-time"},"validUntil":{"type":"string","format":"date-time"},"expired":{"type":"boolean"}}},"ApiResponseCandidateScoreTrendResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CandidateScoreTrendResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CandidateScoreTrendItem":{"type":"object","properties":{"month":{"type":"string"},"feedbackCount":{"type":"integer","format":"int32"},"averageRating":{"type":"number"},"ratingScore":{"type":"number"}}},"CandidateScoreTrendResponse":{"type":"object","properties":{"candidateId":{"type":"integer","format":"int64"},"months":{"type":"integer","format":"int32"},"items":{"type":"array","items":{"$ref":"#/components/schemas/CandidateScoreTrendItem"}}}},"ApiResponseCandidateScoreCardResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CandidateScoreCardResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CandidateFeedbackSummary":{"type":"object","properties":{"totalCount":{"type":"integer","format":"int32"},"averageRating":{"type":"number"},"ratingDistribution":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"tags":{"type":"array","items":{"$ref":"#/components/schemas/TagCount"}}}},"CandidateMatchSignals":{"type":"object","properties":{"candidateInterestScore":{"$ref":"#/components/schemas/MatchSignal"},"hrSuitabilityScore":{"$ref":"#/components/schemas/MatchSignal"}}},"CandidateScoreCardResponse":{"type":"object","properties":{"candidateId":{"type":"integer","format":"int64"},"status":{"type":"string"},"overallScore":{"type":"number"},"sampleCount":{"type":"integer","format":"int32"},"feedbackSummary":{"$ref":"#/components/schemas/CandidateFeedbackSummary"},"matchSignals":{"$ref":"#/components/schemas/CandidateMatchSignals"},"unsupportedDimensions":{"type":"array","items":{"type":"string"}},"generatedAt":{"type":"string","format":"date-time"}}},"MatchSignal":{"type":"object","properties":{"average":{"type":"number"},"sampleCount":{"type":"integer","format":"int32"}}},"TagCount":{"type":"object","properties":{"name":{"type":"string"},"count":{"type":"integer","format":"int32"}}},"ApiResponseCandidatePercentileResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CandidatePercentileResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CandidatePercentileResponse":{"type":"object","properties":{"candidateId":{"type":"integer","format":"int64"},"status":{"type":"string"},"scoreType":{"type":"string"},"score":{"type":"number"},"percentile":{"type":"number"},"cohortSize":{"type":"integer","format":"int32"},"sampleCount":{"type":"integer","format":"int32"},"minimumSampleCount":{"type":"integer","format":"int32"}}},"ApiResponsePersonalizedScoreResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/PersonalizedScoreResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"PersonalizedScoreResponse":{"type":"object","properties":{"jobId":{"type":"integer","format":"int64"},"score":{"type":"number"},"status":{"type":"string"},"source":{"type":"string"},"templateCode":{"type":"string"},"configuredWeights":{"type":"object","additionalProperties":{"type":"number"}},"effectiveWeights":{"type":"object","additionalProperties":{"type":"number"}},"dimensionScores":{"type":"object","additionalProperties":{"type":"number"}},"coveredWeight":{"type":"number"},"missingDimensions":{"type":"array","items":{"type":"string"}}}},"ApiResponseCompetitionRankingResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CompetitionRankingResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CompetitionRankingResponse":{"type":"object","properties":{"jobId":{"type":"integer","format":"int64"},"rank":{"type":"integer","format":"int32"},"cohortSize":{"type":"integer","format":"int32"},"overallScore":{"type":"number"},"percentile":{"type":"number"},"status":{"type":"string"},"asOfPeriod":{"type":"string"},"mySnapshotPeriod":{"type":"string"},"dimensions":{"type":"array","items":{"$ref":"#/components/schemas/DimensionItem"}},"gaps":{"type":"array","items":{"type":"string"}},"topCandidates":{"type":"array","items":{"$ref":"#/components/schemas/RankingSnapshot"}},"rulesVersion":{"type":"string"},"generatedAt":{"type":"string","format":"date-time"}}},"RankingSnapshot":{"type":"object","properties":{"rank":{"type":"integer","format":"int32"},"overallScore":{"type":"number"}}},"ApiResponseListTaxonomyResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/TaxonomyResponse"}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"TaxonomyResponse":{"type":"object","properties":{"code":{"type":"string"},"parentCode":{"type":"string"},"type":{"type":"string"},"displayName":{"type":"string"}}},"ApiResponseListInterviewScoreHistoryItem":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/InterviewScoreHistoryItem"}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"InterviewScoreHistoryItem":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"scoreId":{"type":"integer","format":"int64"},"interviewId":{"type":"integer","format":"int64"},"fromStatus":{"type":"string"},"toStatus":{"type":"string"},"actorRole":{"type":"string"},"snapshot":{"type":"object","additionalProperties":{}},"createdAt":{"type":"string","format":"date-time"}}},"ApiResponseMessagePageResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/MessagePageResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"MessagePageResponse":{"type":"object","description":"脱敏消息分页响应","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/MessageResponse"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseScoreTrendResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/ScoreTrendResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"ScoreTrendResponse":{"type":"object","properties":{"companyId":{"type":"integer","format":"int64"},"months":{"type":"integer","format":"int32"},"items":{"type":"array","items":{"$ref":"#/components/schemas/TrendItem"}}}},"ApiResponseDashboardOverviewResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/DashboardOverviewResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"DashboardOverviewResponse":{"type":"object","properties":{"companyId":{"type":"integer","format":"int64"},"totalJobs":{"type":"integer","format":"int32"},"publishedJobs":{"type":"integer","format":"int32"},"avgJobScore":{"type":"number"},"totalCandidates":{"type":"integer","format":"int32"},"avgCandidateScore":{"type":"number"},"scoreDistribution":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"updatedAt":{"type":"string","format":"date-time"}}},"ApiResponseJobRankingListResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/JobRankingListResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"JobRankingItem":{"type":"object","properties":{"jobId":{"type":"integer","format":"int64"},"title":{"type":"string"},"city":{"type":"string"},"employmentType":{"type":"string"},"avgRating":{"type":"number"},"reviewCount":{"type":"integer","format":"int32"},"rank":{"type":"integer","format":"int32"},"cohortSize":{"type":"integer","format":"int32"},"dimensionAverages":{"type":"object","additionalProperties":{"type":"number"}}}},"JobRankingListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/JobRankingItem"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseJobRankingItem":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/JobRankingItem"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"ApiResponseCandidateRankingListResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CandidateRankingListResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CandidateRankingItem":{"type":"object","properties":{"applicationId":{"type":"integer","format":"int64"},"jobId":{"type":"integer","format":"int64"},"candidateName":{"type":"string"},"candidateSchool":{"type":"string"},"overallScore":{"type":"number"},"percentile":{"type":"number"},"sampleCount":{"type":"integer","format":"int32"}}},"CandidateRankingListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CandidateRankingItem"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseCandidateRankingDetailResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CandidateRankingDetailResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CandidateRankingDetailResponse":{"type":"object","properties":{"applicationId":{"type":"integer","format":"int64"},"jobId":{"type":"integer","format":"int64"},"candidateName":{"type":"string"},"candidateSchool":{"type":"string"},"overallScore":{"type":"number"},"percentile":{"type":"number"},"cohortSize":{"type":"integer","format":"int32"},"dimensionScores":{"type":"array","items":{"$ref":"#/components/schemas/DimensionScoreItem"}}}},"DimensionScoreItem":{"type":"object","properties":{"dimension":{"type":"string"},"score":{"type":"number"},"status":{"type":"string"}}},"ApiResponseCandidateListResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CandidateListResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CandidateItemView":{"type":"object","properties":{"applicationId":{"type":"integer","format":"int64"},"jobId":{"type":"integer","format":"int64"},"jobTitle":{"type":"string"},"status":{"type":"string"},"candidateName":{"type":"string"},"candidateSchool":{"type":"string"},"candidateEducation":{"type":"string"},"candidateGraduationYear":{"type":"integer","format":"int32"},"candidateAvatarUrl":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"}}},"CandidateListResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CandidateItemView"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseCandidateDetailView":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CandidateDetailView"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CandidateDetailView":{"type":"object","properties":{"applicationId":{"type":"integer","format":"int64"},"jobId":{"type":"integer","format":"int64"},"jobTitle":{"type":"string"},"jobCity":{"type":"string"},"jobEmploymentType":{"type":"string"},"status":{"type":"string"},"coverLetter":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"updatedAt":{"type":"string","format":"date-time"},"candidateName":{"type":"string"},"candidateAvatarUrl":{"type":"string"},"candidateBio":{"type":"string"},"candidateLocation":{"type":"string"},"candidateSchool":{"type":"string"},"candidateEducation":{"type":"string"},"candidateGraduationYear":{"type":"integer","format":"int32"},"candidateSkills":{"type":"array","items":{"type":"string"}}}},"ApiResponseCompanyCandidateScoringResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CompanyCandidateScoringResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CompanyCandidateScoringResponse":{"type":"object","properties":{"applicationId":{"type":"integer","format":"int64"},"overallScore":{"type":"number"},"status":{"type":"string"},"dimensions":{"type":"array","items":{"$ref":"#/components/schemas/CompanyDimensionItem"}},"generatedAt":{"type":"string","format":"date-time"},"rulesVersion":{"type":"string"}}},"CompanyDimensionItem":{"type":"object","properties":{"dimension":{"type":"string"},"score":{"type":"number"},"status":{"type":"string"}}},"ApiResponseCompanyPublicView":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CompanyPublicView"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CompanyPublicView":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"logoUrl":{"type":"string"},"description":{"type":"string"},"industry":{"type":"string"},"verified":{"type":"boolean"}}},"ApiResponseCompanyOnboardingResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CompanyOnboardingResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CompanyOnboardingResponse":{"type":"object","properties":{"company":{"$ref":"#/components/schemas/CompanySummary"},"onboardingStatus":{"type":"string"},"latestVerification":{"$ref":"#/components/schemas/VerificationSummary"},"missingFields":{"type":"array","items":{"type":"string"}},"allowedActions":{"type":"array","items":{"type":"string"}}}},"CompanySummary":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"name":{"type":"string"},"logoUrl":{"type":"string"},"description":{"type":"string"},"industry":{"type":"string"},"website":{"type":"string"},"address":{"type":"string"},"verified":{"type":"boolean"}}},"VerificationSummary":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"status":{"type":"string"},"submittedAt":{"type":"string","format":"date-time"},"decidedAt":{"type":"string","format":"date-time"}}},"ApiResponseReviewReplyPageResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/ReviewReplyPageResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CompanyReviewItemResponse":{"type":"object","properties":{"reviewId":{"type":"integer","format":"int64"},"job":{"$ref":"#/components/schemas/CompanyReviewJobResponse"},"rating":{"type":"integer","format":"int32"},"content":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"dimensionScores":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"reviewStatus":{"type":"string"},"reviewCreatedAt":{"type":"string","format":"date-time"},"reply":{"$ref":"#/components/schemas/CompanyReviewReplyResponse"}}},"CompanyReviewJobResponse":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"title":{"type":"string"}}},"ReviewReplyPageResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/CompanyReviewItemResponse"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseCompanyReviewDetailResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/CompanyReviewDetailResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CompanyReviewDetailResponse":{"type":"object","properties":{"reviewId":{"type":"integer","format":"int64"},"job":{"$ref":"#/components/schemas/CompanyReviewJobResponse"},"rating":{"type":"integer","format":"int32"},"content":{"type":"string"},"tags":{"type":"array","items":{"type":"string"}},"dimensionScores":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"reviewStatus":{"type":"string"},"reviewCreatedAt":{"type":"string","format":"date-time"},"reply":{"$ref":"#/components/schemas/CompanyReviewReplyResponse"}}},"ApiResponsePageResponseBlockRelationResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/PageResponseBlockRelationResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"PageResponseBlockRelationResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/BlockRelationResponse"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseListAssessmentQuestionResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/AssessmentQuestionResponse"}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"ApiResponseListAssessmentTypeResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/AssessmentTypeResponse"}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"AssessmentTypeResponse":{"type":"object","properties":{"typeCode":{"type":"string"},"displayName":{"type":"string"},"description":{"type":"string"},"instructions":{"type":"string"},"status":{"type":"string"},"scaleType":{"type":"string"},"questionCount":{"type":"integer","format":"int32"},"attemptQuestionCount":{"type":"integer","format":"int32"},"minPerDimension":{"type":"integer","format":"int32"},"questionSetVersion":{"type":"string"},"rulesVersion":{"type":"string"}}},"ApiResponsePageResponseAssessmentHistoryItem":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/PageResponseAssessmentHistoryItem"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"AssessmentHistoryItem":{"type":"object","properties":{"attemptId":{"type":"integer","format":"int64"},"typeCode":{"type":"string"},"status":{"type":"string"},"answeredCount":{"type":"integer","format":"int32"},"completionRate":{"type":"number"},"questionSetVersion":{"type":"string"},"primaryCode":{"type":"string"},"primaryType":{"type":"string"},"createdAt":{"type":"string","format":"date-time"},"submittedAt":{"type":"string","format":"date-time"}}},"PageResponseAssessmentHistoryItem":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AssessmentHistoryItem"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseRiskTrendResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/RiskTrendResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"RiskTrendResponse":{"type":"object","properties":{"bucket":{"type":"string"},"items":{"type":"array","items":{"$ref":"#/components/schemas/TrendPoint"}}}},"TrendPoint":{"type":"object","properties":{"time":{"type":"string","format":"date-time"},"count":{"type":"integer","format":"int64"}}},"ApiResponseListRiskRuleResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/RiskRuleResponse"}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"ApiResponseRiskOverviewResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/RiskOverviewResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"RiskOverviewResponse":{"type":"object","properties":{"openCount":{"type":"integer","format":"int64"},"bySeverity":{"type":"array","items":{"$ref":"#/components/schemas/SeverityCount"}},"byRule":{"type":"array","items":{"$ref":"#/components/schemas/RuleCount"}},"lastDetectedAt":{"type":"string","format":"date-time"}}},"RuleCount":{"type":"object","properties":{"ruleCode":{"type":"string"},"count":{"type":"integer","format":"int64"}}},"SeverityCount":{"type":"object","properties":{"severity":{"type":"string"},"count":{"type":"integer","format":"int64"}}},"ApiResponsePageResponseRiskEventResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/PageResponseRiskEventResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"PageResponseRiskEventResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RiskEventResponse"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseRiskDistributionResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/RiskDistributionResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"DistributionRow":{"type":"object","properties":{"ruleCode":{"type":"string"},"severity":{"type":"string"},"count":{"type":"integer","format":"int64"}}},"RiskDistributionResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/DistributionRow"}}}},"ApiResponseUnavailable":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Unavailable"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"Unavailable":{"type":"object","properties":{"availability":{"type":"string"},"reason":{"type":"string"},"capturedAt":{"type":"string","format":"date-time"}}},"ApiResponseOverview":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Overview"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"Distribution":{"type":"object","properties":{"sampleSize":{"type":"integer","format":"int32"},"mean":{"type":"number"},"median":{"type":"number"},"p10":{"type":"number"},"p25":{"type":"number"},"p75":{"type":"number"},"p90":{"type":"number"},"min":{"type":"number"},"max":{"type":"number"},"standardDeviation":{"type":"number"},"buckets":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"concentrationRate":{"type":"number"},"riskLevel":{"type":"string"},"availability":{"type":"string"},"reason":{"type":"string"}}},"Overview":{"type":"object","properties":{"basis":{"type":"string"},"scope":{"type":"string"},"period":{"type":"string"},"capturedAt":{"type":"string","format":"date-time"},"populationSize":{"type":"integer","format":"int32"},"computableSnapshotRatio":{"type":"number"},"confidence":{"type":"string"},"riskLevel":{"type":"string"},"versionCounts":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"mixedVersionCount":{"type":"integer","format":"int32"},"unknownVersionCount":{"type":"integer","format":"int32"},"distribution":{"$ref":"#/components/schemas/Distribution"},"distributionsByRulesVersion":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/Distribution"}},"coherentVersionSubset":{"type":"array","items":{"type":"string"}},"availability":{"type":"string"},"reason":{"type":"string"}}},"ApiResponseDimensions":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Dimensions"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"DimensionMetric":{"type":"object","properties":{"dimension":{"type":"string"},"populationSize":{"type":"integer","format":"int32"},"rowCount":{"type":"integer","format":"int32"},"missingRowCount":{"type":"integer","format":"int32"},"validSampleSize":{"type":"integer","format":"int32"},"confidence":{"type":"string"},"missingRowRate":{"type":"number"},"nullScoreRate":{"type":"number"},"validCoverage":{"type":"number"},"statusCounts":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"versionCounts":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"inconsistentRecordCount":{"type":"integer","format":"int32"},"unknownStatusCount":{"type":"integer","format":"int32"},"outOfRangeScoreCount":{"type":"integer","format":"int32"},"unknownRulesVersionCount":{"type":"integer","format":"int32"},"distribution":{"$ref":"#/components/schemas/Distribution"},"distributionsByRulesVersion":{"type":"object","additionalProperties":{"$ref":"#/components/schemas/Distribution"}},"availability":{"type":"string"},"reason":{"type":"string"}}},"Dimensions":{"type":"object","properties":{"basis":{"type":"string"},"scope":{"type":"string"},"period":{"type":"string"},"capturedAt":{"type":"string","format":"date-time"},"dimensions":{"type":"array","items":{"$ref":"#/components/schemas/DimensionMetric"}},"availability":{"type":"string"},"reason":{"type":"string"}}},"ApiResponseAppeals":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/Appeals"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"Appeals":{"type":"object","properties":{"basis":{"type":"string"},"from":{"type":"string"},"to":{"type":"string"},"capturedAt":{"type":"string","format":"date-time"},"appealCount":{"type":"integer","format":"int32"},"sampleSize":{"type":"integer","format":"int32"},"statusCounts":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"statusEventCounts":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"statusCandidateCounts":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"confidence":{"type":"string"},"approvedEverCount":{"type":"integer","format":"int32"},"approvalRate":{"type":"number"},"rollbackExecutionRate":{"type":"number"},"duplicateAppealCount":{"type":"integer","format":"int32"},"duplicateAppealRate":{"type":"number"},"comparableRollbackCount":{"type":"integer","format":"int32"},"comparableRollbackCandidateCount":{"type":"integer","format":"int32"},"changedCount":{"type":"integer","format":"int32"},"changedCandidateCount":{"type":"integer","format":"int32"},"actualScoreChangeRate":{"type":"number"},"meanDelta":{"type":"number"},"meanAbsoluteDelta":{"type":"number"},"duplicateRollbackHistoryCount":{"type":"integer","format":"int32"},"invalidScoreRollbackCount":{"type":"integer","format":"int32"},"ruleVersionChangedRollbackCount":{"type":"integer","format":"int32"},"reasonCounts":{"type":"object","additionalProperties":{"type":"integer","format":"int32"}},"availability":{"type":"string"},"reason":{"type":"string"},"exposureAppealRateAvailability":{"type":"string"},"exposureAppealRateReason":{"type":"string"}}},"AdminDashboardOverviewResponse":{"type":"object","properties":{"totalCompanies":{"type":"integer","format":"int32"},"totalJobs":{"type":"integer","format":"int32"},"totalCandidates":{"type":"integer","format":"int32"},"avgCandidateScore":{"type":"number"},"topCompanies":{"type":"array","items":{"$ref":"#/components/schemas/CompanyScoreItem"}}}},"ApiResponseAdminDashboardOverviewResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/AdminDashboardOverviewResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"CompanyScoreItem":{"type":"object","properties":{"companyId":{"type":"integer","format":"int64"},"companyName":{"type":"string"},"avgCandidateScore":{"type":"number"},"jobCount":{"type":"integer","format":"int32"}}},"AdminReviewReplyPageResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AdminReviewReplyResponse"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseAdminReviewReplyPageResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/AdminReviewReplyPageResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"ApiResponsePageResponseRecommendationProfileResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/PageResponseRecommendationProfileResponse"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"PageResponseRecommendationProfileResponse":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/RecommendationProfileResponse"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseListSnapshotHistoryItem":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/SnapshotHistoryItem"}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"SnapshotHistoryItem":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"appealId":{"type":"integer","format":"int64"},"action":{"type":"string"},"dimension":{"type":"string"},"period":{"type":"string"},"beforeScore":{"type":"number"},"afterScore":{"type":"number"},"beforeVersion":{"type":"integer","format":"int64"},"afterVersion":{"type":"integer","format":"int64"},"beforeRulesVersion":{"type":"string"},"afterRulesVersion":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}},"ApiResponseListAppealHistoryItem":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/AppealHistoryItem"}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"AppealHistoryItem":{"type":"object","properties":{"id":{"type":"integer","format":"int64"},"fromStatus":{"type":"string"},"toStatus":{"type":"string"},"actorUserId":{"type":"integer","format":"int64"},"actorRole":{"type":"string"},"reason":{"type":"string"},"createdAt":{"type":"string","format":"date-time"}}},"AbilityTypeResponse":{"type":"object","properties":{"typeCode":{"type":"string"},"displayName":{"type":"string"},"description":{"type":"string"},"questionCount":{"type":"integer","format":"int32"},"attemptQuestionCount":{"type":"integer","format":"int32"},"timeLimitMinutes":{"type":"integer","format":"int32"},"resultValidDays":{"type":"integer","format":"int32"},"status":{"type":"string"}}},"ApiResponseListAbilityTypeResponse":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"type":"array","items":{"$ref":"#/components/schemas/AbilityTypeResponse"}},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"AbilityHistoryItem":{"type":"object","properties":{"attemptId":{"type":"integer","format":"int64"},"typeCode":{"type":"string"},"status":{"type":"string"},"validityStatus":{"type":"string"},"overallScore":{"type":"number"},"answeredCount":{"type":"integer","format":"int32"},"completionRate":{"type":"number"},"startedAt":{"type":"string","format":"date-time"},"expiresAt":{"type":"string","format":"date-time"},"completedAt":{"type":"string","format":"date-time"},"validUntil":{"type":"string","format":"date-time"}}},"ApiResponsePageResponseAbilityHistoryItem":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{"$ref":"#/components/schemas/PageResponseAbilityHistoryItem"},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}},"PageResponseAbilityHistoryItem":{"type":"object","properties":{"items":{"type":"array","items":{"$ref":"#/components/schemas/AbilityHistoryItem"}},"total":{"type":"integer","format":"int64"},"page":{"type":"integer","format":"int32"},"size":{"type":"integer","format":"int32"},"totalPages":{"type":"integer","format":"int32"}}},"ApiResponseVoid":{"type":"object","properties":{"code":{"type":"integer","format":"int32"},"message":{"type":"string"},"data":{},"requestId":{"type":"string"},"timestamp":{"type":"string","format":"date-time"}}}},"securitySchemes":{"bearerAuth":{"type":"http","description":"通过 /auth/login 获取的 Access Token,请求头格式:Authorization: Bearer <token>","scheme":"bearer","bearerFormat":"JWT"}}}} \ No newline at end of file diff --git a/scripts/openapi_paths.py b/scripts/openapi_paths.py new file mode 100644 index 0000000..a42d47f --- /dev/null +++ b/scripts/openapi_paths.py @@ -0,0 +1,20 @@ +import json + +with open("scripts/openapi.json", encoding="utf-8") as f: + spec = json.load(f) + +paths = spec.get("paths", {}) +rows = [] +for p, methods in sorted(paths.items()): + for m, op in methods.items(): + if m.lower() not in ("get","post","put","delete","patch"): + continue + summary = op.get("summary") or op.get("description") or "" + tags = ",".join(op.get("tags", [])) + rows.append((m.upper(), p, summary, tags)) + +print(f"TOTAL PATH-METHODS: {len(rows)}") +print(f"TOTAL DISTINCT PATHS: {len(set(r[1] for r in rows))}") +print("="*100) +for m, p, s, t in rows: + print(f"{m:6} {p:55} [{t}] {s[:40]}") diff --git a/scripts/transform_api.py b/scripts/transform_api.py new file mode 100644 index 0000000..3061524 --- /dev/null +++ b/scripts/transform_api.py @@ -0,0 +1,188 @@ +import json, re + +with open("scripts/openapi.json", encoding="utf-8") as f: + spec = json.load(f) +real_paths = set() +for p, methods in spec.get("paths", {}).items(): + for m in methods: + real_paths.add(p) +real_base = set() +for p in real_paths: + seg = [s for s in p.split("/") if s and "{" not in s and "$" not in s] + if seg: + real_base.add("/" + seg[0]) + +with open("src/api/api.ts", encoding="utf-8") as f: + raw = f.read() +lines = raw.split("\n") # keep as list, we will rejoin + +func_re = re.compile(r"^(\s*)(?:export\s+)?(?:async\s+)?function\s+(\w+)\s*\(") +static_req = re.compile(r"request(?:<[^>]*>)?\(\s*['\"]([^'\"]+)['\"]") +tmpl_req = re.compile(r"request(?:<[^>]*>)?\(\s*`([^`]*)`") + +# find function start indices +starts = [] +for i, ln in enumerate(lines): + m = func_re.match(ln) + if m: + starts.append((m.group(2), i)) +func_ranges = [] +for idx, (name, s) in enumerate(starts): + e = starts[idx+1][1] if idx+1 < len(starts) else len(lines) + func_ranges.append((name, s, e)) + +PATH_FIX_STATIC = { + "fetchConversations": ("'/messages/conversations'", "'/conversations'"), + "fetchNotifications": ("'/messages/notifications'", "'/notifications'"), + "fetchInterviews": ("'/messages/interviews'", "'/interviews/me'"), + "fetchJobPreference": ("'/profile/me/job-preference'", "'/profile/me/preferences'"), + "saveJobPreference": ("'/profile/me/job-preference'", "'/profile/me/preferences'"), + "fetchResume": ("'/resume'", "'/profile/me/resume'"), + "fetchFavorites": ("'/profile/me/favorites'", "'/jobs/favorites'"), +} +JOBPROGRESS_OLD = "'/tools/job-progress', { method: 'GET', auth: false }" +JOBPROGRESS_NEW = "'/profile/me/career-progress', { method: 'GET' }" +TEMPLATE_FIX = { + "fetchRankData": ("/jobs/rank", "/jobs/${jobId}/competition-ranking"), + "fetchCandidateDetail": ("/enterprise/candidates/${candidateId}", "/company/candidates/${candidateId}"), + "fetchInterviewScore": ("/enterprise/interviews/${interviewId}/score", "/interviews/${interviewId}/score"), + "fetchInterviewScoreDraft": ("/enterprise/interviews/${interviewId}/score/draft", "/interviews/${interviewId}/score"), + "fetchConversation": ("/chat/conversations/${id}", "/conversations/${id}"), +} + +def get_info(sl): + static = []; tmpl = [] + hmi = any("if (isMockMode())" in l for l in sl) + hnmi = any("if (!isMockMode())" in l for l in sl) + for l in sl: + m = static_req.search(l) + if m: static.append(m.group(1)) + t = tmpl_req.search(l) + if t: tmpl.append(t.group(1)) + return static, tmpl, hmi, hnmi + +def is_phantom(p): + if p in real_paths: return False + segs = [s for s in p.split("/") if s and "{" not in s and "$" not in s] + base = "/" + segs[0] if segs else "" + return base not in real_base + +DAI_RE = re.compile(r'【待确认[^】]*】') + +def strip_dai(line): + if DAI_RE.search(line): + return DAI_RE.sub('', line).rstrip() + "\n" + return line + +changed = {"pathfix": [], "revert": [], "strip_only": []} +new_full = [] + +def find_close(sl, open_i): + depth = 0 + for j in range(open_i, len(sl)): + depth += sl[j].count("{") - sl[j].count("}") + if depth == 0 and j > open_i: + return j + return None + +# preserve leading lines before the first function (imports, top-level consts, banners) +new_full = list(lines[0:func_ranges[0][1]]) + +for name, s, e in func_ranges: + sl = lines[s:e] + static, tmpl, hmi, hnmi = get_info(sl) + in_openapi = any(p in real_paths for p in static) or any(not is_phantom(t) for t in tmpl) + dai = any("【待确认】" in l for l in sl) + is_pathfix = name in PATH_FIX_STATIC or name in TEMPLATE_FIX or name == "fetchJobProgress" + phantom = (dai or any(is_phantom(p) for p in static) or any(is_phantom(t) for t in tmpl)) and not in_openapi + + if is_pathfix: + out = [] + for ln in sl: + if name in PATH_FIX_STATIC: + o, n = PATH_FIX_STATIC[name] + if o in ln: ln = ln.replace(o, n) + ou = o.strip("'\"") + nu = n.strip("'\"") + if ou in ln: ln = ln.replace(ou, nu) + elif name == "fetchJobProgress": + if JOBPROGRESS_OLD in ln: ln = ln.replace(JOBPROGRESS_OLD, JOBPROGRESS_NEW) + if "/tools/job-progress" in ln: ln = ln.replace("/tools/job-progress", "/profile/me/career-progress") + elif name in TEMPLATE_FIX: + o, n = TEMPLATE_FIX[name] + if o in ln: ln = ln.replace(o, n) + ou = o.replace("`", "") + nu = n.replace("`", "") + if ou in ln: ln = ln.replace(ou, nu) + out.append(strip_dai(ln)) + new_full.extend(out) + changed["pathfix"].append(name) + continue + + if not phantom: + if dai: + new_full.extend(strip_dai(ln) for ln in sl) + else: + new_full.extend(sl) + continue + + # REVERT (phantom -> always mock) + if hnmi: + out = [] + i = 0 + while i < len(sl): + if "if (!isMockMode())" in sl[i]: + ci = find_close(sl, i) + i = (ci + 1) if ci is not None else i + 1 + continue + out.append(strip_dai(sl[i])) + i += 1 + new_full.extend(out) + changed["revert"].append(name) + else: + # pattern A: collapse if(isMockMode()){...} and drop trailing return request + out = [] + i = 0 + collapsed = False + while i < len(sl): + if "if (isMockMode())" in sl[i]: + ci = find_close(sl, i) + if ci is not None: + inner = sl[i+1:ci] + inner_out = [] + for il in inner: + if "return request" in il: + continue + if il.lstrip().startswith("//") and "【待确认】" in il: + continue + inner_out.append(il) + inner_out = [l[2:] if l.startswith(" ") else l for l in inner_out] + out.append(" // 后端未提供 OpenAPI 契约:保持 mock(翻真实开关也不触网),待后端就绪再接真实分支") + out.extend(inner_out) + i = ci + 1 + collapsed = True + continue + if "return request" in sl[i]: + i += 1 + continue + out.append(strip_dai(sl[i])) + i += 1 + if not collapsed: + # dai but no isMockMode block and no real branch -> just strip + changed["strip_only"].append(name) + else: + changed["revert"].append(name) + new_full.extend(out) + +# preserve trailing lines after the last function +new_full.extend(lines[func_ranges[-1][2]:]) + +with open("src/api/api.ts", "w", encoding="utf-8") as f: + f.write("\n".join(new_full)) + +print("PATHFIX:", len(changed["pathfix"])) +print("REVERT:", len(changed["revert"])) +print("STRIP_ONLY:", len(changed["strip_only"]), changed["strip_only"]) +print("--- revert ---") +for n in changed["revert"]: + print(" ", n)