返回 Skill 列表
extension
分类: 数据与分析无需 API Key

人才盘点系统生成技能

基于人员花名册Excel自动生成可视化、可交互的HTML人才盘点系统。涵盖年龄/学历/职称/考核/执业资格等多维分析, 支持多级筛选查询、点击图表下钻名单、Excel/CSV导出、管理员权限控制、后备人才库、在线数据收集、 AI智能问询及EdgeOne Pages/COS一键部署。触发词:人才盘点、人员花名册分析、生产系统人才报告、 人员画像、关键岗位分析、项目经理档案、人才梯队九宫格。

person作者: user_0b627a67hubcommunity

人才盘点系统生成技能

从人员花名册 Excel 到可交互 HTML 人才盘点报告的全流程自动化技能。

工作流程总览

Excel花名册 → Python解析/增强 → JSON数据 → Python构建 → HTML报告 → 部署分享

Phase 1: 数据准备

1.1 输入要求

Excel 花名册(.xlsx),需包含以下标准字段(列名):

| 字段 | 说明 | 示例 | |------|------|------| | 序号 | 编号 | 1 | | 二级单位 | 如"华南大区" | 华南大区 | | 三级单位 | 如"华南钢结构公司" | 华南钢结构公司 | | 部门/项目 | 项目或部门名称 | 深圳前海项目 | | 姓名 | 人员姓名 | 张三 | | 性别 | 男/女 | 男 | | 出生日期 | YYYY-MM-DD | 1990-05-15 | | 政治面貌 | 中共党员/共青团员/群众 | 中共党员 | | 参加工作时间 | YYYY-MM-DD | 2012-07-01 | | 入职科工时间 | YYYY-MM-DD | 2012-07-01 | | 职级 | 数值或文本 | 23 | | 主任职 | 如"项目经理" | 项目经理 | | 第一学历 | 学历 | 大学本科 | | 最高学历 | 最高学历 | 大学本科 | | 职称 | 正高级/副高级/中级/初级/无职称 | 中级 | | 职业资格 | 资格名称 | 一级建造师-建筑工程 | | 2023/2024/2025年考核 | A/B+/B/C | A | | 人员标签 | 如"管理人员" | 管理人员 | | 项目分类 | 如"房建""桥梁""总部" | 房建 | | 项目状态 | 在施阶段/准备阶段/完工阶段等 | 在施阶段 |

1.2 数据解析

用 Python 解析 Excel,生成 people_data_enhanced.json

import openpyxl, json, re
from datetime import date, datetime
from collections import Counter

AGE_BANDS = [(25, '25岁以下'), (30, '26-30岁'), (35, '31-35岁'),
             (40, '36-40岁'), (45, '41-45岁'), (50, '46-50岁'),
             (55, '51-55岁'), (999, '55岁以上')]

def parse_date(val):
    """解析各种格式的日期"""
    if isinstance(val, (date, datetime)):
        d = val if isinstance(val, date) else val.date()
        return d.strftime('%Y-%m-%d')
    if isinstance(val, str):
        for fmt in ['%Y-%m-%d', '%Y/%m/%d', '%Y.%m.%d', '%Y%m%d']:
            try: return datetime.strptime(val.strip(), fmt).strftime('%Y-%m-%d')
            except: pass
        m = re.match(r'^(\d{4})[-/.](\d{1,2})[-/.](\d{1,2})$', val)
        if m: return f'{m.group(1)}-{m.group(2).zfill(2)}-{m.group(3).zfill(2)}'
    return None

def calc_age(dob_str, ref=date(2025,5,1)):
    """根据出生日期计算年龄"""
    if not dob_str: return None
    try:
        parts = dob_str.split('-')
        yr, mo, dy = int(parts[0]), int(parts[1]), int(parts[2])
        age = ref.year - yr - ((ref.month, ref.day) < (mo, dy))
        return age
    except: return None

def calc_years(start_str, ref=date(2025,5,1)):
    """计算参加工作/司龄年限"""
    if not start_str: return None
    try:
        parts = start_str.split('-')
        yr, mo, dy = int(parts[0]), int(parts[1]), int(parts[2])
        return round((ref - date(yr, mo, dy)).days / 365.25, 1)
    except: return None

def get_age_band(age):
    """获取年龄段"""
    if age is None: return '未知'
    for max_age, band in AGE_BANDS:
        if age <= max_age: return band
    return '55岁以上'

def normalize_title(raw):
    """规范化职级(提取数字)"""
    if not raw: return None
    m = re.search(r'(\d+)', str(raw))
    return int(m.group(1)) if m else None

FIELD_MAP = {
    '序号': 'seq', '二级单位': 'unit2', '三级单位': 'unit3',
    '部门/项目': 'dept', '部门': 'dept', '姓名': 'name',
    '性别': 'gender', '出生日期': 'dob', '政治面貌': 'political',
    '参加工作时间': 'work_start', '入职科工时间': 'join_gjkg',
    '职级': 'level_raw', '主任职': 'title_post',
    '第一学历': 'edu1', '最高学历': 'edu_high',
    '职称': 'title', '职业资格': 'cert_raw',
    '2023年考核': 'assess_2023', '2024年考核': 'assess_2024',
    '2025年考核': 'assess_2025',
    '人员标签': 'person_tag', '项目分类': 'project_cat',
    '项目状态': 'project_status', '部门属性': 'dept_attr',
    '身份证号': 'id_no',
}

关键技术要点:

  • 日期支持多种格式解析(YYYY-MM-DD, YYYY/MM/DD, YYYY.MM.DD, 等)
  • 年龄基于基准日期(默认2025-05-01)动态计算
  • 职级从原始文本中提取数值(如"23上位值" → 23)
  • 职业资格按分号或逗号拆分为列表
  • 司龄/工龄精确到小数点后1位

1.3 CSV模板下载

在HTML报告中,后台数据页面提供模板下载,包含所有列名和示例数据:

  • 32个标准字段
  • 2条示例数据(含中文内容)

Phase 2: HTML报告构建

2.1 构建脚本

build_report_v3.pypeople_data_enhanced.json 读取数据,计算所有统计指标,嵌入完整的HTML模板。

统计计算模块

  • 年龄:平均年龄、年龄段分布(8个段)
  • 学历:最高学历分布(6类)
  • 职称:正高/副高/中级/初级/无职称
  • 司龄:平均司龄、6个段位分布
  • 政治面貌:中共党员/共青团员/群众统计
  • 职业资格:持证率、TOP15证书排名
  • 考核成绩:近三年ABCD分布、趋势对比
  • 项目分类:三大板块(一线/制造/机关)分组统计
  • 项目状态:在施/准备/完工/保修分布
  • 三级单位:各单位人数、平均年龄、本科率、职称率、项目经理数
  • 关键岗位:项目经理/项目班子/车间主任专项分析
  • 人才梯队:绩效×潜力九宫格(基于考核×学历/职称/荣誉/证书综合评分)

2.2 HTML页面结构(12个标签页)

| 标签页 | 内容 | |--------|------| | 总览 | KPI卡片(6个核心指标)、年龄/学历/职称/政治面貌图表、三级单位排名 | | 年龄与性别 | 年龄段柱状图+性别饼图、各单位年龄结构对比、核心发现+风险提示 | | 学历与职称 | 学历分布+职称饼图、各单位本科率/职称率对比、紧迫建议 | | 执业资格 | TOP15持证人数柱状图、各单位持证率、证书人才名单 | | 考核成绩 | 🔒近三年考核对比、各层级趋势、各单位A级占比(管理员密码talent2025) | | 三级单位分析 | 单位卡片网格(6维指标)、综合雷达图、全员名单 | | 项目分类 | 三大板块饼图、TOP12条形图、分类卡片、年龄/学历对比、施工状态分布 | | 关键岗位 | 项目经理/项目班子/车间主任概览卡片+分别的年龄/学历/职称图表 | | 项目经理档案 | 档案概览、人才梯队九宫格、考核趋势、荣誉/资质图表、个人履历详情 | | 后备人才库 | 添加/编辑/删除/导入/导出(localStorage持久化)、CSV/JSON互转 | | 人员查询 | 10维多选筛选+姓名搜索、敏感信息🔒模糊、Excel/CSV导出 | | 后台数据 | Excel花名册导入(拖拽上传)、在线采集表(二维码/腾讯文档/表单)、模板下载 |

2.3 HTML特性

  • 自包含:单文件HTML,内嵌所有CSS/JS,无外部依赖(Chart.js/XLSX/QRCode通过CDN加载)
  • 手机端友好:响应式布局,@media适配900px以下
  • 微信兼容:无外部重定向,可直接通过EdgeOne Pages或已备案域名在微信打开
  • 隐私保护:管理员密码SHA-256验证,考核成绩/职级/职称自动模糊(filter:blur(4px)
  • 图表交互:所有Chart.js图表支持点击下钻查看详细人员名单
  • 多选下拉:自研MultiSelect组件,支持搜索过滤、多选、计数展示
  • 内置AI:键盘+规则匹配问答系统,支持自然语言查询花名册数据
  • 数据持久化:后备人才库、已收集数据、腾讯文档链接全部localStorage存储

2.4 管理员权限

默认管理员密码:talent2025(SHA-256哈希:5145aaca59e842d7b6d27cf7bb583bc69e5cec322fde3da496041c2fe9a9b065

登录后解锁:

  • 考核成绩页面完整可见
  • 主任职/职称/考核成绩列取消模糊
  • 人员查询中开放考核等级筛选
  • 后备人才库中显示职级/考核信息

Phase 3: 部署

3.1 EdgeOne Pages(推荐,微信可打开)

# 1. 确保HTML文件在部署目录
mkdir -p /tmp/talent-report-deploy
cp /path/to/人才盘点分析报告V3.html /tmp/talent-report-deploy/index.html

# 2. 部署
cd /tmp/talent-report-deploy && \
PAGES_SOURCE=skills \
/Users/macbook/.workbuddy/binaries/node/versions/22.12.0/bin/node \
/Users/macbook/.workbuddy/binaries/node/workspace/node_modules/edgeone/edgeone-bin/edgeone.js \
pages deploy -n talent-report

⚠️ 注意:

  • EdgeOne CLI需要先安装:npm install edgeone@latest
  • 部署后URL默认带 eo_token 鉴权参数
  • 需在控制台将项目设为公开访问,否则微信会显示401
  • *.edgeone.cool 域名未ICP备案,微信内需申请域名恢复(1-3个工作日)
  • 最佳方案:绑定自有已备案域名

3.2 腾讯云COS(备选)

# 上传并设置Content-Disposition为inline
python3 /path/to/cos_upload.py /path/to/report.html talent-report/v3.html

⚠️ COS直链和cos-website域名在微信内均会触发下载,需配合EdgeOne CDN加速使用。

3.3 htmlcode.fun(快速分享)

使用 html-deploy 技能快速部署到公网分享链接。


Phase 4: 简历增强(可选)

如需项目经理个人档案信息(工作履历、业绩亮点、荣誉获奖、资格证书),需要额外处理:

  1. 收集项目经理Word格式简历表(.docx)
  2. 运行 extract_resumes.py 解析简历
  3. 生成 resume_data.json
  4. 合并到 people_data_enhanced.json 中的 _resume 字段
# 简历字段结构
_resume = {
    "name": "张三",
    "gender": "男",
    "dob": "1985-03-15",
    "political": "中共党员",
    "phone": "13800138000",
    "work_start": "2008-07-01",
    "join_gjkg": "2008-07-01",
    "title": "高级工程师",
    "level_raw": "Z5",
    "positions": [],        # 历任职务
    "edu1": "大学本科",
    "edu_high": "硕士研究生",
    "work_history": [{"dates": ["2010","至今"], "desc": "..."}],
    "achievements": [{"year": "2024", "content": "..."}],
    "honors": [{"name": "优秀项目管理者", "level": "公司级", "date": "2024"}],
    "cert_abc": ["一级建造师-建筑工程"],   # 注册类
    "cert_pro": [],                          # 专业类
    "cert_qual": []                          # 岗位类
}

常见问题

| 问题 | 原因 | 解决方案 | |------|------|----------| | 微信打开显示下载 | Content-Disposition未设inline | 通过EdgeOne Pages部署 | | 微信显示"申请恢复访问" | 域名未备案 | 绑定已备案自定义域名 | | 页面加载后图表空白 | Chart.js CDN加载失败 | 检查网络/改用国内CDN | | Excel导入后字段为空 | 列名不匹配 | 按模板调整Excel表头 | | 中文路径npm报错 | Node.js对中文路径支持差 | 将脚本和依赖放/tmp/ | | 年龄计算不准确 | 基准日期固定 | 修改ref=date(2025,5,1) |