diff --git a/CLAUDE.md b/CLAUDE.md index d823011..9ce5627 100644 --- a/CLAUDE.md +++ b/CLAUDE.md @@ -46,7 +46,7 @@ pnpm dev # http://localhost:3000 ;Console 在 /_console/ ;管理员 adm | D3 重启与清理 | 改对象/视图/hook 需重启 dev;清理 `dist/` 与 `.objectstack/` 下本实例数据库(种子数据可重建) | | D4 测试账号 | 管理员 admin@objectos.ai / admin123;各岗位账号在 Setup 建用户后分配岗位:人力审核、人力负责人、部门填报、分公司核对、分管领导(种子只建组织树,用户不可种子) | | E1 报告形态 | Markdown 测试报告挂工作项评论(模板见 os-project-dev-test) | -| E2 截图归档 | 孤儿分支 `acceptance-evidence`,图链用 commit SHA 形式;**截图与证据文件禁止提交到 main 或功能分支的代码树**(`docs/evidence/` 已在 .gitignore),维护者 2026-09-02 要求 | +| E2 截图归档 | 孤儿分支 `acceptance-evidence`,图链用 commit SHA 形式;**截图与证据文件禁止提交到 main 或功能分支的代码树**(`docs/evidence/` 已在 .gitignore);**例外:操作手册的配图**是手册正文的一部分,随源稿归档在 `docs/手册/图片/`(维护者 2026-09-03 决定),维护者 2026-09-02 要求 | | F2 合并权限 | 无——仅库级授权生效(AI 不自行合并) | | G1 失败升级 | 工作项评论 @ 技术负责人 | | G2 平台问题上报 | objectstack-ai/objectstack 仓库 issue(现象、最小复现、期望能力、平台版本);**只上报,不修复**——不认领平台 issue、不在平台仓开 PR(维护者 2026-09-03 要求) | diff --git a/README.md b/README.md index 0ebb16e..34f3e3d 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,7 @@ | [docs/00-设计方案.md](docs/00-设计方案.md) | 设计方案 V1.0(客户 2026-09-02 确认,唯一需求基准);Word 成品在 [docs/交付/](docs/交付/)(V0.9 送审稿、V1.0 客户确认版),由 `pnpm docs:docx` 从本源稿生成 | | [docs/01-需求解读报告.md](docs/01-需求解读报告.md) | 场景地图、平台能力覆盖度、风险、疑点(疑点已由设计方案 V1.0 关闭) | | [docs/02-总体方案蓝图.md](docs/02-总体方案蓝图.md) | os 能力映射、对象模型总图、模块依赖与开发顺序 | +| [docs/手册/KPI考核管理系统-操作手册.md](docs/手册/KPI考核管理系统-操作手册.md) | 分角色操作手册 V0.1(送审稿):通用操作 + 五个业务角色分章,含真实系统截图;Word 成品在 [docs/交付/](docs/交付/),由 `pnpm docs:manual` 从本源稿生成 | | [CLAUDE.md](CLAUDE.md) | 开发约定与 dev-issue 启用清单 | ## 快速开始 diff --git "a/docs/\344\272\244\344\273\230/KPI\350\200\203\346\240\270\347\256\241\347\220\206\347\263\273\347\273\237-\346\223\215\344\275\234\346\211\213\345\206\214-V0.1.docx" "b/docs/\344\272\244\344\273\230/KPI\350\200\203\346\240\270\347\256\241\347\220\206\347\263\273\347\273\237-\346\223\215\344\275\234\346\211\213\345\206\214-V0.1.docx" new file mode 100644 index 0000000..9ce832c Binary files /dev/null and "b/docs/\344\272\244\344\273\230/KPI\350\200\203\346\240\270\347\256\241\347\220\206\347\263\273\347\273\237-\346\223\215\344\275\234\346\211\213\345\206\214-V0.1.docx" differ diff --git "a/docs/\346\211\213\345\206\214/KPI\350\200\203\346\240\270\347\256\241\347\220\206\347\263\273\347\273\237-\346\223\215\344\275\234\346\211\213\345\206\214.md" "b/docs/\346\211\213\345\206\214/KPI\350\200\203\346\240\270\347\256\241\347\220\206\347\263\273\347\273\237-\346\223\215\344\275\234\346\211\213\345\206\214.md" new file mode 100644 index 0000000..0b286fc --- /dev/null +++ "b/docs/\346\211\213\345\206\214/KPI\350\200\203\346\240\270\347\256\241\347\220\206\347\263\273\347\273\237-\346\223\215\344\275\234\346\211\213\345\206\214.md" @@ -0,0 +1,1190 @@ +
+ +# KPI 考核管理系统 + +# 操作手册 + +
+ +**版本号:V0.1(送审稿)** + +**发布日期:2026 年 09 月 03 日** + +
+ +**编制方:(待项目经理填写单位全称)** + +**客户方:(待项目经理填写单位全称)** + +
+ +--- + +## 版本记录 + +| 版本号 | 日期 | 修订说明 | 编制人 | 审核/确认 | +|---|---|---|---|---| +| V0.1 | 2026-09-03 | 初稿:按《设计方案》V1.0 第 3 章的六个业务角色分章成册,覆盖登录、方案配置、指标下达、填报、核对、审核、加减分、数据调整、归档与审计查询;全部截图取自演示环境真实界面,并用红框与序号标注操作位置;附手册章节与界面对照索引、各角色练习任务清单 | AI 文档工程师 | 待业务顾问审 | + +依据文件:《KPI 考核管理系统 设计方案》V1.0(2026-09-02 客户方确认版)、《KPI 考核管理系统 功能性需求文档》V1.3(2026-09-02)。 + +--- + +## 目录 + +1. 通用操作 +2. 人力审核 +3. 部门填报人员 +4. 分公司核对人员 +5. 人力负责人 +6. 分管领导 +7. 常见问题总表 + 附录 A 手册章节与界面对照索引 + 附录 B 各角色练习任务清单 + +--- + +# 1. 通用操作 + +本章的内容对所有角色通用。各角色在读本章之后,直接翻到自己那一章。 + +**表 1 本手册涉及的角色与对应章节** + +| 角色 | 在系统里主要做什么 | 对应章节 | +|---|---|---| +| 人力审核 | 维护指标库与考核方案、指标下达、发布方案、人力节点审核、登记加减分、审批数据调整、归档、审计查询 | 第 2 章 | +| 部门填报人员 | 填报本部门数据并提交、发起数据调整申请 | 第 3 章 | +| 分公司核对人员 | 核对与本分公司相关的填报数据,确认无误或提出争议 | 第 4 章 | +| 人力负责人 | 审批加减分、审批数据调整 | 第 5 章 | +| 分管领导 | 分管主体的最终审批、查看分管主体的考核结果与看板 | 第 6 章 | +| 系统管理员 | 维护组织、用户与岗位 | 不在本册,另见系统管理员说明 | + +## 1.1 登录系统 + +**场景引入**:每天上班后第一件事,用本人账号登录系统,查看有没有等着自己处理的单据。 + +**操作步骤** + +1. 在浏览器地址栏输入单位提供的系统网址,回车。 +2. 在「邮箱」中输入本人邮箱(见图 1 标注 1)。账号与初始密码由管理员发放。 +3. 在「密码」中输入密码(标注 2)。 +4. 点「登录」(标注 3)。 + +![登录页面](图片/01-01-denglu.png) + +图 1 登录页面的「邮箱」「密码」输入框与「登录」按钮 + +**结果确认**:登录成功后进入「工作台」页面,页面右上角显示本人姓名首字的头像。 + +**常见问题** + +- 提示邮箱或密码不正确:先确认邮箱有没有多打空格;仍不成功,请联系管理员重置密码。 +- 登录后看不到「KPI 考核管理」的菜单:说明本人账号还没有分配考核岗位,请联系管理员分配岗位。 + +## 1.2 认识工作台与左侧菜单 + +**场景引入**:第一次使用系统时,先认清楚菜单结构,后面找功能就不用问人。 + +**操作步骤** + +1. 登录后默认进入「工作台」(见图 2 标注 1),这里有全流程的顺序说明和各角色的操作提示。 +2. 左侧是功能菜单,按「填报与审核」「考核方案」「结果与归档」「基础设置」「审计查询」五组归类(标注 2),点分组名展开。 +3. 右上角头像是个人菜单(标注 3),里面有「个人资料」「语言」「注销」。 + +![工作台与左侧菜单](图片/01-02-gongzuotai.png) + +图 2 工作台页面与左侧功能菜单分组 + +**结果确认**:能在左侧菜单里找到自己那一章要用的菜单项,即为认清。 + +**常见问题** + +- 左侧菜单项比手册里写的少:每个角色只看得到自己权限内的菜单,这是正常的。 +- 界面上部分列头显示为英文:这是当前送审版本的已知问题,本手册在这些位置同时给出列头原文与业务含义,不影响操作。 + +## 1.3 切换应用 + +**场景引入**:同一个账号可能同时开通了几个业务系统,需要在它们之间来回切换。 + +**操作步骤** + +1. 点页面顶部左侧的应用名(见图 3 标注 1),打开「切换应用」列表。 +2. 在列表中点要进入的应用名。 + +![切换应用](图片/01-03-qiehuan-yingyong.png) + +图 3 顶部应用名下拉出的「切换应用」列表 + +**结果确认**:页面顶部的应用名变成所选应用,左侧菜单同步变成该应用的菜单。 + +**常见问题** + +- 列表里只有一个应用:说明本人账号只开通了这一个应用。 + +## 1.4 看懂待办队列 + +**场景引入**:每天上班后先看一眼与自己有关的队列,判断今天要处理哪些单子。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「填报单」。 +2. 列表上方是一排队列页签:「全部填报单」「填报中」「分公司核对中」「待人力审核」(见图 4 标注 1)。 +3. 页签放不下时,右侧会出现「还有 N 个」(标注 2),点它可以看到「待领导审批」「已通过」「已归档」「流程看板」。 +4. 点某个队列页签,列表只显示该状态的填报单。 + +![填报单的队列页签](图片/01-04-daiban-duilie.png) + +图 4 填报单列表的队列页签与「还有 4 个」入口 + +**结果确认**:点某个队列后,列表中每一行的「Status」(状态)列都与页签名称一致。 + +**常见问题** + +- 找不到「待领导审批」页签:它在「还有 N 个」里,点开即可。 +- 队列里没有单子:说明当前没有处于该状态、且本人有权查看的填报单。 + +## 1.5 修改密码 + +**场景引入**:管理员发放初始密码后,第一次登录应当立即改成本人记得住、别人猜不到的密码。 + +**操作步骤** + +1. 点右上角头像 →「个人资料」。 +2. 滚动到「修改密码」区域。 +3. 在「当前密码」输入现在使用的密码(见图 5 标注 1)。 +4. 在「新密码」与「确认密码」输入两遍新密码(标注 2)。 +5. 点「修改密码」(标注 3)。 + +![修改密码](图片/01-05-xiugai-mima.png) + +图 5 个人资料页的「修改密码」区域 + +**结果确认**:页面提示修改成功;下次登录用新密码。 + +**常见问题** + +- 提示两次输入不一致:请重新输入「确认密码」。 +- 忘记当前密码:请联系管理员重置。 + +## 1.6 导出 Excel + +**场景引入**:需要把系统里的清单交给上级或存档时,把当前列表导出成 Excel。 + +**操作步骤** + +1. 打开任意一个列表页(填报单、填报明细、指标下达、考核结果等)。 +2. 点列表右上角工具条中的「导出」(见图 6 标注 1)。 +3. 在下拉中选「导出为 XLSX」(Excel 文件)或「导出为 CSV」。 + +![导出 Excel](图片/01-06-daochu-excel.png) + +图 6 列表工具条「导出」下拉中的「导出为 CSV」与「导出为 XLSX」 + +**结果确认**:浏览器下载一个文件,打开后内容与当前列表的可见列一致。 + +**常见问题** + +- 导出的内容比屏幕上看到的少:导出按当前队列页签与筛选条件执行,先取消筛选再导出。 +- 没有「导出」按钮:该列表对本人角色未开放导出,请联系管理员。 + +--- + +# 2. 人力审核 + +本章按「先建指标 → 再配方案 → 发布 → 审核 → 加减分与调整 → 归档 → 查审计」的顺序编排,与一次考核周期的实际工作顺序一致。 + +## 2.1 维护指标库 + +**场景引入**:新的考核周期开始前,先把本期要用的指标准备好。指标只建一次,以后各期方案都从指标库里选。 + +**操作步骤** + +1. 点左侧菜单「基础设置」→「指标库」(见图 7 标注 1),打开指标列表。 +2. 列表上方有两个视图页签:「全部指标」与「启用中」。 +3. 新增一条指标点「新建」(标注 2);从 Excel 批量导入点「导入」(标注 3);把当前清单导出点「导出」(标注 4)。 + +![指标库列表](图片/02-01-zhibiaoku-liebiao.png) + +图 7 指标库列表与「新建」「导入」「导出」按钮 + +4. 点「新建」后弹出建档窗口,上半部分是「基本信息」:填「Code」(指标编码,标注 1)、「Name」(指标名称,标注 2),再选「Category」(指标类别)、「Department Segment」(部门板块)、「数据来源」与「Status」(状态)。 +5. 往下是「计分规则」区(标注 3):选「指标方向」(越高越好 / 越低越好)与「Scoring Method」(计分方式),并填「完成率封顶(%)」「完成率保底(%)」。 + +![新建指标(基本信息与计分规则)](图片/02-02-xinjian-zhibiao-shangban.png) + +图 8 新建指标窗口的「基本信息」与「计分规则」 + +6. 计分方式选「阶梯计分」时,继续往下到「阶梯区间」表格(见图 9 标注 1),按行填「区间名称」「完成率下限(%,含)」「完成率上限(%,不含;空为无上限)」「得分率(%)」;要加一行点表格下方的「Add line」(新增行,标注 2)。 +7. 全部填完点「创建」(标注 3)。 + +![新建指标的阶梯区间](图片/02-03-xinjian-zhibiao-jieti.png) + +图 9 新建指标窗口下部的「阶梯区间」表格与「创建」按钮 + +**四种计分方式的填法** + +**表 2 计分方式与需要填的参数** + +| 计分方式 | 得分率怎么来 | 还要填什么 | +|---|---|---| +| 完成率线性 | 完成率限定在「保底」与「封顶」之间,直接当作得分率 | 完成率封顶(%)、完成率保底(%) | +| 阶梯计分 | 完成率落在哪个区间,就取该区间的得分率 | 阶梯区间各行 | +| 区间插值 | 区间下限得 0 分,完成率 100% 得满分,区间上限得封顶分,中间按直线插值 | 区间下限完成率(%)、区间上限完成率(%) | +| 自定义公式 | 由公式直接算出得分 | 计分公式 | + +完成率的算法:指标方向为「越高越好」时,完成率 = 实际值 ÷ 目标值;为「越低越好」时,完成率 = 目标值 ÷ 实际值。指标得分 = 权重 × 得分率。 + +**结果确认**:回到指标列表能看到新建的指标,「Status」为「启用」。点开指标可以看到「计分规则」相关字段(见图 10 标注 1),阶梯区间在「相关」页签下(标注 2)。 + +![指标详情](图片/02-04-zhibiao-xiangqing.png) + +图 10 客户满意度指标详情页的计分方式与「相关」页签 + +![指标的阶梯区间](图片/02-05-jieti-qujian.png) + +图 11 指标「相关」页签下的阶梯区间四行 + +**常见问题** + +- 提示指标编码重复:指标编码全系统唯一,换一个编码。 +- 指标口径变了怎么办:不要改历史指标,新建一条新版本指标,把旧指标的「Status」改成「停用」,并在旧指标的「替代版本」里指向新指标。 +- 停用的指标还能用吗:已发布方案里已经下达的指标不受影响;新方案里选不到停用指标。 + +## 2.2 新建 / 复制方案版本 + +**场景引入**:每个考核周期开一个方案版本。第二期开始,直接复制上一期的方案版本再改数,比从头配快得多。 + +**操作步骤** + +1. 点左侧菜单「考核方案」→「方案版本」(见图 12 标注 1),打开方案列表。 +2. 点「新建」(标注 2)。列表上方的「草稿」页签(标注 3)可以只看未发布的方案。 + +![方案版本列表](图片/02-06-fangan-liebiao.png) + +图 12 方案版本列表与「新建」按钮、「草稿」页签 + +3. 在建档窗口上部的「方案信息」里填「Plan Name」(方案名称,见图 13 标注 1),选「Period Type」(周期类型)、填「Year」(年度)、「期数(月/季/半年序号)」、「周期开始」「周期结束」。 +4. 要复制上一期的配置,在「复制自版本」中选中上一期的方案(标注 2)。选中后,保存时系统会把该方案的流程节点、参与主体、指标下达、到人分工与个人承接项一并复制过来。 + +![新建方案版本](图片/02-07-xinjian-fangan.png) + +图 13 新建方案版本窗口的「方案信息」与「复制自版本」 + +5. 同一个窗口往下有四张明细表格,可以在建档时一次配齐:「指标下达」(见图 14 标注 1)与「审核流程节点」(标注 2)。 + +![新建方案窗口的指标下达与审核流程节点](图片/02-08-xiada-yu-jiedian-wangge.png) + +图 14 新建方案版本窗口中的「指标下达」与「审核流程节点」表格 + +6. 继续往下是「参与主体与考核关系」(见图 15 标注 1)与「到人分工」(标注 2)。每张表格都用它下方的「Add line」(新增行)加行。 +7. 全部填完点「创建」(标注 3)。 + +![新建方案窗口的参与主体与到人分工](图片/02-09-zhuti-yu-fengong-wangge.png) + +图 15 新建方案版本窗口中的「参与主体与考核关系」「到人分工」表格与「创建」按钮 + +**结果确认**:回到方案列表能看到新方案,状态为「草稿」。点开方案进入方案详情页(见图 16),页面上方是状态条(标注 2),右上角是「发布方案」按钮(标注 1),「相关」页签(标注 3)里是四张明细表。 + +![方案详情页](图片/02-10-fangan-xiangqing.png) + +图 16 草稿状态的方案详情页与「发布方案」按钮 + +**常见问题** + +- 复制过来的目标值还是上一期的:复制会把上一期的目标值同时写进新方案的「基准值(上期)」,本期目标值要按 2.5 节逐条改。 +- 同一周期已经有生效版本:一个考核周期只允许一个已发布版本,先关闭旧版本,或者用复制出的新版本替换。 +- 建档窗口太长找不到按钮:窗口内部可以滚动,「创建」在最下方。 + +## 2.3 配置审核流程节点 + +**场景引入**:方案发布前,先确认这一期走几个审核环节、每个环节由哪个岗位处理。 + +**操作步骤** + +1. 打开方案详情页,点「相关」页签。 +2. 找到「流程节点」区域(见图 17 标注 1),这里按顺序列出本方案的审核环节。 +3. 要加一个环节点该区域右上角的「新建」;要改一行,点该行打开后修改。 +4. 每个节点要填:「顺序」「节点类型」「节点名称」「审核岗位」。 + +![方案的流程节点](图片/02-11-liucheng-jiedian.png) + +图 17 方案「相关」页签下的流程节点四行 + +**表 3 四种节点类型与默认审核岗位** + +| 节点类型 | 节点做什么 | 审核岗位 | +|---|---|---| +| 部门填报 | 部门填报人员录入实际值并提交 | 部门填报人员 | +| 分公司核对(并行) | 各分公司并行核对,全部确认后自动推进 | 分公司核对人员 | +| 人力审核 | 人力审核通过或驳回 | 人力审核 | +| 领导审批 | 分管领导最终审批 | 分管领导 | + +**结果确认**:流程节点区域按「顺序」列出各节点,顺序从 1 开始且不重复。发布时系统会校验节点配置,不合法会拦下并提示。 + +**常见问题** + +- 本期不需要分公司核对:把「分公司核对」这一行删掉即可,方案发布后填报单提交将直接进入人力审核。 +- 节点顺序填重了:发布时会被拦下,回到本区域把顺序改成不重复的数字。 + +## 2.4 配置参与主体与考核关系 + +**场景引入**:确定本期考核哪些部门与分公司、每个主体由谁分管、主体在公司整体里占多大权重。 + +**操作步骤** + +1. 打开方案详情页,点「相关」页签,找到「参与主体」区域(见图 18 标注 1)。 +2. 每一行是一个考核主体,要填:「考核主体」「主体类型」(总公司部门 / 分公司)、「考核部门(出指标方)」「主体权重(%)」「分管领导」。 +3. 也可以点左侧菜单「考核方案」→「参与主体」,在独立列表里维护。 + +![方案的参与主体](图片/02-12-canyu-zhuti.png) + +图 18 方案「相关」页签下的参与主体五行 + +4. 设置分管领导:在「参与主体」列表里双击该主体行的「分管领导」单元格(见图 19 标注 1),输入姓名中的一个字,在下拉出的候选人中点选目标人员(标注 2)。 + +![设置分管领导](图片/02-13-shezhi-fenguan-lingdao.png) + +图 19 双击「分管领导」单元格后按姓名筛选出的候选人 + +5. 选好之后单元格显示所选人员(见图 20 标注 1),点列表工具条上出现的「全部保存」按钮完成保存(标注 2)。 + +![保存分管领导](图片/02-14-baocun-fenguan-lingdao.png) + +图 20 选定分管领导后出现的「全部保存」按钮 + +**结果确认**:刷新列表后,该主体行的「分管领导」显示所选人员姓名。方案发布后,该分管领导就能在自己的队列里看到这个主体的填报单。 + +**常见问题** + +- 改完没保存就离开了页面:列表里的行内修改要点「全部保存」才写入,离开页面修改会丢失。 +- 候选人里找不到某人:该人员还没有在系统里建账号或还没有分配「分管领导」岗位,请联系管理员。 +- 「主体权重(%)」留空可以吗:可以。分管领导维度汇总时,权重全空按算术平均计算。 + +## 2.5 指标下达 + +**场景引入**:方案的核心一步 —— 给每个考核主体分配指标、权重与目标值。每个主体的权重合计必须等于 100%,否则方案发不出去。 + +**操作步骤(网格逐条录入)** + +1. 点左侧菜单「考核方案」→「指标下达」,打开指标下达列表。 +2. 列表默认处于行内编辑状态(见图 21 标注 1)。双击要改的单元格,例如「目标值」(标注 2),直接输入新值。 +3. 改完点工具条上的「全部保存」(标注 3)。 + +![指标下达的行内编辑](图片/02-15-xiada-hangnei-bianji.png) + +图 21 双击「目标值」单元格改为 380 后出现的「全部保存」按钮 + +**操作步骤(导出模板 → 填 → 批量导入)** + +4. 点列表工具条的「导出」,选「导出为 XLSX」(见图 22 标注 1),得到一份带现有数据的 Excel。 + +![导出指标下达](图片/02-16-daochu-excel.png) + +图 22 指标下达列表「导出」下拉中的「导出为 XLSX」 + +5. 在 Excel 中填好各主体的指标、权重与目标值后保存。 +6. 回到指标下达列表,点右上角「导入」,弹出「导入指标下达」窗口。第一次导入建议先点「下载模板」(见图 23 标注 1)取得带正确列名的空表。 +7. 点「选择文件」选中填好的文件(标注 2),或直接把文件拖到虚线框里,然后按窗口上方的「1. 上传 → 2. 字段映射 → 3. 预览」三步走完。 + +![导入指标下达](图片/02-17-daoru-duihuakuang.png) + +图 23 「导入指标下达」窗口的上传区、「下载模板」与三步指引 + +**结果确认**:列表中该主体的各行权重合计等于 100,目标值与 Excel 中一致。方案详情页的「下达指标数」随之变化。 + +**常见问题** + +- 权重合计不是 100%:发布时会被逐条拦下,回到本列表把该主体的各行权重调整到合计 100。 +- 目标值留空:除自定义公式类指标外,目标值不能为空,发布时会被拦下。 +- 方案已发布还能改吗:不能。已发布方案的配置已冻结,要改就复制出新版本。 + +## 2.6 到人分工与个人承接项 + +**场景引入**:部门得分要落到人头上时,给每位员工配置他承担的部门板块比例;员工个人直接承担的指标另外登记为个人承接项。 + +**操作步骤** + +1. 点左侧菜单「考核方案」→「到人分工」,点「新建」。 +2. 在窗口里选「所属方案」,选「员工」(见图 24 标注 1),选「部门板块」。 +3. 填「分工权重(%)」(标注 2)和「个人系数」(标注 3)。 + +![新建到人分工](图片/02-18-daoren-fengong-xinjian.png) + +图 24 新建到人分工窗口的「员工」「分工权重(%)」「个人系数」 + +4. 同一个窗口下方是「个人承接项」表格(见图 25 标注 1)。要登记该员工直接承担的指标,点「Add line」(新增行)加一行,选「承接的指标下达」,填「承接权重(%)」与「个人目标值」。 +5. 点「创建」(标注 2)。 + +![个人承接项](图片/02-19-geren-chengjie-xiang.png) + +图 25 新建到人分工窗口下部的「个人承接项」表格与「创建」按钮 + +**到人得分口径**:到人得分 = Σ(部门板块得分 × 分工权重 × 个人系数) + Σ(承接项得分率 × 承接权重)。 + +**结果确认**:到人分工列表出现新记录,名称形如「姓名 · 部门」。方案发布并审批通过后,「结果与归档」→「考核结果」的「到人」维度会出现该员工的得分。 + +**常见问题** + +- 员工选不到:该员工还没有在系统里建账号,请联系管理员。 +- 个人系数填多少:默认填 1.00;需要按岗位差异调节时再改。 + +## 2.7 处理指标争议 + +**场景引入**:方案还是草稿时,分公司对某项下达的目标值有异议,提出了争议。方案有未关闭的争议就发不出去,必须逐条处理完。 + +**操作步骤** + +1. 点左侧菜单「考核方案」→「指标争议」,点「待处理」页签(见图 26 标注 1),只看未关闭的争议。 +2. 看清「争议的指标下达」「提出单位」「提出人」与「争议理由」。 +3. 与业务部门核实后,点该行右侧的操作菜单(标注 2),在菜单中选「采纳」或「不采纳」。 + +![待处理的指标争议](图片/02-20-zhengyi-daichuli.png) + +图 26 指标争议「待处理」队列与行操作菜单入口 + +4. 在弹出的窗口里填「处理结论(必填)」(见图 27 标注 1),写清处理意见。 +5. 点「确认」(标注 2)。 + +![采纳指标争议](图片/02-21-caina-zhengyi.png) + +图 27 「采纳」窗口的「处理结论(必填)」与「确认」按钮 + +**结果确认**:该争议的状态变为已处理,对应指标下达的「争议状态」从「争议中」变成「已解决」,方案详情页的「未关闭争议数」减少。采纳的,还要按 2.5 节把目标值改过来。 + +**常见问题** + +- 处理结论没填就点确认:系统会提示处理结论不能为空,补填后再提交。 +- 已发布的方案还能提争议吗:不能。方案发布后指标下达已冻结,分公司如有异议,走填报阶段的核对与数据调整。 + +## 2.8 发布方案 + +**场景引入**:配置全部完成、争议全部关闭后,把方案发布出去,系统为每个参与主体生成一张填报单,填报工作正式开始。 + +**操作步骤** + +1. 打开方案详情页,点右上角「发布方案」。 +2. 在确认窗口中点「继续」(见图 28 标注 1)。 + +![发布确认](图片/02-22-fabu-queren.png) + +图 28 「发布方案」的确认窗口与「继续」按钮 + +3. 系统先做发布前完整性检查。**检查不通过时,方案保持草稿状态,并在右下角逐条列出问题**(见图 29 标注 1)。图中列出两条:市场部的权重合计为 90%,必须等于 100%;华北分公司的培训完成率未设置目标值。 + +![完整性检查未通过](图片/02-23-fabu-jiancha-butongguo.png) + +图 29 发布前完整性检查未通过时逐条列出的问题提示 + +**表 4 发布前完整性检查项与处理办法** + +| 检查项 | 提示内容 | 到哪里改 | +|---|---|---| +| 流程节点 | 节点配置不合法(顺序重复、缺必需节点等) | 2.3 节 流程节点 | +| 参与主体 | 至少需要一个考核主体 | 2.4 节 参与主体 | +| 指标下达 | 某主体没有下达任何指标 | 2.5 节 指标下达 | +| 指标下达 | 某主体的权重合计不等于 100% | 2.5 节 指标下达 | +| 指标下达 | 某条下达未设置目标值 | 2.5 节 指标下达 | +| 指标下达 | 存在下达给未参与主体的指标 | 2.4 节 / 2.5 节 | +| 指标争议 | 还有未关闭的指标争议 | 2.7 节 处理指标争议 | + +4. 按提示逐条改完后,重新点「发布方案」→「继续」。 + +**结果确认**:发布成功后右下角提示方案已发布、填报单已生成(见图 30 标注 1);方案详情页的状态条推进到「已发布」,并出现「发布时间」「发布人」;右上角按钮变成「关闭方案」。 + +![发布成功](图片/02-24-fabu-chenggong.png) + +图 30 发布成功后的状态条、发布信息与提示 + +**常见问题** + +- 发布后发现配错了:已发布方案的配置已冻结,先「关闭方案」,再用「复制自版本」建一个新版本改。 +- 提示该考核周期已有生效版本:同一周期只允许一个已发布版本,先关闭旧版本。 +- 发布后填报单在哪里:左侧菜单「填报与审核」→「填报单」,每个参与主体一张。 + +## 2.9 人力节点审核与驳回 + +**场景引入**:分公司核对全部确认后,填报单流转到人力审核环节,由本人逐张审核。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「填报单」,点「待人力审核」页签(见图 31 标注 1)。 +2. 点填报单名称打开详情;也可以直接用列表行右侧的操作菜单(标注 2)。 + +![待人力审核队列](图片/02-25-renli-shenhe-duilie.png) + +图 31 填报单的「待人力审核」队列与行操作菜单入口 + +3. 在填报单详情页核对指标得分合计、加减分合计与最终得分,必要时点「相关」页签查看每一行明细。 +4. 数据有问题点「驳回」,在窗口中填「驳回原因(必填)」(见图 32 标注 1),点「确认」(标注 2)。 + +![驳回](图片/02-26-bohui-duihuakuang.png) + +图 32 「驳回」窗口的「驳回原因(必填)」与「确认」按钮 + +5. 数据无误点「审核通过」,可在「审核意见(选填)」里写一句意见(见图 33 标注 1),点「确认」(标注 2)。 + +![审核通过](图片/02-27-shenhe-tongguo.png) + +图 33 「审核通过」窗口的「审核意见(选填)」与「确认」按钮 + +**结果确认**:审核通过后,填报单状态条推进到「领导审批中」;驳回后退回上一节点,填报单详情页的「最近驳回原因」显示刚才填的原因,同时在「审核记录」里留下一条驳回记录。 + +**常见问题** + +- 驳回原因没填:系统会提示驳回原因不能为空,补填后再驳回。 +- 驳回退到哪一步:退回本方案流程配置里的上一个节点。上一节点是「分公司核对」时,退回分公司核对;上一节点是「部门填报」时,退回填报中。 +- 看不到「审核通过」「驳回」按钮:确认填报单当前状态是「人力审核中」,且本人已分配「人力审核」岗位。 + +## 2.10 登记加减分 + +**场景引入**:本期有专项表彰或考核扣分事项,需要在部门得分之外单独加分或扣分。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「加减分」,点「新建」。 +2. 选「所属填报单」。 +3. 填「事项」(见图 34 标注 1),选「类型」(加分 / 扣分,标注 2),填「分值」(标注 3)。 +4. 在「依据」里写清依据的制度条款或文件。 +5. 点「创建」(标注 4)。 + +![登记加减分](图片/02-28-dengji-jiajianfen.png) + +图 34 新建加减分窗口的「事项」「类型」「分值」与「创建」按钮 + +**结果确认**:加减分列表出现新记录,状态为「待审批」,等人力负责人审批(见第 5 章)。审批通过后计入填报单的「加减分合计」与最终得分。 + +**常见问题** + +- 加减分有没有上限:不封顶也不保底,按登记的分值计入。 +- 已归档的填报单还能加减分吗:不能,归档后数据已锁定。 +- 记错了怎么办:待审批状态可以直接改;已批准的要先否决再重新登记。 + +## 2.11 审批数据调整 + +**场景引入**:填报单提交后数据已冻结,部门发现数据报错时会提交数据调整申请,由本人审批。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「数据调整」,点「待审批」页签(见图 35 标注 1)。 +2. 核对「调整类型」「调整前值」「调整后值」与「调整原因」。 +3. 点该行右侧的操作菜单(标注 2),选「批准并落地」或「否决」。 + +![待审批的数据调整](图片/02-29-shenpi-shuju-tiaozheng.png) + +图 35 数据调整「待审批」队列与行操作菜单入口 + +4. 在窗口中填「审批意见」(见图 36 标注 1),点「确认」(标注 2)。 + +![批准并落地](图片/02-30-pizhun-luodi.png) + +图 36 「批准并落地」窗口的审批意见与「确认」按钮 + +**两种调整类型的区别** + +- 源数据(实际值)调整:批准后直接更正该行的实际值并重新计分。 +- 计算结果(得分)调整:批准后只改该行得分,该行标记「已调整」,不直接改主体总分之外的其他数据。 + +**结果确认**:该申请状态变为「已批准」,出现「审批人」与落地时间;对应填报明细的数值随之更新,「审核记录」里增加一条数据调整留痕。 + +**常见问题** + +- 否决时提示审批意见不能为空:否决必须写原因,补填后再提交。 +- 批准后还能撤销吗:不能。已批准并落地的调整不可再改,如需再次更正,请部门重新提交一份调整申请。 + +## 2.12 归档 + +**场景引入**:本期考核全部审批通过、结果确认无误后,把填报单归档,形成不可更改的留存记录。 + +**操作步骤** + +1. 打开状态为「已通过」的填报单详情页(见图 37 标注 2)。 +2. 点右上角「归档」(标注 1),在确认窗口中点「继续」。 + +![归档](图片/02-31-guidang.png) + +图 37 已通过状态的填报单详情页与「归档」按钮 + +**结果确认**:填报单状态推进到「已归档」;在左侧菜单「结果与归档」→「归档快照」里出现一条快照记录,含方案、考核主体、最终得分、校验和与归档人(见图 38 标注 1)。 + +![归档快照](图片/02-32-guidang-kuaizhao.png) + +图 38 归档快照列表中的一条快照记录 + +**常见问题** + +- 归档后还能改吗:不能。归档后填报单、明细与加减分全部锁定。 +- 归档前还有加减分没批:先让人力负责人批完再归档。 +- 归档快照的校验和是做什么的:用于核验快照内容未被改动,查询时可与原记录比对。 + +## 2.13 审计查询 + +**场景引入**:上级要了解某张填报单从提交到归档经过了哪些人、哪些环节,或者要核对某次驳回的原因。 + +**操作步骤** + +1. 点左侧菜单「审计查询」→「审核记录」(见图 39 标注 1)。 +2. 列表按时间倒序列出每一次流程动作:记录编号、填报单、动作、节点、经办人、原因/意见与时间。 +3. 用工具条上的「筛选」(标注 2)按填报单、动作、经办人或时间范围过滤。 +4. 要把查询结果交出去,点「导出」(标注 3)。 +5. 上方还有两个页签:「驳回记录」只看驳回,「时间线」按时间轴展示。 + +![审计查询](图片/02-33-shenji-chaxun.png) + +图 39 审核记录列表与「筛选」「导出」 + +**结果确认**:能查到目标填报单从生成、提交、核对、审核、调整到归档的完整记录,每条都带经办人与时间。 + +**常见问题** + +- 审核记录能改吗:不能,只增不改。 +- 查不到某次操作:换用「筛选」放宽条件;加减分与数据调整的审批留痕也在本列表中,动作列显示为「数据调整」等。 + +--- + +# 3. 部门填报人员 + +本章是部门填报人员的全部日常操作:找到本部门的填报单、逐行填实际值、提交,以及被驳回或数据报错时怎么处理。 + +## 3.1 找到本部门填报单 + +**场景引入**:收到人力发布方案的通知后,进系统领本部门这一期的填报任务。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「填报单」(见图 40 标注 1)。 +2. 点「填报中」页签(标注 2),这里是还没提交的填报单。 +3. 点填报单名称打开(标注 3)。填报单名称形如「方案名称 · 本部门名称」。 + +![填报单列表](图片/03-01-tianbaodan-liebiao.png) + +图 40 部门填报人员看到的填报单列表与「填报中」队列 + +4. 填报单详情页上方是状态条,当前停在「填报中」(见图 41 标注 2);右上角是「提交填报」按钮(标注 1);左侧菜单的「填报明细」(标注 3)是逐行录入实际值的地方。 + +![填报单详情页](图片/03-02-tianbaodan-xiangqing.png) + +图 41 填报单详情页的状态条与「提交填报」按钮 + +**结果确认**:能看到本部门这一期的填报单,状态为「填报中」,「指标数」与「权重合计(%)」与人力下达的一致。 + +**常见问题** + +- 列表里一张单子都没有:先确认人力是否已发布本期方案;确认本人账号已加入本部门并分配「部门填报人员」岗位。 +- 看到了别的部门的单子吗:看不到。系统按本人所在部门放开可见范围。 + +## 3.2 逐行填实际值并看计算说明 + +**场景引入**:月末数据出来后,把每个指标的实际完成值填进系统,系统即时算分。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「填报明细」,列表列出本部门填报单的各行指标。 +2. 列表默认处于行内编辑状态(见图 42 标注 1)。双击某行的「Actual」(实际值)单元格,输入本期实际值(标注 2)。 +3. 逐行填完后,点工具条上的「全部保存」(标注 3)。 + +![录入实际值](图片/03-03-luru-shijizhi.png) + +图 42 双击「Actual」(实际值)单元格录入后出现的「全部保存」按钮 + +4. 保存后系统立刻算出「Completion (%)」(完成率)、得分率与得分。要看清算法,点该行的指标名称打开明细,在「计算说明」里能看到这一行的完整算式(见图 43 标注 1)。 + +![计算说明](图片/03-04-jisuan-shuoming.png) + +图 43 填报明细记录中的「计算说明」 + +**结果确认**:每一行都有实际值、完成率与得分;填报单详情页的「指标得分合计」等于各行得分之和。 + +**常见问题** + +- 填完没保存就离开:行内修改要点「全部保存」才写入。 +- 得分与自己算的对不上:点开该行看「计算说明」,里面写明了完成率、封顶保底与得分率的取值。 +- 「Actual」列在屏幕右侧看不见:列表可以左右滚动;也可以用工具条上的列设置按钮调整显示的列。 + +## 3.3 批量导入填报明细 + +**场景引入**:指标条数多、数据来自本部门台账时,用 Excel 一次导入比逐行敲快。 + +**操作步骤** + +1. 在「填报明细」列表点工具条上的「导出」→「导出为 XLSX」,得到一份带现有行的 Excel。 +2. 在 Excel 里逐行填好实际值并保存。 +3. 回到「填报明细」列表,点右上角「导入」。 +4. 第一次导入建议先点「下载模板」(见图 44 标注 1)取得带正确列名的空表。 +5. 点「选择文件」(标注 2)选中填好的文件,或把文件拖到虚线框里;再按窗口上方「1. 上传 → 2. 字段映射 → 3. 预览」三步完成导入。 + +![导入填报明细](图片/03-05-daoru-mingxi.png) + +图 44 「导入填报明细」窗口的上传区与「下载模板」 + +**结果确认**:导入完成后回到列表,各行「Actual」(实际值)与 Excel 中一致,得分同步算出。 + +**常见问题** + +- 导入报字段对不上:在「2. 字段映射」这一步把 Excel 的列名与系统字段一一对应。 +- 导入会不会新增出多余的行:导入用于更新已有行,不要在 Excel 里自行增行。 + +## 3.4 提交填报 + +**场景引入**:本部门数据全部填完、自查无误后提交,单据进入核对与审核流程。 + +**操作步骤** + +1. 打开填报单详情页,点右上角「提交填报」。 +2. 在确认窗口中点「继续」。 + +**有指标没填时会被拦下**:系统提示还有几个指标未填写实际值,填报单保持「填报中」(见图 45 标注 1)。回到「填报明细」用「未填实际值」页签找出未填的行补齐。 + +![提交被拦](图片/03-06-tijiao-beilan.png) + +图 45 有指标未填实际值时提交被拦下的提示 + +3. 补齐后重新点「提交填报」→「继续」。 + +**结果确认**:提交成功后右下角提示填报单已提交(见图 46 标注 1);状态条推进到「分公司核对中」(方案配了分公司核对节点时)或「人力审核中」;详情页出现「提交时间」与「提交人」。 + +![提交成功](图片/03-07-tijiao-chenggong.png) + +图 46 提交成功后的提示与状态推进 + +**常见问题** + +- 提交后还能改数吗:不能,提交后数据已冻结。要改走 3.6 节的数据调整申请。 +- 备注还能补吗:可以,备注不受冻结限制。 +- 提交后单子去哪了:在「分公司核对中」或「待人力审核」队列里,可以随时查看进度。 + +## 3.5 被驳回后怎么改 + +**场景引入**:人力审核或分管领导审批时发现问题,把单子驳回了,需要按驳回原因处理。 + +**操作步骤** + +1. 打开被驳回的填报单详情页,在「更多详情」区看「最近驳回原因」(见图 47 标注 1),照原因逐条核实。 +2. 看单据当前停在哪一步: + - 状态回到「填报中」的,直接按 3.2 节改实际值,改完按 3.4 节重新提交。 + - 状态回到「分公司核对中」的,填报数据仍处于冻结状态,数值更正要按 3.6 节提交数据调整申请;核对方确认后单据继续往下走。 +3. 处理经过与结论,建议在填报单的「讨论」区留言说明,便于审核人复核。 + +![最近驳回原因](图片/03-08-bohui-yuanyin.png) + +图 47 填报单详情页的「最近驳回原因」 + +**结果确认**:重新提交或调整落地后,填报单状态继续向后推进;「审核记录」里能查到本次驳回与后续处理的完整过程。 + +**常见问题** + +- 找不到驳回原因:它在填报单详情页的「更多详情」区,标题是「最近驳回原因」;历史每一次驳回都在「审核记录」的「驳回记录」页签里。 +- 不认可驳回意见:在填报单「讨论」区说明情况,或线下与审核人沟通后再处理。 + +## 3.6 发起数据调整申请 + +**场景引入**:填报单已提交、数据已冻结,但发现某个实际值报错了,需要走调整申请更正。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「数据调整」,点「新建」。 +2. 选「填报单」和「调整的指标明细」。 +3. 选「调整类型」(见图 48 标注 1):报错的是原始数据选「源数据(实际值)」,要更正的是得分选「计算结果(得分)」。 +4. 填「调整后值」(标注 2)。「调整前值」由系统自动带出,不用填。 +5. 在「调整原因」里写清依据。 +6. 点「创建」(标注 3)。 + +![发起数据调整申请](图片/03-09-faqi-shuju-tiaozheng.png) + +图 48 新建数据调整窗口的「调整类型」「调整后值」与「创建」按钮 + +7. 新建出来的申请是「草稿」。在数据调整列表点该行右侧的操作菜单,选「提交审批」(见图 49 标注 1)。 + +![提交审批](图片/03-10-tijiao-shenpi.png) + +图 49 数据调整行操作菜单中的「提交审批」 + +**结果确认**:该申请状态从「草稿」变为「待审批」,等人力审核或人力负责人处理。批准落地后,填报明细的数值与得分同步更新。 + +**常见问题** + +- 提交后想撤回:请联系人力审核,由其否决该申请,再重新提交一份。 +- 填报单已归档还能调整吗:不能,归档后数据已锁定。 +- 一次要改好几行:一行一条申请,逐条提交。 + +--- + +# 4. 分公司核对人员 + +本章是分公司核对人员的全部操作。核对人只对数据表态,不能修改数值 —— 有异议提出争议,由填报部门更正。 + +## 4.1 找到待我核对的任务 + +**场景引入**:部门提交填报单后,与本分公司相关的数据会生成一条核对任务,等本人确认。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「分公司核对」(见图 50 标注 1)。 +2. 点「待我核对」页签(标注 2),这里是还没表态的任务。 +3. 每行显示任务名称、对应填报单、核对分公司与核对状态;行右侧是操作菜单(标注 3)。 + +![待我核对](图片/04-01-daiwo-hedui.png) + +图 50 分公司核对人员的「待我核对」队列 + +**结果确认**:能看到与本分公司相关的核对任务,状态为「待核对」。 + +**常见问题** + +- 队列是空的:说明相关部门还没有提交填报单,或者本期方案里本分公司不参与核对。 +- 看得到别的分公司的任务吗:看不到,系统按本人所在分公司放开可见范围。 + +## 4.2 核对填报数据 + +**场景引入**:表态之前,先把填报数据与本分公司台账逐项对一遍。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「填报明细」(见图 51 标注 1),查看待核对填报单的每一行指标、目标值、实际值与得分。 +2. 与本分公司台账逐项比对,记下有出入的项与差异金额。 + +![查看填报明细](图片/04-02-chakan-tianbao-mingxi.png) + +图 51 分公司核对人员查看的填报明细 + +**结果确认**:每一项都比对完毕,能明确回答「有没有出入、出入在哪一项」。 + +**常见问题** + +- 能不能直接改数:不能。核对人只能确认或提出争议,数值由填报部门更正。 +- 明细太宽看不全:列表可以左右滚动,也可以导出成 Excel 再比对。 + +## 4.3 提出争议 + +**场景引入**:核对中发现数据与本分公司台账对不上,需要退回给填报部门核实。 + +**操作步骤** + +1. 在「待我核对」队列点该行的操作菜单,选「提出争议」。 +2. 在窗口的「争议内容(必填)」里写清哪一项、差多少、依据是什么(见图 52 标注 1)。 +3. 点「确认」(标注 2)。 + +![提出争议](图片/04-03-tichu-zhengyi.png) + +图 52 「提出争议」窗口的「争议内容(必填)」与「确认」按钮 + +**结果确认**:该核对任务状态变为「有争议」,核对意见显示所填内容;在争议解决前,填报单不会继续往下推进。 + +**常见问题** + +- 争议内容没填:系统会提示核对意见不能为空,补填后再提交。 +- 提了争议之后呢:与填报部门核实。对方更正后,回到本队列点「确认无误」,流程继续。 + +## 4.4 确认无误 + +**场景引入**:数据核对一致(或争议已协商解决),给出确认,让单据继续往下走。 + +**操作步骤** + +1. 在核对任务列表点该行的操作菜单,选「确认无误」。 +2. 在「核对意见(选填)」里写一句核对结论(见图 53 标注 1)。 +3. 点「确认」(标注 2)。 + +![确认无误](图片/04-04-queren-wuwu.png) + +图 53 「确认无误」窗口的「核对意见(选填)」与「确认」按钮 + +**结果确认**:该任务状态变为「已确认」。本方案涉及的全部分公司都确认后,填报单自动推进到人力审核环节。 + +**常见问题** + +- 确认后能反悔吗:不能。确认前请核对清楚。 +- 我确认了单子还没往下走:要等本方案涉及的全部分公司都确认;有一家还是「待核对」或「有争议」,单据就停在核对环节。 + +--- + +# 5. 人力负责人 + +本章是人力负责人的两项审批工作。 + +## 5.1 审批加减分 + +**场景引入**:人力审核登记了本期的加分或扣分事项,等本人审批后才计入最终得分。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「加减分」(见图 54 标注 1),点「待审批」页签(标注 2)。 +2. 核对「事项」「类型」「分值」与「依据」。 +3. 点该行右侧的操作菜单(标注 3)。 + +![加减分待审批](图片/05-01-jiajianfen-daishenpi.png) + +图 54 加减分的「待审批」队列与行操作菜单入口 + +4. 在菜单中选「批准」(见图 55 标注 1)或「否决」。 + +![批准加减分](图片/05-02-pizhun-jiajianfen.png) + +图 55 加减分行操作菜单中的「批准」与「否决」 + +**结果确认**:该记录状态变为「已批准」,出现审批人与审批时间;对应填报单的「加减分合计」与最终得分随之更新。 + +**常见问题** + +- 批准后发现批错了:已批准的加减分不能再改,先「否决」再由人力审核重新登记。 +- 加减分有没有封顶:不封顶也不保底,按登记分值计入。 + +## 5.2 审批数据调整 + +**场景引入**:部门提交了数据调整申请,等本人或人力审核批准后才能落地。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「数据调整」(见图 56 标注 1),点「待审批」页签。 +2. 核对「调整类型」「调整前值」「调整后值」与「调整原因」。 +3. 点该行右侧的操作菜单(标注 2),选「批准并落地」或「否决」。 + +![数据调整待审批](图片/05-03-shuju-tiaozheng-daishenpi.png) + +图 56 数据调整的「待审批」队列与行操作菜单入口 + +4. 在窗口的「审批意见」中写明审批结论(见图 57 标注 1),点「确认」(标注 2)。 + +![批准数据调整](图片/05-04-pizhun-jieguo-tiaozheng.png) + +图 57 「批准并落地」窗口的审批意见与「确认」按钮 + +**结果确认**:该申请状态变为「已批准」,出现审批人与落地时间;对应填报明细的数值与得分同步更新,并在「审核记录」里留痕。 + +**常见问题** + +- 否决时提示审批意见不能为空:否决必须写原因。 +- 批准后能撤销吗:不能。已批准并落地的调整不可再改,如需再次更正,请部门重新提交申请。 + +--- + +# 6. 分管领导 + +本章是分管领导的两件事:对分管主体的填报单做最终审批,以及查看分管范围的考核结果。 + +## 6.1 找到待我审批的填报单 + +**场景引入**:人力审核通过后,分管主体的填报单流转到本人这里做最终审批。 + +**操作步骤** + +1. 点左侧菜单「填报与审核」→「填报单」(见图 58 标注 1)。 +2. 队列页签放不下时,点右侧的「还有 N 个」(标注 2),在其中点「待领导审批」。 + +![填报单队列入口](图片/06-01-lingdao-duilie-rukou.png) + +图 58 填报单列表与队列页签的「还有 4 个」入口 + +3. 「待领导审批」队列里列出等本人审批的填报单,状态显示为「领导审批中」(见图 59 标注 1);行右侧是操作菜单(标注 2)。 + +![待领导审批队列](图片/06-02-lingdao-shenpi-duilie.png) + +图 59 「待领导审批」队列中的填报单 + +**结果确认**:队列里只出现本人分管主体的填报单。 + +**常见问题** + +- 队列是空的:说明分管主体的填报单还没有走到领导审批环节。 +- 看得到别人分管的主体吗:看不到。可见范围按方案里配置的分管关系确定。 + +## 6.2 审批通过或驳回 + +**场景引入**:对分管主体本期的考核结果做最终把关。 + +**操作步骤** + +1. 点填报单名称打开详情,核对指标得分合计、加减分合计与最终得分。 +2. 同意的点「审核通过」,在「审核意见(选填)」中写一句意见(见图 60 标注 1),点「确认」(标注 2)。 +3. 有问题的点「驳回」,在「驳回原因(必填)」中写明原因后点「确认」。 + +![领导审批通过](图片/06-03-lingdao-shenpi-tongguo.png) + +图 60 领导审批的「审核通过」窗口 + +**结果确认**:通过后填报单状态推进到「已通过」,详情页出现「审批通过时间」与「最终审批人」;系统同时生成部门、分公司、到人、分管领导四个维度的考核结果。驳回则退回上一节点,并在「审核记录」中留痕。 + +**常见问题** + +- 驳回原因不填能提交吗:不能,驳回必须填原因。 +- 通过之后还能改吗:不能。通过后填报数据只读,如需更正走数据调整申请。 + +## 6.3 查看分管主体结果与看板 + +**场景引入**:审批完成后,了解分管范围本期的整体得分与排名。 + +**操作步骤** + +1. 点左侧菜单「结果与归档」→「考核结果」(见图 61 标注 1)。列表按维度列出结果,「分管领导」维度是本人分管范围的加权结果(标注 2);上方还有「部门」「分公司」「到人」「分管领导」四个页签。 + +![分管主体结果](图片/06-04-fenguan-zhuti-jieguo.png) + +图 61 考核结果列表中的「部门」与「分管领导」两条结果 + +2. 点左侧菜单「结果与归档」→「结果看板」(见图 62 标注 1),看结果条数、平均得分、最高得分、最低得分与各组织单元平均得分。 +3. 用页面上方的「汇总维度」下拉(标注 2)切换只看某一个维度。 + +![结果看板](图片/06-05-jieguo-kanban.png) + +图 62 考核结果看板的统计卡片与各组织单元平均得分 + +**汇总口径** + +- 部门 / 分公司:填报单最终得分,组内排名。 +- 到人:Σ(部门板块得分 × 分工权重 × 个人系数) + Σ(承接项得分率 × 承接权重)。 +- 分管领导:分管主体得分按主体权重加权平均;主体权重全空时按算术平均。 + +**结果确认**:能看到本期分管范围的得分与排名,且与各主体填报单的最终得分对得上。 + +**常见问题** + +- 看板上没有数:本期还没有填报单审批通过;审批通过后结果自动生成。 +- 结果数字与填报单对不上:加减分与数据调整落地后会重算,请刷新页面。 +- 想看某个部门的明细:在考核结果列表点该行,可以钻取到对应的填报单与指标明细。 + +--- + +# 7. 常见问题总表 + +**表 5 按角色汇总的常见问题与处理办法** + +| 角色 | 现象 | 先自己做什么 | 还不行找谁 | +|---|---|---|---| +| 全部 | 登录不上 | 核对邮箱有无空格,确认密码 | 管理员重置密码 | +| 全部 | 登录后看不到考核菜单 | 确认用的是本人账号 | 管理员分配岗位 | +| 全部 | 列表里一条数据都没有 | 换一个队列页签,清掉筛选条件 | 本环节的上游经办人 | +| 全部 | 行内改完数据没保存住 | 点工具条上的「全部保存」 | — | +| 人力审核 | 方案发布被拦下 | 按提示逐条改:权重合计 100%、目标值齐全、争议关闭、节点合法 | 提出争议的分公司 | +| 人力审核 | 发布后要改配置 | 关闭方案,用「复制自版本」建新版本 | 业务顾问确认口径 | +| 人力审核 | 看不到「审核通过」「驳回」 | 确认填报单当前状态是「人力审核中」 | 管理员核对岗位 | +| 部门填报人员 | 找不到本部门填报单 | 确认人力已发布本期方案 | 人力审核 | +| 部门填报人员 | 提交被拦 | 用「未填实际值」页签找出未填行补齐 | — | +| 部门填报人员 | 提交后要改数 | 提交数据调整申请 | 人力审核审批 | +| 部门填报人员 | 单子被驳回 | 看「最近驳回原因」,按原因处理 | 驳回人 | +| 分公司核对人员 | 数据对不上 | 点「提出争议」写清差异 | 填报部门 | +| 分公司核对人员 | 确认了单子仍不推进 | 查看是否还有其他分公司未确认 | 未确认的分公司 | +| 人力负责人 | 加减分批错了 | 先「否决」,由人力审核重新登记 | 人力审核 | +| 人力负责人 | 调整批准后要撤销 | 不能撤销,让部门重新提交一份 | 部门填报人员 | +| 分管领导 | 待审批队列是空的 | 确认单据已过人力审核 | 人力审核 | +| 分管领导 | 看不到某个主体 | 确认本人是该主体在本期方案里的分管领导 | 人力审核 | + +--- + +# 附录 A 手册章节与界面对照索引 + +界面改版时按本表定位受影响的章节,逐节复核并更新截图。 + +**表 6 手册章节与界面对照索引** + +| 章节 | 界面 / 按钮 | 截图文件名 | +|---|---|---| +| 1.1 | 登录页 —— 邮箱 / 密码 / 登录 | 01-01-denglu.png | +| 1.2 | 工作台 —— 左侧菜单分组 / 个人菜单 | 01-02-gongzuotai.png | +| 1.3 | 顶部应用名 —— 切换应用 | 01-03-qiehuan-yingyong.png | +| 1.4 | 填报单列表 —— 队列页签 / 还有 N 个 | 01-04-daiban-duilie.png | +| 1.5 | 个人资料 —— 修改密码 | 01-05-xiugai-mima.png | +| 1.6 | 列表工具条 —— 导出 | 01-06-daochu-excel.png | +| 2.1 | 指标库列表 —— 新建 / 导入 / 导出 | 02-01-zhibiaoku-liebiao.png | +| 2.1 | 新建指标 —— 基本信息 / 计分规则 | 02-02-xinjian-zhibiao-shangban.png | +| 2.1 | 新建指标 —— 阶梯区间 / 创建 | 02-03-xinjian-zhibiao-jieti.png | +| 2.1 | 指标详情 —— 计分规则字段 / 相关 | 02-04-zhibiao-xiangqing.png | +| 2.1 | 指标相关 —— 阶梯区间 | 02-05-jieti-qujian.png | +| 2.2 | 方案版本列表 —— 新建 / 草稿页签 | 02-06-fangan-liebiao.png | +| 2.2 | 新建方案 —— 方案信息 / 复制自版本 | 02-07-xinjian-fangan.png | +| 2.2 | 新建方案 —— 指标下达 / 审核流程节点 | 02-08-xiada-yu-jiedian-wangge.png | +| 2.2 | 新建方案 —— 参与主体 / 到人分工 / 创建 | 02-09-zhuti-yu-fengong-wangge.png | +| 2.2 | 方案详情 —— 状态条 / 发布方案 / 相关 | 02-10-fangan-xiangqing.png | +| 2.3 | 方案相关 —— 流程节点 | 02-11-liucheng-jiedian.png | +| 2.4 | 方案相关 —— 参与主体 | 02-12-canyu-zhuti.png | +| 2.4 | 参与主体列表 —— 分管领导行内编辑 | 02-13-shezhi-fenguan-lingdao.png | +| 2.4 | 参与主体列表 —— 全部保存 | 02-14-baocun-fenguan-lingdao.png | +| 2.5 | 指标下达列表 —— 行内编辑 / 全部保存 | 02-15-xiada-hangnei-bianji.png | +| 2.5 | 指标下达列表 —— 导出 | 02-16-daochu-excel.png | +| 2.5 | 导入指标下达 —— 下载模板 / 选择文件 | 02-17-daoru-duihuakuang.png | +| 2.6 | 新建到人分工 —— 员工 / 分工权重 / 个人系数 | 02-18-daoren-fengong-xinjian.png | +| 2.6 | 新建到人分工 —— 个人承接项 / 创建 | 02-19-geren-chengjie-xiang.png | +| 2.7 | 指标争议 —— 待处理队列 / 行操作菜单 | 02-20-zhengyi-daichuli.png | +| 2.7 | 采纳窗口 —— 处理结论 / 确认 | 02-21-caina-zhengyi.png | +| 2.8 | 发布方案 —— 确认窗口 / 继续 | 02-22-fabu-queren.png | +| 2.8 | 发布方案 —— 完整性检查未通过提示 | 02-23-fabu-jiancha-butongguo.png | +| 2.8 | 方案详情 —— 已发布状态与发布信息 | 02-24-fabu-chenggong.png | +| 2.9 | 填报单 —— 待人力审核队列 | 02-25-renli-shenhe-duilie.png | +| 2.9 | 驳回窗口 —— 驳回原因 / 确认 | 02-26-bohui-duihuakuang.png | +| 2.9 | 审核通过窗口 —— 审核意见 / 确认 | 02-27-shenhe-tongguo.png | +| 2.10 | 新建加减分 —— 事项 / 类型 / 分值 / 创建 | 02-28-dengji-jiajianfen.png | +| 2.11 | 数据调整 —— 待审批队列 / 行操作菜单 | 02-29-shenpi-shuju-tiaozheng.png | +| 2.11 | 批准并落地窗口 —— 审批意见 / 确认 | 02-30-pizhun-luodi.png | +| 2.12 | 填报单详情 —— 归档按钮 | 02-31-guidang.png | +| 2.12 | 归档快照列表 | 02-32-guidang-kuaizhao.png | +| 2.13 | 审核记录 —— 筛选 / 导出 / 页签 | 02-33-shenji-chaxun.png | +| 3.1 | 填报单列表 —— 填报中队列 | 03-01-tianbaodan-liebiao.png | +| 3.1 | 填报单详情 —— 状态条 / 提交填报 | 03-02-tianbaodan-xiangqing.png | +| 3.2 | 填报明细 —— 实际值行内编辑 / 全部保存 | 03-03-luru-shijizhi.png | +| 3.2 | 填报明细记录 —— 计算说明 | 03-04-jisuan-shuoming.png | +| 3.3 | 导入填报明细 —— 下载模板 / 选择文件 | 03-05-daoru-mingxi.png | +| 3.4 | 提交填报 —— 未填全被拦提示 | 03-06-tijiao-beilan.png | +| 3.4 | 提交填报 —— 成功提示与状态推进 | 03-07-tijiao-chenggong.png | +| 3.5 | 填报单详情 —— 最近驳回原因 | 03-08-bohui-yuanyin.png | +| 3.6 | 新建数据调整 —— 调整类型 / 调整后值 / 创建 | 03-09-faqi-shuju-tiaozheng.png | +| 3.6 | 数据调整 —— 提交审批 | 03-10-tijiao-shenpi.png | +| 4.1 | 分公司核对 —— 待我核对队列 | 04-01-daiwo-hedui.png | +| 4.2 | 填报明细 —— 核对依据 | 04-02-chakan-tianbao-mingxi.png | +| 4.3 | 提出争议窗口 —— 争议内容 / 确认 | 04-03-tichu-zhengyi.png | +| 4.4 | 确认无误窗口 —— 核对意见 / 确认 | 04-04-queren-wuwu.png | +| 5.1 | 加减分 —— 待审批队列 | 05-01-jiajianfen-daishenpi.png | +| 5.1 | 加减分行操作菜单 —— 批准 / 否决 | 05-02-pizhun-jiajianfen.png | +| 5.2 | 数据调整 —— 待审批队列 | 05-03-shuju-tiaozheng-daishenpi.png | +| 5.2 | 批准并落地窗口 | 05-04-pizhun-jieguo-tiaozheng.png | +| 6.1 | 填报单列表 —— 队列页签溢出入口 | 06-01-lingdao-duilie-rukou.png | +| 6.1 | 待领导审批队列 | 06-02-lingdao-shenpi-duilie.png | +| 6.2 | 领导审批 —— 审核通过窗口 | 06-03-lingdao-shenpi-tongguo.png | +| 6.3 | 考核结果列表 —— 分管领导维度 | 06-04-fenguan-zhuti-jieguo.png | +| 6.3 | 考核结果看板 —— 统计卡片 / 汇总维度 | 06-05-jieguo-kanban.png | + +--- + +# 附录 B 各角色练习任务清单 + +培训现场布置,限期完成。每项的完成标准都是系统里查得到的结果,由核验人登录系统查记录认定。练习在培训环境完成,不在正式环境操作。 + +**表 7 人力审核练习任务** + +| 序号 | 练习任务 | 完成标准(系统里查得到) | +|---|---|---| +| 2-1 | 新建一条阶梯计分的指标,含四段阶梯区间 | 指标库中存在该指标,状态为「启用」,其「相关」页签下有 4 条阶梯区间 | +| 2-2 | 用「复制自版本」新建下一期方案版本 | 方案列表中存在新版本,状态为「草稿」,其流程节点、参与主体、指标下达条数与被复制版本一致 | +| 2-3 | 给一个考核主体配置分管领导,并把该主体的权重合计调整到 100% | 参与主体列表中该主体的「分管领导」显示指定人员;指标下达中该主体各行权重合计为 100 | +| 2-4 | 制造一次发布失败并改到发布成功 | 首次发布出现完整性检查未通过提示;改正后方案状态为「已发布」,且生成的填报单数量等于参与主体数 | +| 2-5 | 对一张已提交的填报单先驳回再审核通过 | 审核记录中存在该填报单的一条「驳回」与一条「审核通过」记录,驳回记录带原因 | + +**表 8 部门填报人员练习任务** + +| 序号 | 练习任务 | 完成标准(系统里查得到) | +|---|---|---| +| 3-1 | 在本部门填报单里逐行录入实际值 | 填报明细各行「Actual」(实际值)非空,且完成率与得分已算出 | +| 3-2 | 故意漏填一行后提交,再补齐提交 | 首次提交出现未填实际值的提示;补齐后填报单状态推进到下一节点,且有「提交时间」「提交人」 | +| 3-3 | 查看一条明细的计算说明并复述算式 | 能指出该行「计算说明」中的完成率、得分率与得分三个数,且与列表数值一致 | +| 3-4 | 对已提交的一行提交数据调整申请 | 数据调整列表中存在该申请,状态为「待审批」,调整前值由系统带出 | + +**表 9 分公司核对人员练习任务** + +| 序号 | 练习任务 | 完成标准(系统里查得到) | +|---|---|---| +| 4-1 | 在「待我核对」里找到本分公司的核对任务 | 能说出任务名称与对应填报单名称 | +| 4-2 | 对一条任务提出争议 | 该任务状态为「有争议」,核对意见为所填内容 | +| 4-3 | 协商后把该任务改为确认无误 | 该任务状态为「已确认」 | + +**表 10 人力负责人练习任务** + +| 序号 | 练习任务 | 完成标准(系统里查得到) | +|---|---|---| +| 5-1 | 审批一条加减分 | 该加减分状态为「已批准」,填报单「加减分合计」随之变化 | +| 5-2 | 否决一条数据调整申请 | 该申请状态为「已否决」,且带审批意见 | +| 5-3 | 批准一条数据调整申请 | 该申请状态为「已批准」并有落地时间,对应填报明细数值已更新 | + +**表 11 分管领导练习任务** + +| 序号 | 练习任务 | 完成标准(系统里查得到) | +|---|---|---| +| 6-1 | 在「待领导审批」里找到分管主体的填报单 | 能说出填报单名称与最终得分 | +| 6-2 | 审批通过一张填报单 | 该填报单状态为「已通过」,有「审批通过时间」与「最终审批人」 | +| 6-3 | 在考核结果里找到本人的分管领导维度得分 | 考核结果列表中存在「分管领导」维度的一行,得分与分管主体加权结果一致 | diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-01-denglu.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-01-denglu.png" new file mode 100644 index 0000000..edfef1a Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-01-denglu.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-02-gongzuotai.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-02-gongzuotai.png" new file mode 100644 index 0000000..9e0a562 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-02-gongzuotai.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-03-qiehuan-yingyong.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-03-qiehuan-yingyong.png" new file mode 100644 index 0000000..326b804 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-03-qiehuan-yingyong.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-04-daiban-duilie.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-04-daiban-duilie.png" new file mode 100644 index 0000000..5c3d3a2 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-04-daiban-duilie.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-05-xiugai-mima.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-05-xiugai-mima.png" new file mode 100644 index 0000000..6012d46 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-05-xiugai-mima.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-06-daochu-excel.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-06-daochu-excel.png" new file mode 100644 index 0000000..6627f22 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/01-06-daochu-excel.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-01-zhibiaoku-liebiao.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-01-zhibiaoku-liebiao.png" new file mode 100644 index 0000000..0351aef Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-01-zhibiaoku-liebiao.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-02-xinjian-zhibiao-shangban.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-02-xinjian-zhibiao-shangban.png" new file mode 100644 index 0000000..bcd9916 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-02-xinjian-zhibiao-shangban.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-03-xinjian-zhibiao-jieti.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-03-xinjian-zhibiao-jieti.png" new file mode 100644 index 0000000..49b37b6 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-03-xinjian-zhibiao-jieti.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-04-zhibiao-xiangqing.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-04-zhibiao-xiangqing.png" new file mode 100644 index 0000000..cb32c1d Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-04-zhibiao-xiangqing.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-05-jieti-qujian.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-05-jieti-qujian.png" new file mode 100644 index 0000000..fe9add9 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-05-jieti-qujian.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-06-fangan-liebiao.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-06-fangan-liebiao.png" new file mode 100644 index 0000000..3fe29e0 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-06-fangan-liebiao.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-07-xinjian-fangan.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-07-xinjian-fangan.png" new file mode 100644 index 0000000..1fbbb74 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-07-xinjian-fangan.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-08-xiada-yu-jiedian-wangge.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-08-xiada-yu-jiedian-wangge.png" new file mode 100644 index 0000000..7e53561 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-08-xiada-yu-jiedian-wangge.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-09-zhuti-yu-fengong-wangge.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-09-zhuti-yu-fengong-wangge.png" new file mode 100644 index 0000000..ad42137 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-09-zhuti-yu-fengong-wangge.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-10-fangan-xiangqing.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-10-fangan-xiangqing.png" new file mode 100644 index 0000000..687298f Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-10-fangan-xiangqing.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-11-liucheng-jiedian.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-11-liucheng-jiedian.png" new file mode 100644 index 0000000..e50559b Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-11-liucheng-jiedian.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-12-canyu-zhuti.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-12-canyu-zhuti.png" new file mode 100644 index 0000000..560ee21 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-12-canyu-zhuti.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-13-shezhi-fenguan-lingdao.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-13-shezhi-fenguan-lingdao.png" new file mode 100644 index 0000000..ce76ecb Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-13-shezhi-fenguan-lingdao.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-14-baocun-fenguan-lingdao.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-14-baocun-fenguan-lingdao.png" new file mode 100644 index 0000000..ea2b8a4 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-14-baocun-fenguan-lingdao.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-15-xiada-hangnei-bianji.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-15-xiada-hangnei-bianji.png" new file mode 100644 index 0000000..1bd4d63 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-15-xiada-hangnei-bianji.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-16-daochu-excel.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-16-daochu-excel.png" new file mode 100644 index 0000000..db87058 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-16-daochu-excel.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-17-daoru-duihuakuang.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-17-daoru-duihuakuang.png" new file mode 100644 index 0000000..8564648 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-17-daoru-duihuakuang.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-18-daoren-fengong-xinjian.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-18-daoren-fengong-xinjian.png" new file mode 100644 index 0000000..d0f8d65 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-18-daoren-fengong-xinjian.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-19-geren-chengjie-xiang.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-19-geren-chengjie-xiang.png" new file mode 100644 index 0000000..20b5e48 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-19-geren-chengjie-xiang.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-20-zhengyi-daichuli.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-20-zhengyi-daichuli.png" new file mode 100644 index 0000000..2f343c0 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-20-zhengyi-daichuli.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-21-caina-zhengyi.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-21-caina-zhengyi.png" new file mode 100644 index 0000000..880782b Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-21-caina-zhengyi.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-22-fabu-queren.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-22-fabu-queren.png" new file mode 100644 index 0000000..fc7d663 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-22-fabu-queren.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-23-fabu-jiancha-butongguo.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-23-fabu-jiancha-butongguo.png" new file mode 100644 index 0000000..a7eab77 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-23-fabu-jiancha-butongguo.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-24-fabu-chenggong.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-24-fabu-chenggong.png" new file mode 100644 index 0000000..9e25097 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-24-fabu-chenggong.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-25-renli-shenhe-duilie.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-25-renli-shenhe-duilie.png" new file mode 100644 index 0000000..5af2939 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-25-renli-shenhe-duilie.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-26-bohui-duihuakuang.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-26-bohui-duihuakuang.png" new file mode 100644 index 0000000..3d8466c Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-26-bohui-duihuakuang.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-27-shenhe-tongguo.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-27-shenhe-tongguo.png" new file mode 100644 index 0000000..be74cdb Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-27-shenhe-tongguo.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-28-dengji-jiajianfen.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-28-dengji-jiajianfen.png" new file mode 100644 index 0000000..160bc98 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-28-dengji-jiajianfen.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-29-shenpi-shuju-tiaozheng.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-29-shenpi-shuju-tiaozheng.png" new file mode 100644 index 0000000..03ba00a Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-29-shenpi-shuju-tiaozheng.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-30-pizhun-luodi.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-30-pizhun-luodi.png" new file mode 100644 index 0000000..37e6899 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-30-pizhun-luodi.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-31-guidang.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-31-guidang.png" new file mode 100644 index 0000000..42e6ad5 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-31-guidang.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-32-guidang-kuaizhao.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-32-guidang-kuaizhao.png" new file mode 100644 index 0000000..9d0d95f Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-32-guidang-kuaizhao.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-33-shenji-chaxun.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-33-shenji-chaxun.png" new file mode 100644 index 0000000..b18b977 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/02-33-shenji-chaxun.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-01-tianbaodan-liebiao.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-01-tianbaodan-liebiao.png" new file mode 100644 index 0000000..1d205fe Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-01-tianbaodan-liebiao.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-02-tianbaodan-xiangqing.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-02-tianbaodan-xiangqing.png" new file mode 100644 index 0000000..7eca509 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-02-tianbaodan-xiangqing.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-03-luru-shijizhi.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-03-luru-shijizhi.png" new file mode 100644 index 0000000..3bb9f12 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-03-luru-shijizhi.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-04-jisuan-shuoming.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-04-jisuan-shuoming.png" new file mode 100644 index 0000000..a45b915 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-04-jisuan-shuoming.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-05-daoru-mingxi.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-05-daoru-mingxi.png" new file mode 100644 index 0000000..74a039b Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-05-daoru-mingxi.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-06-tijiao-beilan.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-06-tijiao-beilan.png" new file mode 100644 index 0000000..84a7e46 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-06-tijiao-beilan.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-07-tijiao-chenggong.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-07-tijiao-chenggong.png" new file mode 100644 index 0000000..8ca6ad4 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-07-tijiao-chenggong.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-08-bohui-yuanyin.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-08-bohui-yuanyin.png" new file mode 100644 index 0000000..6bce4ab Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-08-bohui-yuanyin.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-09-faqi-shuju-tiaozheng.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-09-faqi-shuju-tiaozheng.png" new file mode 100644 index 0000000..c0addf5 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-09-faqi-shuju-tiaozheng.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-10-tijiao-shenpi.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-10-tijiao-shenpi.png" new file mode 100644 index 0000000..ec29665 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/03-10-tijiao-shenpi.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-01-daiwo-hedui.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-01-daiwo-hedui.png" new file mode 100644 index 0000000..2bb5672 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-01-daiwo-hedui.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-02-chakan-tianbao-mingxi.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-02-chakan-tianbao-mingxi.png" new file mode 100644 index 0000000..bdbc0c7 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-02-chakan-tianbao-mingxi.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-03-tichu-zhengyi.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-03-tichu-zhengyi.png" new file mode 100644 index 0000000..1a8828c Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-03-tichu-zhengyi.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-04-queren-wuwu.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-04-queren-wuwu.png" new file mode 100644 index 0000000..4a73282 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/04-04-queren-wuwu.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-01-jiajianfen-daishenpi.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-01-jiajianfen-daishenpi.png" new file mode 100644 index 0000000..7596790 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-01-jiajianfen-daishenpi.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-02-pizhun-jiajianfen.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-02-pizhun-jiajianfen.png" new file mode 100644 index 0000000..f7fe659 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-02-pizhun-jiajianfen.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-03-shuju-tiaozheng-daishenpi.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-03-shuju-tiaozheng-daishenpi.png" new file mode 100644 index 0000000..e20675e Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-03-shuju-tiaozheng-daishenpi.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-04-pizhun-jieguo-tiaozheng.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-04-pizhun-jieguo-tiaozheng.png" new file mode 100644 index 0000000..47f8420 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/05-04-pizhun-jieguo-tiaozheng.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-01-lingdao-duilie-rukou.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-01-lingdao-duilie-rukou.png" new file mode 100644 index 0000000..f53ea23 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-01-lingdao-duilie-rukou.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-02-lingdao-shenpi-duilie.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-02-lingdao-shenpi-duilie.png" new file mode 100644 index 0000000..dd0e692 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-02-lingdao-shenpi-duilie.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-03-lingdao-shenpi-tongguo.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-03-lingdao-shenpi-tongguo.png" new file mode 100644 index 0000000..9de7909 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-03-lingdao-shenpi-tongguo.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-04-fenguan-zhuti-jieguo.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-04-fenguan-zhuti-jieguo.png" new file mode 100644 index 0000000..922c54c Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-04-fenguan-zhuti-jieguo.png" differ diff --git "a/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-05-jieguo-kanban.png" "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-05-jieguo-kanban.png" new file mode 100644 index 0000000..0a9ee66 Binary files /dev/null and "b/docs/\346\211\213\345\206\214/\345\233\276\347\211\207/06-05-jieguo-kanban.png" differ diff --git a/package.json b/package.json index e3d5411..202f7ab 100644 --- a/package.json +++ b/package.json @@ -20,7 +20,8 @@ "test": "vitest run", "verify": "pnpm validate && pnpm typecheck && pnpm test", "e2e": "node scripts/e2e-flow.mjs", - "docs:docx": "node scripts/md2docx.cjs docs/00-设计方案.md docs/交付/KPI考核管理系统-设计方案-V1.0.docx" + "docs:docx": "node scripts/md2docx.cjs docs/00-设计方案.md docs/交付/KPI考核管理系统-设计方案-V1.0.docx", + "docs:manual": "node scripts/md2docx.cjs docs/手册/KPI考核管理系统-操作手册.md docs/交付/KPI考核管理系统-操作手册-V0.1.docx" }, "dependencies": { "@objectstack/connector-mcp": "^17.2.0", diff --git a/scripts/md2docx.cjs b/scripts/md2docx.cjs index 29da8d5..2380312 100644 --- a/scripts/md2docx.cjs +++ b/scripts/md2docx.cjs @@ -1,13 +1,36 @@ -// Minimal Markdown → docx converter for the design proposal (headings, cover div, -// version table, tables with captions, bullets, paragraphs, code block, page breaks). +// Minimal Markdown → docx converter for the delivery documents (headings, cover div, +// version table, tables with captions, bullets, paragraphs, code block, page breaks, +// and images: a `![alt](相对路径.png)` line is embedded, scaled to the text width and centred). const fs = require('fs'); const path = require('path'); const D = require('docx'); -const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, WidthType, HeadingLevel, AlignmentType, PageBreak, ShadingType, BorderStyle, LevelFormat, TableOfContents, Footer, Header, PageNumber } = D; +const { Document, Packer, Paragraph, TextRun, Table, TableRow, TableCell, WidthType, HeadingLevel, AlignmentType, PageBreak, ShadingType, BorderStyle, LevelFormat, TableOfContents, Footer, Header, PageNumber, ImageRun } = D; const src = fs.readFileSync(process.argv[2], 'utf8').split('\n'); const out = process.argv[3]; -let coverChildren = []; let versionText = ""; +const SRC_DIR = path.dirname(path.resolve(process.argv[2])); +/** 版心宽度(px @96dpi):A4 宽 11906 twip − 左右页边距 1500 twip ×2 = 8906 twip。 */ +const CONTENT_PX = Math.floor((8906 / 1440) * 96); +/** 从 PNG 的 IHDR 块直接读宽高(避免引入图像库)。 */ +function pngSize(buf) { + if (buf.length < 24 || buf.readUInt32BE(0) !== 0x89504e47) return null; + return { width: buf.readUInt32BE(16), height: buf.readUInt32BE(20) }; +} +function imageParagraph(relPath) { + const file = path.resolve(SRC_DIR, decodeURIComponent(relPath)); + const buf = fs.readFileSync(file); + const size = pngSize(buf); + if (!size) throw new Error('unsupported image (PNG only): ' + file); + const width = Math.min(size.width, CONTENT_PX); + const height = Math.round((size.height * width) / size.width); + return new Paragraph({ + children: [new ImageRun({ data: buf, type: 'png', transformation: { width, height } })], + alignment: AlignmentType.CENTER, + spacing: { before: 160, after: 60 }, + keepNext: true, + }); +} +let coverChildren = []; let versionText = ""; let docName = "设计方案"; let coverTitleCount = 0; const FONT_CN = 'SimSun', FONT_HEAD = 'SimHei', FONT_EN = 'Times New Roman', FONT_MONO = 'Consolas'; const runs = (text, extra = {}) => { // inline **bold** and `code` @@ -56,6 +79,7 @@ while (i < src.length) { if (inCover) { const t = line.replace(/^#+\s*/, '').replace(/\*\*/g, ''); const isTitle = line.startsWith('#'); + if (isTitle) { coverTitleCount += 1; if (coverTitleCount === 2) docName = t.trim(); } if (/^版本号/.test(t)) versionText = t.replace(/^版本号[::]\s*/, "").replace(/[((].*$/, "").trim(); coverChildren.push(new Paragraph({ children: [new TextRun({ text: t, bold: true, size: isTitle ? 48 : 28, font: { eastAsia: isTitle ? FONT_HEAD : FONT_CN, ascii: FONT_EN, hAnsi: FONT_EN } })], alignment: AlignmentType.CENTER, spacing: { before: isTitle ? 360 : 120, after: 120 } })); continue; @@ -67,13 +91,14 @@ while (i < src.length) { if ((m = line.match(/^### (.+)/))) { children.push(new Paragraph({ heading: HeadingLevel.HEADING_3, children: [new TextRun({ text: m[1], bold: true, size: 24, font: { eastAsia: FONT_HEAD, ascii: FONT_EN, hAnsi: FONT_EN }, color: '1B2540' })], spacing: { before: 200, after: 100 } })); continue; } if ((m = line.match(/^\*\*(表 \d+ [^*]+)\*\*$/))) { pendingCaption = m[1]; continue; } if (line.startsWith(">")) { const qt = line.replace(/^>\s?/, ""); if (qt.trim() === "") continue; children.push(new Paragraph({ children: runs(qt, { size: 21 }), indent: { left: 480, right: 480 }, shading: { fill: "F2F4F7", type: ShadingType.CLEAR, color: "auto" }, spacing: { after: 40, line: 300 } })); continue; } + if ((m = line.match(/^!\[[^\]]*\]\(([^)]+)\)\s*$/))) { children.push(imageParagraph(m[1])); continue; } if ((m = line.match(/^(图 \d+ .+)$/))) { children.push(new Paragraph({ children: runs(m[1], { bold: true, size: 22 }), alignment: AlignmentType.CENTER, spacing: { after: 160 } })); continue; } if ((m = line.match(/^- (.+)/))) { children.push(new Paragraph({ children: runs(m[1]), numbering: { reference: 'bul', level: 0 }, spacing: { after: 80, line: 340 } })); continue; } children.push(para(line)); } flushTable(); const doc = new Document({ - creator: 'KPI 项目组', title: 'KPI 考核管理系统 设计方案 ' + versionText, + creator: 'KPI 项目组', title: 'KPI 考核管理系统 ' + docName + ' ' + versionText, styles: { default: { document: { run: { font: { eastAsia: FONT_CN, ascii: FONT_EN, hAnsi: FONT_EN }, size: 24 } } } }, numbering: { config: [{ reference: 'bul', levels: [{ level: 0, format: LevelFormat.BULLET, text: '•', alignment: AlignmentType.LEFT, style: { paragraph: { indent: { left: 480, hanging: 240 } } } }] }] }, features: { updateFields: true }, @@ -82,7 +107,7 @@ const doc = new Document({ children: coverChildren, }, { properties: { page: { margin: { top: 1440, bottom: 1440, left: 1500, right: 1500 }, pageNumbers: { start: 1 } } }, - headers: { default: new Header({ children: [new Paragraph({ children: [new TextRun({ text: 'KPI 考核管理系统 · 设计方案 ' + versionText, size: 18, color: '6C7686', font: { eastAsia: FONT_CN } })], alignment: AlignmentType.RIGHT })] }) }, + headers: { default: new Header({ children: [new Paragraph({ children: [new TextRun({ text: 'KPI 考核管理系统 · ' + docName + ' ' + versionText, size: 18, color: '6C7686', font: { eastAsia: FONT_CN } })], alignment: AlignmentType.RIGHT })] }) }, footers: { default: new Footer({ children: [new Paragraph({ children: [new TextRun({ text: '第 ', size: 18, font: { eastAsia: FONT_CN } }), new TextRun({ children: [PageNumber.CURRENT], size: 18 }), new TextRun({ text: ' 页 共 ', size: 18, font: { eastAsia: FONT_CN } }), new TextRun({ children: [PageNumber.TOTAL_PAGES], size: 18 }), new TextRun({ text: ' 页', size: 18, font: { eastAsia: FONT_CN } })], alignment: AlignmentType.CENTER })] }) }, children, }],