出差补贴 HTML 工具生成
你要做什么
把用户提供的出差补贴数据(图片或表格文件)转成一个单文件 HTML 工具,让行政人员可以逐一给员工复制私信内容。
数据来源判断
| 来源 | 处理方式 |
|---|---|
| Excel / CSV 文件 | 用 Python + openpyxl 读取,直接提取,准确率高 |
| 图片 | 直接识别图片中的表格数据,逐行提取 |
Excel 优先于图片——如果用户同时提供了两种,用 Excel。
字段对应规则
读取时按以下列顺序提取(以实际表头为准,灵活匹配):
| 字段 | 对应列 |
|---|---|
| 姓名 | 姓名列 |
| 部门 | 部门列 |
| 出差天数 | 实际打卡天数 / 出差天数 |
| 补贴标准 | 补贴标准 / 出差补贴/天 |
| 本月出差补贴 | 总数 / 合计列(非小计) |
| 出差地点 | 最后一列 |
特殊处理:
- 同一人多行:合并为一条,天数用"、"分隔,标准去重,金额取最后非空的总数列,地点合并去重
- 过滤非人员行:跳过标题行、合计行、备注行(没有姓名或姓名以 ¥ 开头的行)
- 字段为空:显示"-"
私信模板(固定格式)
请确认出差补贴,如有问题随时告知我,
[姓名]
部门:[部门]
出差天数:[天数]天
补贴标准:[标准]
本月出差补贴:[金额]元
出差地点:[地点]
私信内容在 Python 阶段预先生成,存入数据,不在 JS 里拼接(避免转义问题)。
HTML 工具功能要求
布局
- 顶部固定栏:显示「总人数 / 已完成 / 剩余」,实时更新
- 搜索框:支持按姓名或部门过滤
- 卡片式网格:每人一张卡片,响应式
卡片内容
- 姓名 + 部门(标题区)
- 状态标签:待处理 / 已完成
- 四个字段:出差天数、补贴标准、本月补贴(蓝色加粗高亮)、出差地点
- 两个按钮:📋 复制姓名 / 📝 复制私信
防呆逻辑
- 任一按钮点击:该按钮变绿显示"✅ 已复制",2秒后恢复
- 两个按钮都点击:整张卡片变灰,状态变"已完成",统计同步更新
- 底部 Toast 提示:复制成功后弹出,2秒消失
技术要求
- 单文件 HTML,含内联 CSS/JS,无外部依赖
- 所有数据直接硬编码在 JS 的
DATA数组里 - 编码 UTF-8
执行步骤
情况一:Excel / CSV 文件
- 用 Python 读取文件(openpyxl 或 csv 模块),强制 UTF-8 输出
- 合并同名人员,生成 JSON 数据(含预生成的 msg 字段)
- 将数据嵌入 HTML 模板,生成完整 HTML 文件
- 保存到用户桌面或指定路径
- 用浏览器打开验证渲染和功能
情况二:图片
- 识别图片中所有数据行,按字段规则提取
- 在页面顶部输出「识别人数:X人」供用户核对
- 合并同名人员,生成完整 HTML
验证要点(生成后必须检查)
- [ ] 浏览器打开后卡片正常渲染,统计数字正确
- [ ] 控制台无 JS 报错
- [ ] 点击"复制私信",私信内容格式与模板一致
- [ ] 两个按钮都点击后卡片变灰、状态变"已完成"
常见问题
| 问题 | 原因 & 解决 |
|---|---|
| 卡片不显示 / 统计为 0 | JS 语法错误,通常是字符串里含单引号或反斜杠导致转义失败 → 私信内容在 Python 预生成,不在 JS 里拼接 |
| 中文乱码 | Python 输出没强制 UTF-8 → 用 io.TextIOWrapper(sys.stdout.buffer, encoding='utf-8') |
| 少了某人 | 合并逻辑只合并"同名",检查是否有姓名拼写差异 |
| 金额不对 | 优先取"总数"列而非"小计"列 |