
简介一份面向系统分析与设计人员的工资管理系统数据流程图文档覆盖考勤、工资计算、福利费计提、个人所得税申报与工资费用分配等核心数据流。内容按数据字典、数据存储、数据流和处理逻辑四部分展开定义了考勤日期、职工编码、基本工资等数据项列出变动工资表、工资计算表、个人所得税申报表等存储表并串联从考勤输入、工资计算、银行代发到费用分摊、福利费计提、扣税与自动转账的完整路径同时补充了各处理环节的输入输出与业务规则如应付福利费计提比例、个人所得税累进税率便于理解财务与人事管理中的数据流转。资源为单份doc文档约95KB已有2676人学习适合软件工程课程设计、数据库设计及系统文档编写时快速梳理数据流程。1. 工资管理系统数据流程图先看懂这张图再谈实现一张看似普通的 .doc 数据流程图往往比一堆 UML 用例图更能暴露一套系统的真实业务骨架。这份《工资管理系统数据流程图》正是如此——它没有一行代码却用数据字典、十张存储表、十条处理逻辑把工资系统的月度闭环讲清楚了考勤进来、变动工资算出来、基本工资定下来、工资表汇总出来、银行代发走完、费用和福利费分摊完、个税扣完、最后自动生成转账凭证进账务系统。如果你正打算做一套财务相关管理系统或者需要补一份课程设计的数据流文档这张图能直接当蓝本用。它适合三类人正在做课设的在校生、刚接手企业财务系统改造的开发以及需要补交设计文档的工程师。我拆完这张图之后最大的感受是它的主键设计和处理频率描述比很多 PPT 里的系统架构图实在得多。2. 数据字典与十张存储表把 S1-S10 的字段和主键先理清2.1 五个数据项是整个系统的地基文档开头定义了五个数据项考勤日期、工资日期、职工编码、部门名称、基本工资。这五个字段看起来平淡实际决定了后续所有表的关联方式。最核心的是职工编码它是唯一标识职工的编码宽度 10在 S1 到 S10 几乎每一张表里都会出现。另一个容易被忽略的是工资日期它标识工资的年月和职工编码一起构成了绝大多数工资表的联合主键。部门名称 Char(20) 本身不参与计算但它承担了工资费用分配时的归类作用后面 P7 分摊工资会按部门和岗位类别做会计科目映射。基本工资 decimal(7,2) 是定长的七位精度也就意味着最大支持 99999.99 的岗位工资如果企业里有超过十万月薪的高管这个精度就得改。数据项这层没什么玄学但它决定了你建表时字段类型怎么掐。2.2 十张存储表的分层从明细到汇总再到分配文档列出了 S1 到 S10 共十张存储表我按用途把它们分成三个层次这样看结构会清楚很多。第一层是原始数据表包括 S8 职员信息表、S10 考勤表、S9 工资计算标准表。S8 记录职员的静态信息职工编码、姓名、性别、人员类别、部门编码、岗位编码、职称、工龄、个人账号、联系电话。S10 考勤表记录加班天数、病假天数、旷工天数、事假天数。S9 工资计算标准表比较特殊它的组成是「基本工资计算标准 变动工资计算标准」没有固定字段清单本质上是给 P2 和 P4 提供计算参数的配置表。这三张表是输入侧。第二层是计算过程表S1 变动工资表、S2 基本工资表、S3 工资计算表。S1 由工资日期、职工编码加上加班费、奖金、水电费、保险费、病假扣款、事假扣款、旷工扣款、其他扣款、个人所得税组成S2 由工资日期、职工编码加上基本工资、工龄工资、岗位津贴、固定补贴组成S3 是最终汇集表字段最多从基本工资一路到实发工资一共 21 个字段。S3 在文档里出现的关联处理最多P4、P5、P6、P7、P8、P9 一共六个处理都和它相关是整个系统的数据中枢。第三层是分配与输出表S4 福利费计提分配表、S5 个人所得税申报表、S6 工资费用分配表、S7 工资转账凭证。这三张分配表的组成模式非常相似日期、职工编码、部门编码、对应科目编码、金额。它们的差别只在用途——S4 对应福利费 14% 的计提S5 对应个税申报S6 对应工资费用分摊。S7 是最终产物只在 P10 自动转账时生成直接进入账务处理系统。下表汇总十张表的输入输出关系方便读者对照原文档存储表数据组成特征写入处理读取处理S1 变动工资表工资日期职工编码各类扣款P2P4S2 基本工资表工资日期职工编码固定项P5P4S3 工资计算表21 字段全量工资信息P4P5/P6/P7/P8/P9S4 福利费计提分配表日期职工编码科目金额P8P10S5 个人所得税申报表职工编码收入-扣除税档P9P10S6 工资费用分配表日期职工编码科目金额P7P10S7 工资转账凭证转账凭证业务数据P10账务系统S8 职员信息表职员静态信息全量E2→P3P5S9 工资计算标准表基本/变动工资计算参数E3P2S10 考勤表考勤日期职工编码天数P1P22.3 主键设计工资日期 职工编码是最短有效路径所有工资相关表的主键都是「工资日期 职工编码」这个设计值得单独说。业务上每月每个职工产生一条工资记录这两个字段联合起来必然唯一。相比给每张表加一个自增 ID 的做法联合主键的好处是直接带业务语义做 P4 工资计算合并时不需要额外的映射逻辑——用 SQL 表达就是 ON a.工资日期 b.工资日期 AND a.职工编码 b.职工编码一次 join 就能把基本工资和变动工资汇齐。从这份图的表结构看S3 工资计算表在读取 S1 和 S2 时就是拿这两对字段做等值匹配。换句话说只要你在落地实现时把这两个字段的索引建对月度批量计算基本不会有查询瓶颈。常见误用是另建自增主键而不保留业务主键约束结果就是同一职工同一月份可能出现两条记录跑银行代发时对账对不上。最好的做法是保留业务联合主键的同时加自增索引列前者保证唯一后者方便 ORM 操作。3. 十条处理逻辑串成主流程从考勤输入到自动转账3.1 处理链路的四个阶段P1 到 P10 十个处理逻辑按执行顺序可以分成四个阶段。第一阶段是数据准备包括 P1 输入考勤信息、P3 维护人事基本信息、P2 编制变动工资表、P5 编制基本工资表。第二阶段是核心计算P4 计算工资把 S1 和 S2 合并成 S3。第三阶段是外部交互P6 银行代发把工资数据按银行要求格式输出。第四阶段是财务闭环P7 分摊工资、P8 计提福利费、P9 扣税、P10 自动转账处理。文档中给每个处理都标了处理频率全部是 1 次/月。这意味着整个系统的运行节奏是以月为周期的批处理不是实时事务系统。这提醒了落地时的技术选型不需要复杂的实时计算框架一个定时任务调度 批量 SQL 就能扛住。3.2 P2 编制变动工资表考勤与标准的交叉计算P2 的输入是 S9 工资计算标准表和 S11 考勤表输出是 S1 变动工资表。它的职责是计算出每个职工的加班费、病假扣款、事假扣款、旷工扣款等变动金额。文档原文说得很清楚财务处根据考勤信息和标准表中设置的金额计算。实操上需要一张映射规则表把考勤天数翻译成金额。常见做法是加班费 加班天数 × 日基本工资 × 加班倍率倍率按节假日和工作日区分病假扣款 病假天数 × 日基本工资 × 病假扣款比例事假扣款 事假天数 × 日基本工资 × 事假扣款比例旷工扣款 旷工天数 × 日基本工资 × 旷工扣款倍率日基本工资从哪里来标准算法是月基本工资除以 21.75月计薪天数。这里有个坑考勤系统里如果直接存了扣款金额而不是天数P2 的逻辑就变成了简单的求和反而更简单。但这份文档选择了存天数那么换算规则就必须配置在 S9 里。3.3 P4 计算工资S3 表的 21 字段如何拼出来P4 是整个系统的核心它对 S1 和 S2 做汇总计算输出 S3。S3 的字段构成隐含着计算顺序先汇总应发项——基本工资 工龄工资 岗位津贴 固定补贴 变动津贴 加班费 奖金得到应发工资再汇总扣款项——水电费 保险费 病假扣款 事假扣款 旷工扣款 其他扣款 个人所得税得到扣款合计最后实发工资 应发工资 - 扣款合计。用伪代码表达这条计算逻辑# P4 工资计算核心逻辑示意 for emp in 职工列表: 应发工资 (S2.基本工资 S2.工龄工资 S2.岗位津贴 S2.固定补贴 S1.变动津贴 S1.加班费 S1.奖金) 扣款合计 (S1.水电费 S1.保险费 S1.病假扣款 S1.事假扣款 S1.旷工扣款 S1.其他扣款 S1.个人所得税) 实发工资 应发工资 - 扣款合计 # 按 (工资日期, 职工编码) 写入 S3 工资计算表注意 S1 里已经包含了个人所得税字段但 P9 又会有独立的个税计算。这说明 S1 里的个税是预估或上月值P4 合并时先带过来P9 在月底按累计收入重新核定。S3 里的个人所得税字段最终以 P9 的回写为准实现时建议用两个字段区分「预估税额」和「核定税额」避免对账时扯皮。3.4 P6 银行代发最容易在课设里被一句话带过的处理P6 银行代发是这套系统里最贴近真实企业运作的处理文档描述了三层动作。第一层企业根据代发银行要求设置代发文件格式第二层选择输出格式确定数据项目在文件中的存放方式第三层按设定格式和文件名输出到磁盘可通过互联网传输或磁盘报送给银行。这意味着 .doc 里的数据流程图虽然只管到 S3 输出实发工资但落地实现时还得有一个独立的文件生成模块。银行代发文件通常是定长文本或 CSV字段顺序有严格要求银行行号、账号、户名、金额金额通常是两位小数的整数形式。我经手的项目里踩过最典型的坑是工资计算表的职工账号字段存的是字符串但生成代发文件时被 Excel 转成了科学计数法银行端读出来全是错的。正确做法是生成文件时强制按字符串格式化并且预留两位小数补零。4. 工资管理系统数据流程图里的三个硬规则14% 福利费、9 级个税与银行代发4.1 福利费计提14% 的比例从哪来P8 计提福利费的处理逻辑里写着应付福利费的计提比例为工资总额的 14%。这个 14% 是历史政策规定的计提比例按工资总额计算然后对应分配到生产成本、制造费用、营业费用、管理费用等科目。文档里的会计分录写得很完整借生产成本——基本生产成本、制造费用——福利费、营业费用——福利费、管理费用——福利费 贷应付福利费落地实现时这个计提逻辑会拆成两步。第一步按部门和岗位类别统计 S3 中的实发工资或应发工资作为计提基数第二步按 14% 算出金额并映射到会计科目。值得注意的是文档里写的是「工资总额」实际计算基数在实务中经常存在争议——用应发工资还是实发工资做基数结果差一个扣款合计。课设里通常简化成应发工资企业系统里则按财务制度配置一个可调的计提基数公式。4.2 个税计算9 级超额累进税率 5%-45%P9 扣税处理的描述是全文档技术含量最高的一段。它明确写了个人所得税采用分级累进制先设定纳税基数一般把实发工资项目设为纳税基数再定义税率表系统提供 9 级超额累进税率税率为 5%~45%级数为 9 级单位可根据需要调整费用基数和附加费用。这套算法拆开看是三个参数组基数起征点、级距、税率。计算步骤为应纳税所得额 收入额 - 费用额费用额通常是起征点加附加费用再按应纳税所得额对照税率表找对应的税率和速算扣除数最后应纳税额 应纳税所得额 × 税率 - 速算扣除数。用 Python 示意这层计算# 9 级超额累进税率计算示意税率表按文档可配置 tax_table [ (0, 500, 0.05, 0), (500, 2000, 0.10, 25), (2000, 5000, 0.15, 125), # ... 实际按 9 级配置 ] def calc_tax(income, deduction800): taxable income - deduction for lower, upper, rate, quick in tax_table: if taxable upper: return taxable * rate - quick return taxable * 0.45 - 15375参数说明income是收入额合计deduction是费用额含起征点rate是当前级距税率quick是速算扣除数。9 级表在当下个税政策里已经被 7 级年度累计预扣法取代但作为课设和通用工资系统的设计蓝本这套可配置的分级累进框架依然适用——你把税率表换成新的 7 级表逻辑完全不用动。文档特意写明「单位可根据需要调整」说明原始设计就预留了政策变化的余地。4.3 三条会计分录的流向关系P7、P8、P9 各自输出一张分配表P10 自动转账把它们汇总成 S7 工资转账凭证。三条分录流向分别对应工资费用分配、福利费计提、个税扣缴工资费用分配P7借生产成本/制造费用/营业费用/管理费用/在建工程——工资贷应付工资福利费计提P8借生产成本/制造费用/营业费用/管理费用——福利费贷应付福利费个税扣缴P9借应付工资贷应交税金——应交个人所得税P10 把这些统一生成转账凭证进入账务系统。这提醒了实现时的一个设计决策S4、S5、S6 三张表都应该带凭证状态字段记录是否已生成凭证、对应凭证号防止月末重复转账。5. 从流程图到落地实现库表映射与模块拆分的具体做法5.1 把十张存储表翻译成建表 SQL拿到这份数据流图直接动手建库时我建议按以下几个原则映射所有表保留联合主键金额字段统一 decimal(10,2)涉及税率、费率的标准字段用 decimal(5,4) 保留四位小数日期字段用年月粒度就够了直接 char(7) 存 2025-06 这种格式避免时间函数转换。以下给出核心表的建表语句-- S3 工资计算表核心表 CREATE TABLE salary_calc ( salary_month CHAR(7) NOT NULL COMMENT 工资日期格式YYYY-MM, emp_code CHAR(10) NOT NULL COMMENT 职工编码, emp_name VARCHAR(20) NULL COMMENT 职工姓名, account_no VARCHAR(30) NULL COMMENT 个人账号, basic_salary DECIMAL(10,2) NULL COMMENT 基本工资, seniority_pay DECIMAL(10,2) NULL COMMENT 工龄工资, post_allowance DECIMAL(10,2) NULL COMMENT 岗位津贴, fixed_subsidy DECIMAL(10,2) NULL COMMENT 固定补贴, variable_allow DECIMAL(10,2) NULL COMMENT 变动津贴, overtime_pay DECIMAL(10,2) NULL COMMENT 加班费, bonus DECIMAL(10,2) NULL COMMENT 奖金, gross_salary DECIMAL(10,2) NULL COMMENT 应发工资, water_electric DECIMAL(10,2) NULL COMMENT 水电费, insurance DECIMAL(10,2) NULL COMMENT 保险费, sick_deduct DECIMAL(10,2) NULL COMMENT 病假扣款, personal_ded DECIMAL(10,2) NULL COMMENT 事假扣款, absence_deduct DECIMAL(10,2) NULL COMMENT 旷工扣款, other_deduct DECIMAL(10,2) NULL COMMENT 其他扣款, income_tax DECIMAL(10,2) NULL COMMENT 个人所得税, total_deduct DECIMAL(10,2) NULL COMMENT 扣款合计, net_salary DECIMAL(10,2) NULL COMMENT 实发工资, PRIMARY KEY (salary_month, emp_code), KEY idx_emp (emp_code) );参数说明主键用salary_month emp_code和原文档保持完全一致idx_emp索引给按职工查询或跨月汇总用所有金额字段统一 decimal(10,2)比文档原始定义的 decimal(7,2) 留了更大的余量账号字段用 varchar(30)避免后续生成银行代发文件时精度丢失。5.2 十个处理映射成十个函数按原文档的处理编号来组织代码是复现这套系统最清晰的方式。P1 到 P10 一对一地写成十个服务函数每个函数对应一个批处理任务顺序执行。我用伪代码描述主调度def run_monthly_close(month): p1_input_attendance(month) # 考勤信息入库 p5_build_basic_salary(month) # 编制基本工资表 S2 p2_build_variable_salary(month) # 编制变动工资表 S1 p4_calc_salary(month) # 计算工资生成 S3 p6_bank_payroll(month) # 生成银行代发文件 p7_allocate_salary(month) # 工资费用分配 S6 p8_accrue_welfare(month) # 福利费计提 S4 p9_calc_tax(month) # 个税计算生成 S5 p10_auto_transfer(month) # 自动转账生成 S7注意函数排列顺序P5 基本工资表要在 P2 变动工资表之前还是之后文档中的编号是 P2 在前 P5 在后但 P4 计算工资同时需要 S1 和 S2所以实际执行顺序应该是 P5 → P2 → P4。我按依赖关系做了调整以实现正确性优先编号顺序只作为函数命名依据。5.3 数据库事务与月度状态机月度批处理和实时写入不同最怕跑了一半失败导致数据半新半旧。工程上的标准做法是给每个月的数据处理加状态位放在一张monthly_close_status表里记录 P1 到 P10 每个处理的状态待执行、执行中、已完成、失败。某个处理失败时回滚当月相关表的数据状态回到待执行修复后重跑。这个做法在原文档中没有出现但它能让流程图里的处理频率真正可控——1 次/月的批处理任务在出现故障时不能靠人工在数据库里手工改数据必须有可重入的重跑机制。6. 避坑照着这张图复现时的四个常见问题6.1 S9 工资计算标准表没有固定字段落地时容易做成死配置现象照着图建了 S9 表发现不知道该建哪些列。 原因文档里 S9 的组成写的是「基本工资计算标准 变动工资计算标准」是抽象描述没有给具体字段清单。它本质上是一张配置表不同企业标准完全不同没法预先定义固定列。 解决做成标准-规则键值对表至少包含标准编码、标准名称、计算基数、比例/倍率、生效日期、失效日期。实际扣款规则用上 6.2 提到的规则表这两个配合起来才能填满 S9 的能力边界。课设里最简单的方式是建一张参数表把加班倍率、病假扣款比例、事假扣款比例、旷工倍率、14% 福利费比例、个税起征点全部放进去。6.2 变动工资被直接写成金额而不是按天数和标准计算现象P2 的变动工资表实现成了手工录入金额月底直接汇总。 原因原始图里 P2 的输入是考勤表和工资计算标准表输出应该通过公式计算得出。简化实现时把考试结果直接填了金额省掉了计算逻辑。 解决一定要保留天数字段并维护规则表。建议在 S10 考勤表和 S1 变动工资表之间加一张映射规则表字段为规则编码、考勤类型加班/病假/事假/旷工、倍率、优先级。P2 执行时按照考勤天数 × 日工资 × 倍率生成金额。这样哪怕政策调整只改规则表不动数据。6.3 S3 里的个税字段和 P9 算出来的结果对不上现象S3 里已经有个人所得税字段P9 又算了一版月末发现两边数据不一致。 原因P4 汇总时 S1 里的个人所得税是预估或历史数据P9 是按累计收入重算的核定数据。两套数在同一表字段里互相覆盖没有区分来源。 解决S3 增加两个字段预估个税和核定个税。P4 填预估P9 回写核定并将差异计入当月补退。银行代发以实发工资为准对账时以核定为准。文档没区分这两个概念但实务中必须分。6.4 银行代发文件生成后账号被 Excel 转成科学计数法现象代发文件里职工账号变成 6.25E18银行端批量打款失败。 原因账号字段在导出时按数值类型处理Excel 自动转成了科学计数法且丢精度。 解决导出前强制把账号列格式化为文本文件内容按定长字符串输出长度不足的左边补零。另外在生成文件后马上抽查三行第一行、中间某行、最后一行用文本编辑器看原始内容而不是 Excel 预览。这三行没问题再报送。7. 验证这张数据流程图的三个技巧7.1 表间关联计数验证拿到图之后先做一轮静态验证沿着每条数据流的去向数一遍看每个处理的输入表是否都有对应的数据流来源。最值得核对的是 P4 计算工资的输入完整性——它需要 S1 和 S2 两张表缺一张 S3 就凑不齐 21 个字段。第二是 P10 自动转账输入是 S4、S5、S6 三张分配表缺任何一张转账凭证就不平。用行级聚合验证也可以S3 的记录数应该等于当月在职职工数S1 和 S2 的记录数应该和 S3 完全一致。不一致就说明合并逻辑有问题。实践时我会对原始文档做一张空白核对表在每张存储表后面标注「写入该表的处理」和「读取该表的处理」两边都非空这张表在设计上才是闭环的。S8 职员信息表只有写入没有读取不对P5 编制基本工资表要读它所以要同时确认读侧有值。7.2 处理顺序依赖闭环验证十个处理之间有两组必须满足的顺序约束。第一组是 P1、P5、P2 必须先于 P4因为 S1 和 S2 得先有数据第二组是 P7、P8、P9 必须先于 P10否则转账凭证缺少分配数据。验证方法是把处理依赖画成邻接表跑一次拓扑排序——存在环就说明设计有互相依赖的问题。这份文档的依赖关系是干净的从 P1 到 P10 是单向推进。你用 SQL 写批处理时可以把依赖关系直接映射成任务表的前置任务编码字段调度器按依赖执行效果等同于状态机的每个节点。7.3 字段级主键追踪最后追踪联合主键的传播路径从 S10 考勤表的考勤日期职工编码传到 S1 变动工资表再传到 S3 工资计算表一直到 S6 工资费用分配表这条链上主键应该始终不变。如果中间的某张表丢掉了职工编码后面按部门汇总时就会丢失明细。追踪方法是拿 S3 的主键去反向查 S6 的对应记录查不到的说明数据流断链了。整套验证跑完这张图才算真正吃透了。从那以后我每次复现这类管理信息系统的数据流图都会先花半小时把存储表的读写关系表列出来再动手写任何代码——这个习惯帮我挡掉了至少五次「凭证合不上」的通宵排查。希望帮到你。本文还有配套的精品资源点击获取