机构版人力报表 · 取值逻辑说明

数据来源:staff_roster(花名册) · 每日凌晨自动同步 · 前端实时查库

零、数据源与全局规则

数据源

staff_roster 表(全量花名册,含在职+离职)

通过 /api/hr/institution-report?institution=all 返回全部数据,前端 JS 全程内存过滤,无二次请求。

机构筛选

页面顶部下拉框,选项从数据动态提取。选择具体机构后,所有模块同步联动(前端 filter 实现,不影响数据库查询)。

日期范围

起始月 1 日 ~ 结束月最后一天。作用于以下判定:

岗位序列归一化

normSeq(s) = s.replace('序列','').trim()

数据中原字段 job_sequence 混用"护理"和"护理序列"两种写法,统一去掉"序列"后缀后分组。最终展示 9 个序列:

序号序列名
1管理
2护理
3医护
4行政
5后勤
6居家
7实习
8职能
9销售

某序列在某筛选维度下三项均为 0 时不显示该行。

一、在岗与流动分析

期末在岗人数判定

在岗条件:entry_date ≤ 结束日期
              AND (leave_date 为空 OR leave_date > 结束日期)

即:在结束日期之前已入职,且尚未离职(或离职日期在结束日期之后)。这是时点快照,不是区间累计。

期间离职人数

leave_date ∈ [起始日期, 结束日期]

期间入职人数

entry_date ∈ [起始日期, 结束日期]

表格结构(6列)

列名取值逻辑说明
岗位序列归一化后的 job_sequence,按固定 9 类顺序排列零值隐藏
在岗人数期末在岗且属于该序列的人数核心指标
在岗占比序列在岗 ÷ 总在岗 × 100%含进度条可视化
期间离职leave_date 在区间且属于该序列零值显示"-"
期间入职entry_date 在区间且属于该序列零值显示"-"
离职率序列离职 ÷ (序列在岗 + 序列离职) × 100%分母不含无关联序列
离职率使用"该序列在岗+该序列离职"作为分母,而非全司在岗+全司离职,确保每个序列的离职率反映该序列自身的流动情况。
二、入职数据分析

数据范围

entry_date ∈ [起始日期, 结束日期] 的全部记录

分组规则

  • job_title(岗位名称)分组,非 job_sequence
  • 照护师始终置顶(排在第一位),其余按入职人数降序排列

留存率计算

留存率 = 期末仍在职人数 ÷ 期间入职人数 × 100%

"仍在职"的判断依据:该条记录的 status = '在职'

分页

每页 10 条,多于 10 个岗位时出现分页控件。

三、老带新分析

老带新定义

recruit_source = '内部推荐' AND recruit_detail ≠ 空

推荐人提取规则

recruit_detail 字段(queId: 208893869)进行文本清洗:

extractName(raw) = raw.replace(/推荐|介绍/g, '').trim()

示例:

  • "胡道正推荐" → 推荐人 = 胡道正
  • "王文婷介绍" → 推荐人 = 王文婷
  • "王淑侠" → 推荐人 = 王淑侠(无后缀直接取值)
⚠️ 注意:recruit_detail 字段映射为 queId=208893869(推荐人),非 208723126(具体来源渠道)。此映射已在 sync_staff_roster.py 中修正。

汇总指标

指标计算方式
在职老带新人数老带新中 status='在职' 的人数
在职老带新占比在职老带新 ÷ 期末在岗总人数 × 100%

明细表

列出全部老带新记录(分页 10 条),列:推荐人、被推荐人、入职日期、岗位、机构、状态。在职者优先排序,同状态下按入职日期倒序。

四、离职数据分析

数据范围

leave_date ∈ [起始日期, 结束日期]

分组规则

leave_type 字段动态分组。不再将"其他"类合并,而是按实际类型逐一展示,按人数降序排列。

表格结构

列名说明
指标首行为"总离职",其余按 leave_type 实际值
人数该类型的离职人数
占离职比例该类型 ÷ 总离职 × 100%
五、离职率分析

计算公式

总离职率 = 期间总离职人数 ÷ (期末在岗人数 + 期间总离职人数) × 100%
主动离职率 = 期间主动离职人数 ÷ (期末在岗人数 + 期间总离职人数) × 100%
分母统一使用"期末在岗+期间离职",与综合 HR 报表公式一致。主动离职率为同一分母下的子指标。