- 输入数据
- 报销单、发票明细、差旅标准
- 核心方法
- 规则库 + 重复检测
- 输出物
- 违规报销清单
费用报销的问题大多藏在细节里:同一张发票报了两次、住宿超标准几十块、周末的招待费、连号的餐饮发票。这个模型用四条规则逐行检查报销明细,一行命中几条就输出几条。结果是需要复核的清单,不是违规认定。
适用场景
- 财务共享中心复核:在人工审单之外,每周把已提交的报销明细全量跑一遍。
- 内部审计专项:对差旅费、业务招待费做年度或半年度检查。
- 制度修订参考:统计超标准最多的费用类型和城市,判断标准是否需要调整。
输入数据要求
两张表:报销明细和报销标准。报销明细每行为某员工某一天的一类费用。
| 字段 | 是否必需 | 类型 | 说明 |
|---|---|---|---|
| 行号 | 必需 | 文本 | 明细行唯一标识 |
| 报销单号 | 必需 | 文本 | 一张报销单可以有多行 |
| 员工编号 | 必需 | 文本 | |
| 职级 | 必需 | 文本 | 示例数据中 M 开头为经理,其余为员工 |
| 费用类型 | 必需 | 文本 | 住宿、餐饮、交通、招待 |
| 发生日期 | 必需 | 日期 | 格式 yyyy-MM-dd |
| 城市等级 | 必需 | 文本 | 一线、其他 |
| 金额 | 必需 | 数值 | 当天该类费用金额 |
| 发票号 | 必需 | 文本 | 必须按文本读取 |
| 员工姓名、部门、城市、事由 | 可选 | 文本 | 只带到结果里方便复核 |
报销标准表(示例):
| 费用类型 | 职级组 | 城市等级 | 单日上限(元) |
|---|---|---|---|
| 住宿 | 员工 | 一线 | 500 |
| 住宿 | 员工 | 其他 | 350 |
| 住宿 | 经理 | 一线 | 800 |
| 住宿 | 经理 | 其他 | 550 |
| 餐饮 | 员工 | 一线 | 120 |
| 餐饮 | 员工 | 其他 | 100 |
| 餐饮 | 经理 | 一线 | 200 |
| 餐饮 | 经理 | 其他 | 150 |
判定规则
| 规则 | 条件 | 风险 | 说明 |
|---|---|---|---|
| E1 重复报销 | 同一发票号出现在两张及以上报销单 | 高 | 每张涉及的明细行都输出 |
| E2 超标准 | 住宿、餐饮金额大于对应标准的单日上限 | 中 | 等于上限不算超标;交通、招待没有上限,不判断 |
| E3 周末餐饮招待 | 餐饮或招待费发生在周六、周日 | 低 | 周末出差吃饭很常见,只作提示 |
| E4 连号发票 | 同一员工、同一费用类型,两张纯数字发票号相差 1 | 中 | 可能是拆开开票规避单张限额;输出发票号较大的那一行 |
四条规则相互独立,一行可以同时命中多条。
工作流步骤
节点按 KNIME 英文名给出,iModel 中文界面的节点名以你所用的版本为准。示例数据已放在工作流内,导入后直接执行即可。四条规则各走一个分支,最后合并。
- 读取报销明细与标准CSV Reader
- 转日期、取星期、判职级组Rule Engine
- E1 重复报销GroupBy + Joiner
- E2 超标准Joiner + Row Filter
- E3 周末餐饮招待Row Filter
- E4 连号发票Lag Column
- 合并四个分支Concatenate
- 输出命中清单CSV Writer
- 读取两张表CSV Reader
读取
expense_claims.csv与expense_standards.csv;「发票号」「行号」「员工编号」设为文本。 - 准备公共列String to Date&TimeExtract Date&Time FieldsRule Engine
「发生日期」转为日期并提取星期;新增「职级组」:
$职级$ LIKE "M*" => "经理",TRUE => "员工"。 - E1 重复报销GroupByRow FilterJoiner
按「发票号」分组,对「报销单号」做 Unique count;保留大于等于 2 的发票号,再与明细按「发票号」内连接取回全部行。
- E2 超标准JoinerRule-based Row Filter
明细与标准表按「费用类型、职级组、城市等级」内连接(交通、招待没有标准,自然不参与);保留
$金额$ > $单日上限$的行。 - E3 周末餐饮招待Row Filter
保留「费用类型」为餐饮或招待、且星期为周六或周日的行。
- E4 连号发票Row FilterString to NumberSorterLag ColumnRule-based Row Filter
只保留发票号为纯数字的行(正则
[0-9]+)并转为数值;按员工编号、费用类型、发票号排序;用 Lag Column 取上一行的员工编号、费用类型、发票号;保留三者满足「员工、类型相同且发票号差 1」的行。 - 合并输出Constant Value ColumnConcatenateSorterCSV Writer
每个分支加上「命中规则」「风险等级」两列后合并,按风险等级(高、中、低)、规则、行号排序,写出结果文件。
参数
| 参数 | 默认值 | 作用 | 怎么调 |
|---|---|---|---|
| 报销标准表 | expense_standards.csv | E2 的上限 | 直接换成公司现行标准;新增费用类型时补行即可 |
| E3 检查的费用类型 | 餐饮、招待 | 周末提示的范围 | 不需要这条提示时整个分支停用 |
| E4 连号间隔 | 1 | 发票号相差多少算连号 | 手工开票场景可放宽到 2,误报会增加 |
用示例数据验证
运行后结果应与示例数据包里的 expected_result.csv 完全一致。
| 命中规则 | 风险 | 行号 | 员工 | 费用类型 | 发生日期 | 金额 | 说明 |
|---|---|---|---|---|---|---|---|
| E1 重复报销 | 高 | 81 | E005 | 住宿 | 2026-03-10 | 420.00 | 发票号出现在 2 张报销单 |
| E1 重复报销 | 高 | 82 | E005 | 住宿 | 2026-03-10 | 420.00 | 发票号出现在 2 张报销单 |
| E1 重复报销 | 高 | 186 | E008 | 招待 | 2026-05-14 | 1,680.00 | 发票号出现在 2 张报销单 |
| E1 重复报销 | 高 | 187 | E009 | 招待 | 2026-05-14 | 1,680.00 | 发票号出现在 2 张报销单 |
| E2 超标准 | 中 | 33 | E006 | 住宿 | 2026-02-03 | 680.00 | 上限 500,超出 180.00 |
| E2 超标准 | 中 | 126 | E007 | 餐饮 | 2026-04-08 | 156.00 | 上限 100,超出 56.00 |
| E2 超标准 | 中 | 147 | E010 | 住宿 | 2026-04-21 | 352.00 | 上限 350,超出 2.00 |
| E2 超标准 | 中 | 221 | E001 | 住宿 | 2026-06-02 | 960.00 | 上限 800,超出 160.00 |
| E4 连号发票 | 中 | 19 | E007 | 餐饮 | 2026-01-20 | 105.00 | 与发票号 22873354 连号 |
| E4 连号发票 | 中 | 200 | E010 | 住宿 | 2026-05-20 | 340.00 | 与发票号 30229274 连号 |
| E3 周末餐饮招待 | 低 | 43 | E004 | 餐饮 | 2026-02-07 | 88.00 | 发生在周六或周日 |
| E3 周末餐饮招待 | 低 | 136 | E012 | 招待 | 2026-04-12 | 2,400.00 | 发生在周六或周日 |
| E3 周末餐饮招待 | 低 | 216 | E003 | 餐饮 | 2026-05-31 | 140.00 | 发生在周六或周日 |
另有五类不应被标出的数据:金额恰好等于上限的住宿、经理在一线城市 760 元的住宿(经理上限 800)、周末的交通费、两名不同员工的连号发票、背景数据中的正常报销。
适用边界
- 发票真伪不在范围内。需要接入发票查验服务,模型只看报销系统里的数据。
- 只按天判断上限。一张住宿发票覆盖多晚时,要先按晚数拆开或折算单日金额。
- 节假日没有算进去。E3 只看周六周日,法定节假日和调休需要另外维护一张日历表关联。
- E4 只适用于纯数字发票号。数电发票号码较长,连号在正常连续消费中也会出现,要结合金额与事由复核。
常见问题
E1 能发现跨员工的重复报销吗?
能。规则只看发票号是否出现在多张报销单,不管是不是同一个人,示例数据里就有两名员工报同一张招待发票的情况。
标准按部门、按项目不同怎么办?
在标准表里增加对应列,并在第 4 步的连接条件里加上这一列即可。
报销数据在费控系统里,怎么接?
把第 1 步换成数据库读取节点或读取系统导出文件,字段对齐后后面的步骤不用改。
命中了就算违规吗?
不算。超标准可能已经事先审批,周末招待可能是正常安排,结果用于复核。