如何发展人员和OA管理系统的薪酬管理部门? (架构图+代码参考)

文章报道:企业薪资委员会,个人工资委员会,进口和启动工资计算,工资生产,员工薪金细节(数据流),基本设置,员工薪金结构,雇员五个保险和一项基金支付基础,员工特别额外的扣除额(工资档案)以及方便的建筑图和流动图表,以方便直接开发和流动图表。

为什么我们需要制作工资模块?什么是工资模块,应解决什么疼痛点? Recommended overall architecture (including architecture diagrams) function list (item disassembly) business process (including flow charts), data model design (core table structure) detailed explanation of key function development and code reference development skills, performance and safety precautions (implementation dry goods) test and online precautions to achieve results (page/experience description) FAQ

一、为什么要做薪酬模块?

二、薪酬模块是什么,该解决哪些痛点?

Simply put: Make compensation-related configuration, data,计算,批准,分发和存档到闭环服务中。它将解决:

自动数据流(出勤,绩效,入学和辞职);规则配置(税率,社会保障率,基础的上限和下限,特殊额外扣除)和支持版本管理;支持模拟和正式计算,批准和分配;工资单的自动产生和安全分配;报告和坎班人满足人力资源/财务/管理需求;严格的权威和审计以保护员工隐私。

三、推荐总体架构(含架构图)

推荐层次结构:前端- API网关- 后端模块化服务- 存储层- 外部系统

简化的ASCII体系结构图:

差异

+————————————————————————————————————————————————————————————————————————————————————–

|前端(vue/react)|

| – 公司工资委员会- 个人工资委员会- 进口/启动计算页面|

+————————————————————————————————————————————————————————————————————————————————————–

| API网关(身份验证/当前限制/日志)|

+———————————————————————————————————————————————————————————————————-

|后端服务层(微服务)|

| – 员工服务(HR Master)|

| – 工资引擎|

| – 导入服务(Excel/CSV)|

| – 批准服务(OA流)|

| – 报告/看板服务|

| – 付款/对帐服务|

+———————————————————————————————————————————————————————————————————-

|存储层|

| – 关系DB(MySQL/Postgres) – 报告/OLAP(Clickhouse)|

| – 对象存储(S3) – 缓存(redis)|

+———————————————————————————————————————————————————————————————————-

|外部系统|

| – 出勤系统,ERP/Financial,银行界面,社会保障/Providence Fund局界面|

+———————————————————————————————————————————————————————————————————-

阐明:

工资引擎分别分为一项服务,以促进水平量表,独立部署和排队批次计算。报告使用专用的OLAP或实体视图来避免阻止主库。

四、功能清单(按你要求的点逐项列出)

基本设置薪金项目定义(代码,类型,公式)社会保障/普罗维登斯基金规则配置(公司/个人比率,基础的上限和下限,基本的上限和下限,有效性期)个人税收规则和快速计算表扣除额以及策略版本管理(按策略版本)工资周期和工资循环和付款方式,银行文件模板薪金较高的薪金和一项销售量的销售量和一项销售量的详细信息,进一步的保险,详细信息,销售量,详细信息,销售量,计算量,详细信息,销售额度,详细信息,销售额度,详细信息,计算量,计算,计算,计算量,计算Attendance/performance/overtime, etc. import (Excel/CSV) Batch trigger calculation (simulation/formal) calculation engine Support fixed items, floating items, formula items, deduction items Support monthly and cumulative personal income tax (if required) approval and issuance Support multi-node approval (HR – department – finance) Export bank docking files or call payment interface wage strips and details Generate wage strips PDF, support encryption or签名链接员工可以查看薪水细节,历史委员会和报告。企业工资委员会(总/部门比例/税)个人工资委员会(距12月/详细信息)的许可和审计。 RBAC分层权限。所有操作记录审核日志。

五、业务流程(含流程图)

文本流程图:

降价

1。系统管理员/人力资源配置:工资项目,社会保障规则,个人所得税规则,薪金模板

2。人力资源导入此问题:出勤率,加班,奖金(Excel/接口)

3。HR启动模拟计算(薪金引擎) – 生成仿真结果进行验证

4。人力资源调整异常项目- 启动正式计算- 生成工资批次

5。批准流:人力资源- 部门经理- 财务(可在并行或串行中配置)

6。发行:出口银行文件/对接付款- 标记为付费

7。档案:生成薪资PDF,将其保存到对象存储中并写入salary_lines.payslip_url

8。报告更新:同步到OLAP以显示看板

要点:

支持“模拟计算”和“正式计算”的分离,以避免直接影响财务分布的错误。所有关键操作都编写审核日志(谁触发了何时以及哪些数据以及使用了哪个规则版本)。

六、数据模型设计(核心表结构示例)

以下是核心表的SQL DDL示例(简化版本,建议通过实际业务扩展字段和索引)。使用PostgreSQL样式(可以用MySQL JSON替换JSONB):

SQL

– 员工主数据

创建表员工(

ID BigSerial主钥匙,

emp_no varchar(64)唯一不为空,

名称varchar(128)不为空,

dept_id bigint,

bank_account varchar(64),

Sax_id varchar(64),

Insurance_Base数字(12,2),五项保险和一项资金基础

Special_deductions JSONB, – 特殊的其他扣除详细信息

salary_template_id bigint, – 指向工资模板

create_at timestamp default now(),

更新_at时间戳默认值NOW NOW()

);

– 薪水的定义

创建表salary_items(

ID BigSerial主钥匙,

代码varchar(64)唯一不是null,例如- 基本,perf,加班

名称varchar(128)不为空,

类型varchar(16)不是零, – “收入” |“扣除”

Calc_expr文本,表达式或参考脚本

sort_order int默认0,

create_at timestamp default now now()

);

如何发展人员和OA管理系统的薪酬管理部门? (架构图+代码参考)

– 员工薪金结构(模板/绑定)

创建表employee_salary_struct(

ID BigSerial主钥匙,

emp_id bigint参考员工(id),

salary_item_code varchar(64),

数字(12,2),

is_variable boolean默认错误,

create_at timestamp default now now()

);

– 工资批次

创建表salary_batches(

ID BigSerial主钥匙,

batch_no varchar(128)唯一不为空,

月日期不是零, – 薪水月份

状态VARCHAR(32)默认“草稿”, – 草稿|模拟| Pending_approval |批准|付费

创建_by bigint,

create_at timestamp default now now()

);

– 工资细节

创建表salary_lines(

ID BigSerial主钥匙,

batch_id bigint参考salary_batches(id),

emp_id bigint参考员工(id),

gross_amount数字(12,2),

total_deduction数字(12,2),

net_amount数字(12,2),

详细信息JSONB, – 每个薪水项目的详细信息[{代码,名称,金额}]

paylip_url文本,

状态varchar(32)默认“草稿”,

create_at timestamp default now now()

);

– 审核日志

创建表AUDIT_LOGS(

ID BigSerial主钥匙,

user_id bigint,

Action Varchar(128),

target_type varchar(64),

target_id bigint,

有效载荷JSONB,

create_at timestamp default now now()

);

阐明:

详细信息使用JSONB保存每个薪水项目的详细信息,以方便审核和回溯。可以单独管理配置版本(例如,config_versions),每次计算计算时都会记录应用程序的版本ID。

七、关键功能开发详解与代码参考

以下是Node.js + Express + Sequelize的简化示例(这使您更容易理解实现逻辑,并且实际上可以转换为Java/Spring/.net/.net/Python)。

描述:示例侧重于演示逻辑,省略详细信息,例如错误处理,身份验证中间件等,请完成生产。

1.基础设置:薪资项 CRUD(示例)

JS

//路线/salaryitems.js

const express=require(\’express\’);

const router=express.router();

const {salaryItem}=require(\’./models\’);

router.post(\’/\’,async(req,res)={

const {code,name,type,calc_expr}=req.body;

const item=等待薪资({代码,名称,type,calc_expr});

res.json({Success: True,item});

});

router.get(\’/\’,async(req,res)={

const项目=等待salaryitem.findall({order: [[\’sort_order\’,\’asc\’]]]});

res.json(项目);

});

模块。Exports=路由器;

2.员工薪资结构(示例:维护员工薪资项)

JS

//向指定员工添加固定项目

等待员工allystruct.create({emp_id: 1001,salary_item_code:\’basic\’,量: 8000,is_variable: false});

//更新特殊额外扣除额(JSON)

等待员工。update({propecial_deductions: json.stringify({children_education: 1000})},{withwhere: {id: 1001}}});

3.导入并发起工资计算(Excel 导入)

使用XLSX来解析Excel,并且在解析示例后触发计算过程。

JS

如何发展人员和OA管理系统的薪酬管理部门? (架构图+代码参考)

const xlsx=require(\’xlsx\’);

功能Parseimport(filepath){

const wb=xlsx.ReadFile(filepath);

const表=wb.sheets [wb.sheetnames [0]];

const lows=xlsx.utils.sheet_to_json(Sheet);

//列: emp_no,加班_时,奖金,扣除额

返回行;

}

//表示界面

router.post(\’/import-and-calc\’,async(req,res)={

const {filepath,month}=req.body;

const行=parseimport(filepath);

const batch=等待salarybatch.create({batch_no:` batch-$ {date.now()}`,月份,状态:\’草稿\’,create_by: req.user.id});

//异步触发计算(您可以使用队列)

salaryEngine.calculateBatch(batch.id,行);

res.json({Success: True,batchID: batch.id});

});

4.工资计算引擎(核心逻辑示例)

以下是示例性的工资计算功能(非常关键),显示了如何结合固定项目,进口项目,社会保障,特殊扣除和个人所得税。注意:需要根据当地法律来实施个人所得税计算逻辑,示例是出于演示目的。

JS

//salaryengine.js

const {员工,员工部门,薪金线,salarybatch}=require(\’./models\’);

函数rough2(v){return Math.Round(V*100)/100; }

//简化个人所得税计算(出于演示目的,请勿将其直接用于生产)

功能calcIntivivualTax(应税){

如果(应税=0)返回0;

如果(应税=3000)退税应税* 0.03;

如果(应税=12000)退货应税* 0.1-210;

如果(应税=25000)退税* 0.2-1410;

如果(应税=35000)退税* 0.25-2660;

退货应税* 0.3;

}

异步函数计算雇员(EMP,Importrow,SocialConfig){

让详细信息=[];

令GROSS=0;

//基本工资

const base=等待员工alaryStruct.findone({where: {emp_id: emp.id,salary_item_code:\’basic\’}});

const basic=base? parsefloat(base.amount): 0;

GROSS +=basic; lidess.push({code:\’basic\’,name:\’基本薪金\’,量: basic});

//表现

const perf=(等待applaysalaryStruct.findone({where: {emp_id: emp.id,salary_item_code:\’perf\’}})? 0;

毛+=parsefloat(perf); lidess.push({code:\’perf\’,name:\’performance\’,量: parsefloat(perf)});

//加班计算示例

const overtimeHours=parsefloat(importrow.overtime_hours || 0);

const OvertimePay=OvertimeHours *((BASIC/21.75)/8) * 1.5; //示例公式

GROSS +=OvertimePay; lidess.push({code:\’加班\’,name:\’OvertimePay\’,Munter: round2(OvertimePay)});

//奖金

const -bonus=parsefloat(incortrow.bonus || 0);毛+=奖金; lidess.push({code:\’奖金\’,name:\’奖金\’,金额:奖金});

//社会保障/公积金(个人零件)

const insbase=emp.insurance_base ||基本的;

const退休金=insbase *(socialconfig.pension_person || 0);

const Medical=insbase *(SocialConfig.Medical_Person || 0);

const housing=insbase *(socialconfig.housing_person || 0);

const const tunsurance=round2(养老金+医疗+住房);

lidess.push({code:\’social_person\’,name:\’个人社会保险\’,量: -totalInsurance});

//特殊的其他推论

const Special=parsefloat(emp.special_deductions?total || 0);

如果(特殊)详细信息。

//应税收入:应税=总收入- 个人社会保障- 特殊- 免税(例如免税3500)

const税收=socialconfig.tax_free_quota || 3500;

const应税=总保险- 总保险- 特殊- 免税;

const税=round2(calcindividualtax(应税));

lidess.push({code:\’税\’,name:\’个人所得税\’,金额: -tax});

const net=rount2(总保险- 特殊- 税);

返回{gross_amount: round2(gross),total_deduction: round2(总保险+特别+税),net_amount: net,详细信息};

}

异步函数计算Batch(批处理,Importrows){

const batch=等待salarybatch.findbypk(batchid);

//假设SocialConfig从系统设置中获取它

const socialConfig={Pension_Person: 0.08,Medical_Person: 0.02,Housing_Person: 0.07,税_FREE_QUOTA: 5000};

如何发展人员和OA管理系统的薪酬管理部门? (架构图+代码参考)

对于(Ingortrows的const行){

const emp=等待员工。findone({where: {emp_no: row.emp_no}});

如果(!emp)继续;

const结果=等待计算雇员(EMP,ROW,SOCOADCONFIG);

等待Salaryline.greate({

batch_id: batchid,emp_id: emp.id,gross_amount: result.gross_amount,

total_deduction: result.total_deduction,net_amount: result.net_amount,详细信息: json.stringify(result.details)

});

}

等待batch.update({status:\’simulated\’});

}

Module.exports={calculateBatch,calculate employeeSalary};

要点:

在实际情况下,建议使用队列在批处理(例如RabbitMQ/Bull/Celery)进行处理,以并行计算大量员工。

记录用于每个计算的社会保险和税率配置的版本ID。

5.工资条生成(PDF 示例)

使用PDFKIT简单地生成薪金栏并将其保存到对象存储:

JS

const pdfdocument=require(\’pdfkit\’);

const fs=require(\’fs\’);

函数生成Payspayslip(薪金,畅销){

const doc=new pdfdocument({margin: 40});

doc.pipe(fs.CreateWritestream(Eartpath));

doc.fontsize(16).text(`salaryline.emp_name}`,{align:\’center\’});

doc.movedown();

doc.fontsize(12).text(`月: $ {salaryline.pay_month}`);

doc.text(`部门: $ {salaryline.dept_name}`);

doc.movedown();

doc.text(\’详细信息:\’);

salaryline.details.foreach(it={

const符号=it.amount=0? \’:\’ – \’;

doc.text(`$ {it.name}($

{it.code}): ${it.amount.toFixed(2)}`);

});

doc.moveDown();

doc.text(`实发工资: ${salaryLine.net_amount.toFixed(2)}`, { align: \’right\’ });

doc.end();

}

文件生成后上传 S3,并将 URL 写回 salary_lines.payslip_url,前端通过鉴权链接访问。

在这里我给大家推荐一个业务人员就能够直接上手的高性价比、零代码平台——简道云人事及OA管理系统,简道云背靠国内BI龙头帆软,在数据处理、数据展示上的能力有绝对优势,数据分析支持高度自定义,任何分析需求都可以快速制作仪表盘,人事及OA管理系统实现了组织人事、考勤、绩效、薪酬、招聘等人事核心模块全面线上化、一体化,业务流程效率提升

模版已经整理好了,可以直接下载使用:业务管理模板中心-企业数字化解决方案中心-简道云

六、企业薪酬看板与个人薪酬看板(数据组织与展现)

企业看板关键指标:本月工资总额、公司承担社保、个税合计、部门薪酬占比、薪酬 TOP10、离职入职对比。个人看板关键项:本月实发、税前与税后对比、近 12 月实发趋势、专项扣除明细、工资条下载。

实现建议:

看板数据做预计算任务(批次成功后触发刷新),或定时同步到 OLAP。前端使用 ECharts 绘制趋势与饼图(或团队约定的组件库)。提供导出 CSV 功能给财务对账。

七、员工工资明细(数据流与审计)

数据流追踪:

数据导入/审批/计算 -> 生成 salary_lines(status 可见:simulated -> pending_approval -> approved -> paid)审批操作写 audit_logs(包含操作人、时间、备注)发放后创建 payment_records(银行对账回执)所有历史 salary_lines.details 保持不可覆盖(或保留历史版本),便于回溯

八、开发技巧、性能与安全注意点(落地干货)

规则配置化并版本管理:社保比例、个税速算表、专项扣除规则等放到配置表并做版本号,计算时记录使用的版本,保证历史可追溯。模拟计算 + 正式计算分离:每次批量先做模拟,HR 校验后才正式写入并进入审批与发放。幂等与去重:导入接口用 batch_no 或幂等键防止重复导入导致重复计算/发放。任务队列与分片计算:大企业上万员工一次计算要分批并行处理,用队列(RabbitMQ、Redis-Bull、Celery)并设置合适并发。审计日志不可篡改:每次计算、审批、下载都写审计日志,尤其是工资明细 details 建议不允许直接删除或覆盖(保留历史)。数据分区与报表库:历史明细建议分区表或同步到 OLAP(ClickHouse / BigQuery)以提速看板查询。敏感数据保护:工资数据强鉴权(RBAC)、传输加密(HTTPS)、敏感字段列级加密(银行卡、税号)。工资条下载用临时签名 URL。回滚与补发机制:如果误发,系统应能登记补发/扣回记录并生成对应会计凭证,避免直接改历史记录。并发事务处理:计算写入薪资行时要考虑事务与幂等,避免重复插入或竞态。测试用例覆盖边界:零工资、基数上下限、离职当月、入职当月、多个专项扣除并存、补发/扣回场景都要写自动化测试。

九、测试与上线注意事项

功能测试:每条规则按正反例测试,特别是个税边界、社保上下限与不同城市差异。并发压力测试:一次计算上万条数据的并发与 DB 写入压力,需要在预发布环境压测。UAT(财务+HR):上线前做并行跑月(系统计算与人工计算同时进行 1-2 个月),对账并修正规则。上线回滚方案:若发现批次错误,能快速标记批次为回滚并生成补发/扣回记录,而不是直接修改历史数据。合规审计:记录规则变更日志并保存生效日期,方便审计。

十、实现效果示例(页面/体验描述)

企业看板页面:顶部 KPI(本月薪酬:¥X,社保公司端:¥Y,个税合计:¥Z),下方图表展示部门分布与近 12 月趋势,列表显示未审批批次与异常员工。个人看板页面:展示本月实发、税前税后、近 12 月实发折线,工资条列表可按月份下载 PDF,专项附加扣除明细一目了然。工资计算交互:HR 上传考勤 Excel -> 系统显示解析结果 -> 点击“模拟计算” -> 页面展示异常(如社保基数超限/员工缺银行账号) -> HR 修正 -> 提交审批 -> 财务确认 -> 发放并自动生成银行文件。

十一、FAQ

Q1:工资计算中的“专项附加扣除”怎么设计成既合规又易维护?

专项附加扣除项(比如子女教育、继续教育、住房贷款利息、住房租金、赡养老人等)通常是员工个人提供并需HR/财务备案的。系统设计建议把专项附加扣除做成员工薪资档案中的一个子表或 JSON 字段,包含每项的金额、生效日期、证明文件(附件)以及是否已被财务认可。

实现上把专项扣除的规则独立成配置并有版本号,员工在系统中提交专项扣除申请,HR 审核并上传证明,审核通过后才计入下一次工资计算。同时记录专项扣除的有效期与变更历史,这样既满足合规(有证据链)也便于维护和复核。对税务政策变化,管理员只需更新规则版本,历史批次仍按当时生效规则保留。

Q2:公司跨城市、不同社保政策如何兼容?

跨城市企业面临不同社保基数上下限、不同缴费比例与不同公积金规则。建议把社保/公积金规则抽象为“地区-规则版本”映射:每个地区(城市)维护一套规则配置(个人/公司各险种比例、基数上下限、生效日期),并且规则有版本号。员工档案要记录所属城市/社保登记地与适用规则版本。计算时由 Salary Engine 根据员工所属城市自动读取对应规则并记录使用的规则版本 ID。

若员工跨城市或公司策略调整,HR 修改员工档案并可选择应用新规则或保留旧规则(历史批次不改变)。这种设计既能应对政策差异,又能保留审计链。

Q3:如何保证工资数据安全与权限控制,避免隐私泄露?

工资属于高度敏感数据,必须多层防护。首先在应用层实施严格的 RBAC(基于角色的访问控制):例如 HR 可以查看本单位员工详细薪资,部门经理只能查看下属汇总但不能看到银行卡或税号,员工只能查看自己的明细。

用户评论


我要变勇敢℅℅

这个分享太棒了!一直以来都在想学习开发薪酬管理模块的功能,看到这篇博文介绍详细的架构设计图和代码示例,简直是如虎添翼!感谢作者的详细讲解。

    有12位网友表示赞同!


请在乎我1秒

我以前也尝试过开发类似系统,但总是卡在架构设计上。你的文章提到的组件式设计方式让我眼前一亮,很有启发! 希望能尽快学习你的代码,看看实际应用效果

    有9位网友表示赞同!


久爱不厌

虽然我不是程序员,但对薪酬管理这块还是比较感兴趣的。这篇博文虽然是面向开发者的,但讲解还挺通俗易懂的。希望以后能看到更多关于薪酬管理系统的案例分享!

    有15位网友表示赞同!


寒山远黛

架构图很清晰易懂,代码示例也很简洁易读。不过对于一个新手来说,可能需要更多的步骤解释和注释才能更好地理解代码逻辑,建议作者可以针对不同level开发人员增加一些相应的说明。

    有13位网友表示赞同!


肆忌

这个薪酬管理系统的结构设计确实很巧妙,实现了功能模块的分离和扩展性。希望以后能看到该系统更多更高级的功能,比如自动发放工资、绩效考核等!

    有16位网友表示赞同!


烟雨萌萌

感谢分享这样宝贵的信息!我一直在看类似的文章学习,但没有遇到过像这样具体的架构图和代码示例,真是太有用啦!

    有9位网友表示赞同!


青楼买醉

说句实话,我看不懂这个代码。可能是我的水平有限吧,希望能作者能提供更详细的解释,或者用一些通俗易懂的语言进行说明。

    有7位网友表示赞同!


七级床震

这篇博文解决了我很现实的痛点。我们公司目前采用手工管理薪酬的方式,效率低下,而且容易出错。看到这个系统的自动化功能,感觉很有希望能够解决我们的问题。

    有16位网友表示赞同!


早不爱了

对于一个小型企业来说,开发这样一个复杂的系统成本也许太高了?不知道有没有更适合中小企业的解决方案?

    有19位网友表示赞同!


涐们的幸福像流星丶

你分享的概念很棒,但实际的代码实现可能并不那么简单。需要考虑很多细节因素,比如数据安全、权限控制等问题。希望作者能进一步探讨这些方面。

    有6位网友表示赞同!


没过试用期的爱~

这个架构图是不是有点太依赖于数据库了?如果想确保系统的安全性和可靠性,是否应该使用更安全的存储方式呢?

    有12位网友表示赞同!


孤城暮雨

我很欣赏你的技术分享,但我觉得这篇文章没有明确说明目标用户的范围。是面向初学者、还是经验丰富的开发人员?建议增加一些针对不同用户群体的引导,使文章更加清晰易懂。

    有13位网友表示赞同!


日久见人心

代码示例写的很棒,我很容易就能理解里面的逻辑。但希望作者能提供更详细的测试用例和文档,方便大家更好地理解系统的使用流程和功能细节。

    有7位网友表示赞同!


遗憾最汹涌

这款系统很有潜力,如果能增加一些个性化定制的功能,比如根据不同岗位、部门设置不同的薪酬方案,相信会更加实用和受欢迎!

    有17位网友表示赞同!


不相忘

个人觉得这篇文章还是缺乏了一些实际操作案例的支撑,更直观的案例分享能够让读者更好地理解文章内容。

    有14位网友表示赞同!


看我发功喷飞你

我比较关注系统的数据分析功能。能不能提供一些针对薪酬管理数据分析的功能模块?比如人员分析、趋势预测等。这样可以帮助企业更科学地制定薪酬策略!

    有8位网友表示赞同!


搞搞嗎妹妹

总体来说,这篇文章内容丰富,指导性强。但是对于一些特定的技术细节没有做深入的讲解,希望作者后续能够更新更多的详细内容。

    有15位网友表示赞同!

上一篇
下一篇

为您推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

联系我们

联系我们

0898-88881688

在线咨询: QQ交谈

邮箱: email@zhutibaba.com

工作时间:周一至周五,9:00-17:30,节假日休息
关注微信
微信扫一扫关注我们

微信扫一扫关注我们

手机访问
手机扫一扫打开网站

手机扫一扫打开网站

返回顶部