仕兔平台 V1.0 MVP/技术规格附录
规划外补充 · 开发交付物
总览
本文档的定位:原型解决「长什么样」,本附录解决「字段叫什么、状态怎么迁、什么时候跑、边界怎么算」。两份产品文档均未定义这些内容,但它们决定后端实现。建议在开发启动前与产品逐条确认并锁定。
01 · 核心数据模型
字段命名沿用文档中已出现的口径(source_company_id / bound_company_id)。红色标记为业务关键字段,橙色标记为永不可变字段。
user · 用户
| 字段 | 类型 | 取值 / 示例 | 可变 | 说明 |
user_id | string | U2026072301887 | 否 | 注册即生成,全局唯一 |
phone | string | 加密存储,按角色脱敏展示 | 是 | 注册唯一凭证,无密码 |
real_name | string | 加密存储 | 否 | 实名认证后写入,绑定后不可改 |
id_card | string | 加密存储,一证一号唯一索引 | 否 | 实名认证后写入 |
birth_date | date | 由 OCR 识别,不采用用户自填 | 否 | 年龄硬拦截的唯一依据 |
source_company_id | string | C10023 / PLATFORM | 永不更改 | 唯一决定人才流转费 80% 归属。注册时按渠道锁定;公司注销后保留仅存证,流转费改归平台 |
bound_company_id | string | C10023 / NULL | 是 | 公私域的唯一判定依据。为空即公域 |
domain_tag | derived | 私域 / 公域 / 临时私域 | 派生 | 不落库,由 bound_company_id + user_status 实时计算 |
user_status | enum | 见 枚举字典 | 是 | 全局状态机主字段 |
match_scope | derived | 全平台 / 仅本公司 / 仅内部调岗 / 不可匹配 | 派生 | 由 domain_tag + user_status 推导 |
response_deadline | datetime | 2026-07-24 09:58:00 | 是 | 24h 响应窗口截止时刻;每次阶段变更重置;公域用户为 NULL |
profile_id | string | PROFILE-…-R1 | 是 | AI 问薪画像版本,每次重新匹配 +1 |
match_count | int | 0 – 不限 | 是 | 重新匹配次数,≥3 次触发流转建议 |
blacklist_flag | bool | false | 是 | 平台级失信标记 |
advance_debt | decimal | 0.00 | 是 | 未还清预支欠款,离职时强制结清 |
company · 劳务公司(租户)
| 字段 | 类型 | 取值 / 示例 | 可变 | 说明 |
company_id | string | C10023 | 否 | 租户主键 |
company_status | enum | 正常 / 限流 / 封禁 / 已注销 / 已倒闭 | 是 | 注销与倒闭触发批量解绑 |
onboard_date | date | 2025-04-01 | 否 | 免费期起算日 |
free_period_end | date | 2025-06-30 | 否 | 入驻 + 3 个月 |
stock_base | int | 180 | 锁定后不可变 | 存量基数,免费期内导入人数;期满自动锁定,存量人员永久免费 |
stock_locked_at | datetime | 2025-07-01 02:00 | 否 | 由定时任务写入 |
credit_score | int | 0 – 100,初始 100 | 是 | <60 权重 ×0.2;<30 永久停服 |
penalty_level | enum | 无 / 1 级警告 / 2 级限流 / 3 级封禁 | 是 | 由每日风控任务计算 |
verified_clients | array | 已备案甲方企业列表 | 是 | 岗位审核时校验关联性 |
job · 岗位
| 字段 | 类型 | 取值 / 示例 | 可变 | 说明 |
job_id / company_id / project_id | string | J20260701008 | 否 | 归属链 |
job_status | enum | 待审核 / 招聘中 / 暂停招聘 / 已下架 / 强制下架 | 是 | 暂停不删数据,恢复后权重从新岗位重算 |
salary_min / salary_max | decimal | 5800 / 6800 | 是 | 综合月收入区间 |
quota_remaining | int | 12 | 是 | 并发热点,报名时乐观锁扣减,取消/爽约回补 |
posted_days | derived | 6 | 派生 | 挂岗天数,驱动权重衰减 |
match_weight | decimal | 0.00 – 1.15 | 是 | 企业端与用户端均不可见(文档 12.1 隐形限流) |
client_company | string | 立讯精密工业(昆山) | 是 | 须在 verified_clients 内 |
contract_file | file | 甲方合作合同 | 是 | 发布前必传,平台审核依据 |
complaint_count | int | 0 | 是 | 核实属实累计 ≥3 → 自动下架 |
application · 报名 / 报备
| 字段 | 类型 | 取值 / 示例 | 可变 | 说明 |
application_id | string | BM202607231014 | 否 | — |
app_status | enum | 待确认 / 待面试 / 待确权 / 已入职 / 已取消 / 已超时 / 面试未通过 / 爽约 | 是 | 对应 C 端「我的报备」六标签 |
cancel_operator | string | 驻场 / 项目经理 user_id | 是 | 用户不可自行取消,必须有后台操作人 |
disclaimer_log | json | {user_id, time, ip} | 否 | 告知书同意留痕,永久存档 |
expire_at | datetime | 报备发起 + N 小时 | 否 | 超时未确认自动作废 |
billing_daily · 每日计费快照
| 字段 | 类型 | 取值 / 示例 | 说明 |
biz_date + company_id + user_id | — | 联合唯一索引 | 幂等键,重跑不重复计费 |
fee_type | enum | GROWTH_SERVICE / TRANSFER | 增长技术服务费 / 人才流转费 |
unit_price | decimal | 0.10 / 10.00 | V1.0 服务费统一 0.10;阶梯属 V1.5 |
payer / payee_supply / payee_platform | string | 接收方 / 供给方 8 元 / 平台 2 元 | 供给方为平台时 10 元全归平台 |
is_stock | bool | true 则不计费 | 存量人员永久免费 |
02 · 枚举字典
全部枚举建议以英文常量落库、中文仅用于展示,避免多端文案不一致导致状态判断出错。
user_status · 用户状态
| 常量 | 中文 | 公私域 | 匹配范围 |
| GUEST | 游客 | 公域 | 不展示岗位 |
| PUBLIC_SEEKING | 公域求职 | 公域 | 全平台 |
| PRIVATE_PENDING | 私域待匹配 | 私域 | 仅本公司 |
| PENDING_INTERVIEW | 待面试 | 临时私域 | 不可再匹配 |
| PENDING_CONFIRM | 待确权 | 临时私域 | 不可再匹配 |
| EMPLOYED | 已入职在岗 | 私域 | 仅本公司内部调岗 |
| RESIGNED | 已离职 | 公域 | 全平台 |
| UNFOLLOWED | 未被跟进 | 公域 | 全平台(24h 超时释放) |
其他枚举
job_status
PENDING_AUDIT 待审核RECRUITING 招聘中PAUSED 暂停招聘OFFLINE 已下架FORCE_OFFLINE 强制下架
company_status
NORMAL 正常THROTTLED 限流BANNED 封禁DEREGISTERED 已注销BANKRUPT 已倒闭
contract_status
EFFECTIVE 生效中EXPIRED 已到期DISSOLVED 已解除TERMINATED 已终止
advance_status
SUBMITTED 已提交SITE_APPROVED 驻场初审通过PM_APPROVED 经理终审通过PAID 已拨款REPAID 已抵扣REJECTED 已驳回
release_reason · 释放原因
MANUAL 主动释放TIMEOUT_24H 24h 超时INTERVIEW_FAILED 面试未通过CONFIRM_TIMEOUT 确权超时NO_SHOW 爽约CANCELLED 取消报名RESIGNED 离职COMPANY_CLOSED 公司注销
03 · 用户状态机迁移表
这是全系统最核心的一张表。每一次迁移都必须写入 user_status_log(含操作人、原因、时间、IP) —— 释放与取消在纠纷时是关键证据。
| From | To | 触发事件 | 触发方 | 必须执行的副作用 |
| GUEST | PRIVATE_PENDING | 扫码 / 分享链接注册 | 用户 | 写 source_company_id(永久)+ bound_company_id;启动 24h 窗口;推送驻场 |
| GUEST | PUBLIC_SEEKING | 自主注册 / 品牌广告 / 已入职员工分享 | 用户 | source = PLATFORM;bound = NULL;不启动 24h 窗口 |
| GUEST | EMPLOYED | 花名册导入 | 平台/企业 | 直接为私域在岗;计入存量基数(免费期内) |
| PUBLIC_SEEKING | PENDING_INTERVIEW | 报名岗位 | 用户 | 公域→私域唯一转变点:写 bound_company_id;quota_remaining -1;启动 24h;通知驻场 |
| PRIVATE_PENDING | PENDING_INTERVIEW | 报名岗位 | 用户 | bound 不变;quota_remaining -1;重置 24h |
| PENDING_INTERVIEW | PENDING_CONFIRM | 到厂确认 + 面试通过 | 驻场 | 重置 24h(确权窗口);生成待签合同 |
| PENDING_CONFIRM | EMPLOYED | 入职确权 + 电子签约 | 驻场 | 唯一统计节点:bound 写入;合同生效;启动计费(服务费 + 流转费);推送项目经理/老板;清空 response_deadline |
| PENDING_INTERVIEW | PUBLIC_SEEKING | 面试未通过 / 取消报名 / 爽约 / 24h 超时 | 驻场 / 系统 | bound 清空;quota_remaining +1;source 不变;记录 release_reason |
| PENDING_CONFIRM | PUBLIC_SEEKING | 确权超时 24h | 系统 | bound 清空;quota +1;作废待签合同 |
| PRIVATE_PENDING | PUBLIC_SEEKING | 主动释放 / 24h 无跟进被动释放 | 经纪人 / 系统 | bound 清空;source 保留(后续流转费仍归原公司 8 元/天) |
| EMPLOYED | RESIGNED | 离职确认 | 项目经理 | bound 清空;停止全部计费;合同 → 已终止;结清 advance_debt;释放宿舍/工号 |
| EMPLOYED | EMPLOYED | 内部调岗 | 项目经理 | bound 不变;计费不中断;换 job_id / project_id |
| * (bound ≠ NULL) | PUBLIC_SEEKING | 公司注销 / 倒闭 | 平台 | 批量 bound 清空;source 保留仅存证;后续流转费 10 元全归平台;历史数据不删 |
禁止的迁移:用户不可自行触发任何释放类迁移;企业不可在 EMPLOYED 状态下单方面置为公域(必须走离职流程);source_company_id 在任何迁移中都不得写入。
04 · 其他状态机
job · 岗位
| From → To | 触发 | 副作用 |
| 待审核 → 招聘中 | 平台审核通过 | 进入匹配池,weight = 1.0 |
| 待审核 → 已下架 | 审核驳回 | 同步驳回说明至企业端 |
| 招聘中 → 暂停招聘 | 企业操作 / 满员 | 移出匹配池,数据保留 |
| 暂停招聘 → 招聘中 | 企业恢复 | posted_days 重置,权重从新岗位算 |
| 招聘中 → 强制下架 | 投诉 ≥3 属实 / 低转化 >90 天 | weight = 0;扣诚信分 |
advance · 薪酬预支
| From → To | 触发 | 副作用 |
| — → 已提交 | 员工本人发起 | 校验 5 项准入;占用 1 次机会 |
| 已提交 → 驻场通过 | 驻场初审 | 推送项目经理 |
| 驻场通过 → 经理终审通过 | 项目经理 | 双级即终审,进入拨款 |
| 终审通过 → 已拨款 | 财务 | advance_debt += 500 |
| 已拨款 → 已抵扣 | 发薪日定时任务 | 实发不足则部分抵扣并结转 |
| 任意 → 已驳回 | 任一节点驳回 | 退回本次机会 |
05 · 定时任务清单
系统约一半的业务逻辑发生在无人操作的后台任务里 —— 计费、超时释放、账单、抵扣、降权全靠它们。原型无法表达这一层,但它决定系统是否真的能跑起来。所有任务必须幂等。
| 任务 | 频率 | 幂等键 | 职责与关键约定 |
daily_billing | 每日 00:05 | biz_date + user_id + fee_type | 核心:按 00:00 在岗快照生成计费明细。增量 = 当前在岗 − 存量基数;流转费按 source 判定分账。离职当日是否计费需产品裁定(原型按不计) |
response_timeout_scan | 每 5 分钟 | user_id + stage + deadline | 核心:扫描 response_deadline 到期的私域用户 → 被动释放为公域,写 release_reason=TIMEOUT_24H,推送用户与企业 |
follow_up_push | 白天每 6h 夜间每 12h | user_id + round_no | 向驻场 / 项目经理 / 老板三方推送跟进提醒(文档第四节)。需定义"白天"时段边界 |
job_weight_recalc | 每日 01:00 | job_id + biz_date | 重算挂岗衰减 × 诚信系数 × 限流系数 × 名额系数;结果仅平台可见 |
zombie_job_scan | 每日 01:30 | job_id | 挂岗 >60 天零报名零入职 → weight=0 移出匹配池 |
job_stale_notify | 每日 09:00 | job_id + rule_code | 15 天无新报名 / 30 天无新入职 / 45 天强制更新三档提醒 |
stock_base_lock | 每日 02:00 | company_id | 免费期满自动锁定存量基数,锁定后不可变 |
credit_score_calc | 每日 03:00 | company_id + biz_date | 诚信分扣分归集 + 三级处罚判定(单月 3 次异常 / 连续 2 月 / 连续 3 月) |
report_expire | 每 10 分钟 | application_id | 报备超时未确认自动作废(文档 6.3) |
monthly_bill_gen | 每月最后一天 23:30 | company_id + month | 汇总 billing_daily 生成企业月账单,推送企业端,开启 5 个工作日异议期 |
advance_deduct | 发薪日(企业可配) | advance_id | 从实发工资抵扣;不足则部分抵扣 + 结转,不计息 |
advance_quota_grant | 每日 04:00 | user_id + biz_month | 每满 7 个在岗日 +1 次机会;月上限 4 次;月末清零不结转 |
contract_expire_notify | 每日 10:00 | contract_id + days | 合同到期前 60/30/7 天提醒 |
06 · 事件与消息清单
文档定义了十余种推送但没有统一的事件模型。建议以事件驱动,订阅方与通道可配置,避免推送逻辑散落在各业务代码里。
| 事件 | 触发点 | 订阅方 | 通道 / 备注 |
| APPLICATION_CREATED | 报名成功 | 驻场 | 站内 + Push;驻场需「点击知悉」 |
| INTERVIEW_INFO_PUSHED | 驻场知悉后推送 | 求职者 | 站内 + 短信;含时间/地点/路线/证件清单 |
| ARRIVAL_CONFIRMED | 到厂确认 | 求职者、项目经理 | 站内 |
| CONTRACT_SIGNED | 电子签约完成 | 项目经理 + 劳务老板 | 文档 7.3 明确要求双端推送 |
| FOLLOW_UP_REMINDER | 24h 窗口定时 | 驻场 + 项目经理 + 老板 | 三方同步,白天 6h / 夜间 12h |
| USER_RELEASED | 任意释放路径 | 求职者、原归属公司 | 必须告知用户,否则产生"莫名看不到岗位"的信任损耗 |
| TRANSFER_FEE_STARTED | 流转人员入职确权 | 供给方公司、平台财务 | 流转费开始计费通知 |
| ADVANCE_PENDING_APPROVAL | 预支流转至下一节点 | 驻场 → 项目经理 | 逐级推送,含催办 |
| INJURY_ALERT | 工伤上报 | 项目经理 + 老板 | 文档 10.2「工伤紧急异常推送」,需最高优先级通道 |
| MONTHLY_BILL_ISSUED | 月账单生成 | 劳务老板 | 含异议入口 |
| COMPLAINT_VERIFIED | 投诉核实属实 | 企业、平台风控 | 触发扣分与下架 |
缺口提示:两份文档均未定义通知模板管理与渠道配置(站内 / 短信 / 微信 / Push),也未定义免打扰时段。建议 V1.0 至少支持模板文案可配置,避免改文案就发版。
08 · 边界与幂等约定
以下均为两份文档未覆盖、但开发必然遇到的问题。需产品逐条裁定并写入验收标准。
| 编号 | 场景 | 问题 | 原型采用的口径(待确认) |
| E-01 | 岗位名额并发 | 多人同时报名最后 1 个名额 | 乐观锁 + 版本号;扣减失败提示「名额已满」并引导重新匹配 |
| E-02 | 名额扣减时点 | 报名时扣还是入职时扣?取消/爽约是否回补? | 报名即扣 −1;取消 / 爽约 / 面试未通过 / 超时均 +1 回补 |
| E-03 | 计费日切 | 当日入职、当日离职是否计费 | 按 00:00 在岗快照:当日入职不计,次日起计;离职当日不计 |
| E-04 | 跨月入离职 | 月中入职的账单归属 | 按自然日累计,不做整月折算 |
| E-05 | 24h 窗口起点 | 从注册算还是从每阶段完成算 | 每个阶段完成时刻重置(注册 / 报名 / 面试通过各自起算) |
| E-06 | 存量人员回流 | 存量员工离职后再入职原公司 | 恢复存量身份,基数不变,仍免费 |
| E-07 | 内部调岗计费 | 同公司换项目是否中断计费 | 不中断,视为持续在岗 |
| E-08 | 流转费与服务费叠加 | 流转人员是否同时计两种费 | 叠加(文档 2.4 资金流向表已明确) |
| E-09 | 预支欠款跨公司 | A 公司欠款未清即入职 B 公司 | 离职时强制结清;未清则打失信标记,新公司不承接旧债 |
| E-10 | 重复实名 | 同一身份证多次注册 | 一证一号;24h 内多手机号注册判定代刷,扣引流企业 30 分 |
| E-11 | 释放后立即再报名 | 被释放用户能否马上报回原公司 | 可以;但同一岗位 24h 内不重复推荐 |
| E-12 | 时区与节假日 | 24h / 5 个工作日 / 自然周的口径 | 统一 Asia/Shanghai;「工作日」需接入法定节假日日历 |
数据安全与留痕(合规底线)
加密存储
手机号、姓名、身份证号必须加密落库;证件照片 OCR 后不留存原图
分级脱敏
驻场可见完整手机号;项目经理隐藏手机与证件;老板仅聚合数据
永久留痕
告知书同意(ID+时间+IP)、状态迁移、释放/取消操作人、诚信分人工调整