ruoyi-vue-pro 开发指南 ruoyi-vue-pro 开发指南
  • 萌新必读
  • 后端手册
  • 中间件手册
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • ERP 手册
  • CRM 手册
  • MES 手册
  • WMS 手册
  • IM 即时通讯手册
  • AI 大模型手册
  • IoT 物联网手册
  • 公众号手册
  • 系统手册
  • 运维手册
  • 前端手册 Vue 3.x
  • 前端手册 Vben 5.x
  • 前端手册 Vue 2.x
  • 前端手册 Admin Uniapp
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • ERP 手册
  • CRM 手册
  • MES 手册
  • WMS 手册
  • IM 即时通讯手册
  • AI 大模型手册
  • IoT 物联网手册
  • 公众号手册
  • 系统手册
视频教程
  • Vue3 + element-plus (opens new window)
  • Vue3 + vben5(ant-design-vue、element-plus) (opens new window)
  • Vue2 + element-ui (opens new window)
微服务版 (opens new window)
作者博客 (opens new window)
GitHub (opens new window)
  • 萌新必读
  • 后端手册
  • 中间件手册
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • ERP 手册
  • CRM 手册
  • MES 手册
  • WMS 手册
  • IM 即时通讯手册
  • AI 大模型手册
  • IoT 物联网手册
  • 公众号手册
  • 系统手册
  • 运维手册
  • 前端手册 Vue 3.x
  • 前端手册 Vben 5.x
  • 前端手册 Vue 2.x
  • 前端手册 Admin Uniapp
  • 工作流手册
  • 大屏手册
  • 支付手册
  • 会员手册
  • 商城手册
  • ERP 手册
  • CRM 手册
  • MES 手册
  • WMS 手册
  • IM 即时通讯手册
  • AI 大模型手册
  • IoT 物联网手册
  • 公众号手册
  • 系统手册
视频教程
  • Vue3 + element-plus (opens new window)
  • Vue3 + vben5(ant-design-vue、element-plus) (opens new window)
  • Vue2 + element-ui (opens new window)
微服务版 (opens new window)
作者博客 (opens new window)
GitHub (opens new window)
  • 萌新必读

    • 简介
    • 交流群
    • 视频教程
    • 功能列表
    • 快速启动(后端项目)
    • 快速启动(前端项目)
    • 接口文档
    • 技术选型
    • 项目结构
    • 代码热加载
    • 一键改包
    • 迁移模块(适合新项目)
    • 删除功能(以租户为例)
    • 表结构变更(版本升级)
    • 国产信创数据库(DM 达梦、大金、OpenGauss、瀚高)
    • 如何去除 Redis 缓存
    • 内网穿透
    • 面试题、简历模版、简历优化
    • 项目外包
  • 后端手册

    • 新建模块
    • 代码生成【单表】(新增功能)
    • 代码生成【主子表】
    • 代码生成(树表)
    • 代码生成(移动端)
    • 功能权限
    • 数据权限
    • 用户体系
    • 三方登录
    • OAuth 2.0(SSO 单点登录)
    • SaaS 多租户【字段隔离】
    • SaaS 多租户【数据库隔离】
    • WebSocket 实时通信
    • 异常处理(错误码)
    • 参数校验、时间传参
    • 分页实现
    • VO 对象转换、数据翻译
    • 文件存储(上传下载)
    • Excel 导入导出
    • 操作日志、访问日志、异常日志
    • MyBatis 数据库
    • MyBatis 联表&分页查询
    • 多数据源(读写分离)、事务
    • Redis 缓存
    • 本地缓存
    • 异步任务
    • 分布式锁
    • 幂等性(防重复提交)
    • 请求限流(RateLimiter)
    • HTTP 接口签名(防篡改)
    • HTTP 接口加解密
    • 单元测试
    • 验证码
    • 工具类 Util
    • 配置管理
    • 数据库文档
  • 中间件手册

    • 定时任务
    • 消息队列(内存)
    • 消息队列(Redis)
    • 消息队列(RocketMQ)
    • 消息队列(RabbitMQ)
    • 消息队列(Kafka)
    • 限流熔断
  • 工作流手册

    • 工作流演示
    • 功能开启
    • 工作流(达梦适配)
    • 审批接入(流程表单)
    • 审批接入(业务表单)
    • 流程设计器(BPMN)
    • 流程设计器(钉钉、飞书)
    • 选择审批人、发起人自选
    • 会签、或签、依次审批
    • 流程发起、取消、重新发起
    • 审批通过、不通过、驳回
    • 审批加签、减签
    • 审批转办、委派、抄送
    • 执行监听器、任务监听器
    • 流程表达式
    • 流程审批通知
    • 移动端审批
  • 大屏手册

    • 报表设计器
    • 大屏设计器
  • 支付手册

    • 功能开启
    • 支付宝支付接入
    • 微信公众号支付接入
    • 微信小程序支付接入
    • 支付宝、微信退款接入
    • 支付宝转账接入
    • 微信转账接入
    • 钱包充值、支付、退款
    • 模拟支付、退款
    • 移动端支付管理
  • 会员手册

    • 功能开启
    • 微信公众号登录
    • 微信小程序登录
    • 微信小程序订阅消息
    • 微信小程序码
    • 会员用户、标签、分组
    • 会员等级、积分、签到
    • 移动端会员管理
  • 商城手册

    • 商城演示
    • 功能开启
    • 商城装修
    • 在线客服
    • 【商品】商品分类
    • 【商品】商品属性
    • 【商品】商品 SPU 与 SKU
    • 【商品】商品评价
    • 【交易】购物车
    • 【交易】交易订单
    • 【交易】售后退款
    • 【交易】快递发货
    • 【交易】门店自提
    • 【交易】分销返佣
    • 【营销】优惠劵
    • 【营销】积分商城
    • 【营销】拼团活动
    • 【营销】秒杀活动
    • 【营销】砍价活动
    • 【营销】满减送活动
    • 【营销】限时折扣
    • 【营销】内容管理
    • 【统计】会员、商品、交易统计
    • 移动端商城管理
  • ERP手册

    • ERP 演示
    • 功能开启
    • 【产品】产品信息、分类、单位
    • 【库存】产品库存、库存明细
    • 【库存】其它入库、其它出库
    • 【库存】库存调拨、库存盘点
    • 【采购】采购订单、入库、退货
    • 【销售】销售订单、出库、退货
    • 【财务】采购付款、销售收款
    • 移动端 ERP
  • CRM手册

    • CRM 演示
    • 功能开启
    • 【线索】线索管理
    • 【客户】客户管理、公海客户
    • 【商机】商机管理、商机状态
    • 【合同】合同管理、合同提醒
    • 【回款】回款管理、回款计划
    • 【产品】产品管理、产品分类
    • 【通用】数据权限
    • 【通用】跟进记录、待办事项
    • 移动端 CRM
  • AI大模型手册

    • AI 大模型演示
    • 功能开启
    • AI 聊天对话
    • AI 绘画创作
    • AI 知识库(RAG)
    • AI 音乐创作
    • AI 写作助手
    • AI 思维导图
    • AI 工具(function calling)
    • AI 工作流
    • Dify 工作流
    • FastGPT 工作流
    • Coze 智能体
    • 推理模式(thinking)
    • 联网搜索
    • MCP Client 客户端
    • MCP Server 服务端
    • 【模型接入】Claude
    • 【模型接入】OpenAI
    • 【模型接入】通义千问
    • 【模型接入】DeepSeek
    • 【模型接入】字节豆包
    • 【模型接入】腾讯混元
    • 【模型接入】硅基流动
    • 【模型接入】MiniMax
    • 【模型接入】月之暗面
    • 【模型接入】百川智能
    • 【模型接入】文心一言
    • 【模型接入】LLAMA
    • 【模型接入】智谱 GLM
    • 【模型接入】讯飞星火
    • 【模型接入】微软 OpenAI
    • 【模型接入】谷歌 Gemini
    • 【模型接入】Stable Diffusion
    • 【模型接入】Midjourney
    • 【模型接入】Suno
    • 【模型接入】Grok
    • 【模型接入】阶跃星辰
    • 移动端 AI 大模型
  • IoT物联网手册

    • 功能开启
    • 产品管理
    • 设备管理
    • 物模型配置
    • 设备网关与子设备
    • 设备动态注册
    • 设备接入(概述)
    • 设备接入(HTTP 协议)
    • 设备接入(MQTT 协议)
    • 设备接入(EMQX 协议)
    • 设备接入(TCP 协议)
    • 设备接入(UDP 协议)
    • 设备接入(WebSocket 协议)
    • 设备接入(CoAP 协议)
    • 设备接入(Modbus Client 模式)
    • 设备接入(Modbus Server 模式)
    • 设备接入(自定义协议)
    • 场景联动
    • 数据流转
    • 告警配置
    • OTA 固件升级
    • 移动端 IoT 物联网
  • MES手册

    • MES 演示
    • 功能开启
    • 【基础】物料产品、分类、计量单位
    • 【基础】客户管理、供应商管理
    • 【基础】车间设置、工作站设置
    • 【基础】编码规则
    • 【生产】工序设置、工艺流程
    • 【生产】生产工单
    • 【生产】生产排产、工序流转卡
    • 【生产】生产报工
    • 【生产】安灯配置、安灯呼叫
    • 【生产】工作记录
    • 【仓库】仓库与库区库位、条码赋码、SN码
    • 【仓库】批次管理、库存现有量、库存事务
    • 【仓库】到货通知、采购入库、采购退货
    • 【仓库】生产领料、生产退料、物料消耗
    • 【仓库】产品产出、产品入库
    • 【仓库】发货通知、销售出库、销售退货
    • 【仓库】外协发料、外协入库
    • 【仓库】其他入库、其他出库
    • 【仓库】调拨单、装箱管理
    • 【仓库】库存盘点
    • 【质量】检测项设置、常见缺陷
    • 【质量】质检方案
    • 【质量】来料检验(IQC)
    • 【质量】过程检验(IPQC)
    • 【质量】出货检验(OQC)
    • 【质量】退货检验(RQC)
    • 【质量】待检任务、检验结果、缺陷记录
    • 【设备】设备类型、设备台账
    • 【设备】点检保养项目、点检保养方案
    • 【设备】点检记录、保养记录、维修单
    • 【工具】工具类型、工装夹具台账
    • 【排班】班组设置、节假日设置
    • 【排班】排班计划、排班日历
    • 移动端 MES
  • WMS手册

    • WMS 演示
    • 功能开启
    • 【基础】仓库
    • 【基础】商品、SKU、分类、品牌
    • 【基础】往来企业(供应商、客户)
    • 【库存】库存记录、流水、统计
    • 【单据】入库
    • 【单据】出库
    • 【单据】移库
    • 【单据】盘库
    • 【其它】WMS、MES、ERP 对比
    • 移动端 WMS
  • HRM人力资源

    • HRM 演示
    • 功能开启
    • 【组织】工作台、组织架构
    • 【员工】员工管理
    • 【招聘】招聘管理
    • 【考勤】考勤管理
    • 【社保】社保管理
    • 【薪资】薪资管理
      • 1. 计薪设置
        • 1.1 表结构
        • 1.2 管理后台
      • 2. 薪资档案与调薪
        • 2.1 表结构
        • 2.2 管理后台
      • 3. 月度工资
        • 3.1 表结构
        • 3.2 管理后台
      • 4. 工资条
        • 4.1 表结构
        • 4.2 管理后台
        • 4.3 员工端
      • 5. 与其它模块的衔接
    • 【绩效】绩效模板、绩效计划
    • 【绩效】绩效考核、绩效档案
  • IM即时通讯手册

    • IM 演示
    • 功能开启
    • 【好友】好友关系、好友申请
    • 【群聊】群组、群成员、入群申请
    • 【消息】私聊、群聊、频道消息
    • 【频道】频道、频道素材
    • 【内容】表情、敏感词
    • 【通话】语音通话、视频通话、共享屏幕
    • 【WebSocket】实时推送与离线消息
    • 移动端 IM 即时通讯
  • 公众号手册

    • 功能开启
    • 公众号接入
    • 公众号粉丝
    • 公众号标签
    • 公众号消息
    • 模版消息
    • 自动回复
    • 公众号菜单
    • 公众号素材
    • 公众号图文
    • 公众号统计
    • 移动端公众号管理
  • 系统手册

    • 短信配置
    • 邮件配置
    • 站内信配置
    • Webhook(钉钉、飞书、企微)
    • 数据脱敏、字段权限
    • 敏感词
    • 地区 & IP 库
  • 运维手册

    • 开发环境
    • Linux 部署
    • Docker 部署
    • Jenkins 部署
    • 宝塔部署
    • 1Panel 部署
    • HTTPS 证书
    • 服务监控
    • Tomcat WAR 部署
  • 前端手册 Vue 3.x

    • 开发规范
    • 菜单路由
    • Icon 图标
    • 字典数据
    • 系统组件
    • 通用方法
    • 配置读取
    • CRUD 组件
    • 国际化
    • IDE 调试
    • 代码格式化
  • 前端手册 Vben 5.x

    • 开发规范
    • 菜单路由
    • 图标、主题、国际化
    • 字典数据
    • 系统组件
    • 通用方法
    • 配置读取
    • IDE 调试
    • 代码格式化
  • 前端手册 Vue 2.x

    • 开发规范
    • 菜单路由
    • Icon 图标
    • 字典数据
    • 系统组件
    • 通用方法
    • 配置读取
  • 前端手册 Admin Uniapp

    • 开发规范
    • 菜单路由
    • 图标、主题、国际化
    • 字典数据
    • 系统组件
    • 通用方法
    • IDE 调试
    • 代码格式化
    • 运行发布
  • 更新日志

    • 【v2026-07】
    • 【v2026-06】
    • 【v2026-05】
    • 【v2026-04】
    • 【v2026-03】
    • 【v2026-01】
    • 【v2025-12】
    • 【v2025-11】
    • 【v2025-10】
    • 【v2025-09】
    • 【v2025-08】
    • 【v2-6-1】2025-07-19
    • 【v2-6-0】2025-06-07
    • 【v2.5.0】2025-05-13
    • 【v2.4.2】2025-04-12
    • 【v2.4.1】2025-02-09
    • 【v2.4.0】2024-12-31
    • 【v2.3.0】2024-10-07
    • 【v2.2.0】2024-08-02
    • 【v2.1.0】2024-05-05
    • 【v2.0.1】2024-03-01
    • 【v2.0.0】2024-01-26
  • 开发指南
  • HRM人力资源
芋道源码
2026-08-02
目录

【薪资】薪资管理

薪资管理用于完成计薪规则配置、员工定薪调薪、月度工资核算和工资条发放。管理端负责配置与核算,员工端只查看发给本人的工资条。

模块由 yudao-module-hrm 的 salary 包实现,管理端页面位于 @/views/hrm/salary,员工端页面位于 @/views/hrm/portal/salary。相关表关系如下:

薪资模块表关系

# 1. 计薪设置

计薪周期由 HrmSalaryConfigController 提供接口;计税规则、薪资组、工资项和调薪模板分别由 HrmSalaryTaxRuleController、HrmSalaryGroupController、HrmSalaryOptionController、HrmSalaryChangeTemplateController 提供接口。首次初始化计薪周期时,系统会同时创建第一张“未核算”的月度工资表。

# 1.1 表结构

省略 creator/create_time/updater/update_time/deleted/tenant_id 等通用字段,下同。需要说明唯一约束时保留 tenant_id;JSON 字段由 TypeHandler 完成对象转换。

CREATE TABLE `hrm_salary_config` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `cycle_start_day` int DEFAULT NULL COMMENT '计薪周期开始日',
  `cycle_end_day` int DEFAULT NULL COMMENT '计薪周期结束日',
  `social_security_month_type` tinyint DEFAULT NULL COMMENT '社保对应月份',
  `start_year` int DEFAULT NULL COMMENT '起始年份',
  `start_month` int DEFAULT NULL COMMENT '起始月份',
  `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_hrm_salary_config_tenant_id` (`tenant_id`)
) COMMENT='HRM 薪资配置';

tenant_id 唯一,因此每个租户只能初始化一套计薪周期。开始日为 1 时结束日保存为 31,否则结束日为“开始日减 1”;初始化后只能调整社保对应月份。

hrm_salary_tax_rule 表结构
CREATE TABLE `hrm_salary_tax_rule` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(64) NOT NULL COMMENT '计税规则名称',
  `type` tinyint DEFAULT NULL COMMENT '计税类型',
  `tax_enabled` bit DEFAULT NULL COMMENT '是否计税',
  `threshold` decimal(12,2) DEFAULT NULL COMMENT '起征阈值',
  `decimal_scale` int DEFAULT NULL COMMENT '保留小数位数',
  `cycle_type` tinyint DEFAULT NULL COMMENT '计税周期类型',
  PRIMARY KEY (`id`)
) COMMENT='HRM 计税规则';

tax_enabled = 0 时不计算个税;启用后,threshold、decimal_scale 和 cycle_type 决定计税起点、精度和按月/累计周期。薪资组通过 tax_rule_id 选用规则。

hrm_salary_group 表结构
CREATE TABLE `hrm_salary_group` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(64) NOT NULL COMMENT '薪资组名称',
  `salary_standard` decimal(12,2) DEFAULT NULL COMMENT '月计薪标准天数',
  `change_rule` varchar(255) DEFAULT NULL COMMENT '转正、调薪月计算规则',
  `dept_ids` varchar(20000) DEFAULT NULL COMMENT '适用部门编号 JSON',
  `employee_ids` varchar(20000) DEFAULT NULL COMMENT '适用员工编号 JSON',
  `tax_rule_id` bigint DEFAULT NULL COMMENT '计税规则编号',
  PRIMARY KEY (`id`)
) COMMENT='HRM 薪资组';

dept_ids 关联 system_dept.id,employee_ids 关联 hrm_employee.id,tax_rule_id 关联 hrm_salary_tax_rule.id。员工先按 employee_ids 精确匹配,再按所在部门及父部门匹配;未命中薪资组的员工不能参与月度核算。

hrm_salary_option_template 表结构
CREATE TABLE `hrm_salary_option_template` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `code` int NOT NULL COMMENT '标准工资项编码',
  `parent_code` int NOT NULL DEFAULT 0 COMMENT '父工资项编码',
  `name` varchar(64) NOT NULL COMMENT '工资项名称',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `system_flag` bit NOT NULL DEFAULT 0 COMMENT '是否系统默认项',
  `type` tinyint NOT NULL DEFAULT 1 COMMENT '工资项类型',
  `tax_enabled` bit NOT NULL DEFAULT 1 COMMENT '是否计税',
  `visible` bit NOT NULL DEFAULT 1 COMMENT '是否显示',
  `calculate_enabled` bit NOT NULL DEFAULT 1 COMMENT '是否参与计算',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_hrm_salary_option_template_code` (`code`)
) COMMENT='HRM 标准工资项目录';

标准目录不带 tenant_id,由平台统一维护;code 全局唯一,parent_code 指向同表 code,用于组织工资项树。租户通过“同步标准项”复制或补齐自己的工资项。

hrm_salary_option 表结构
CREATE TABLE `hrm_salary_option` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `code` int NOT NULL COMMENT '工资项编码',
  `parent_code` int NOT NULL DEFAULT 0 COMMENT '父工资项编码',
  `name` varchar(64) NOT NULL COMMENT '工资项名称',
  `remark` varchar(255) DEFAULT NULL COMMENT '备注',
  `system_flag` bit NOT NULL DEFAULT 0 COMMENT '是否系统默认项',
  `template_id` bigint DEFAULT NULL COMMENT '标准工资项目录编号',
  `type` tinyint NOT NULL DEFAULT 1 COMMENT '工资项类型',
  `tax_enabled` bit NOT NULL DEFAULT 1 COMMENT '是否计税',
  `visible` bit NOT NULL DEFAULT 1 COMMENT '是否显示',
  `calculate_enabled` bit NOT NULL DEFAULT 1 COMMENT '是否参与计算',
  `enabled` bit NOT NULL DEFAULT 1 COMMENT '是否启用',
  `tenant_id` bigint NOT NULL DEFAULT 0 COMMENT '租户编号',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_hrm_salary_option_tenant_code` (`tenant_id`, `code`)
) COMMENT='HRM 租户工资项';

template_id 关联 hrm_salary_option_template.id;tenant_id + code 唯一,parent_code 指向同租户的父项编码。工资项分为加项、减项和计算项;enabled 控制企业是否使用,visible 控制工资表和工资条是否展示,calculate_enabled 控制是否参与汇总计算。

hrm_salary_change_template 表结构
CREATE TABLE `hrm_salary_change_template` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(64) NOT NULL COMMENT '调薪模板名称',
  `default_status` bit NOT NULL DEFAULT 0 COMMENT '是否默认模板',
  `options` varchar(4000) DEFAULT NULL COMMENT '可调整工资项 JSON',
  PRIMARY KEY (`id`)
) COMMENT='HRM 调薪模板';

options 保存工资项的 code 与名称快照,用于限定定薪、调薪表单可编辑的项目。同一租户只有一条默认模板;默认模板可以修改,也可以把其它模板设为默认,但当前默认模板不能删除。

# 1.2 管理后台

对应 [HRM 人力资源 -> 薪资管理 -> 计薪设置] 菜单。

# 初始化 / 修改计薪周期

@/views/hrm/salary/config/config/index.vue 通过 HrmSalaryConfigController 的 GET /hrm/salary/config/get 读取配置。首次进入时填写计薪周期开始日、工资起始年月和社保对应月份,调用 POST /hrm/salary/config/create;系统保存配置并创建首张月度工资表。

管理后台 - 计薪设置

初始化后,开始日、结束日和起始年月只读,只允许修改社保对应月份,保存调用 PUT /hrm/salary/config/update。

# 计税规则

计税规则列表由 @/views/hrm/salary/config/tax-rule/index.vue 实现,调用 HrmSalaryTaxRuleController 的 GET /hrm/salary/tax-rule/list,并展示被薪资组使用的数量。新增、修改由 SalaryTaxRuleForm.vue 完成,分别调用 POST /hrm/salary/tax-rule/create、PUT /hrm/salary/tax-rule/update;删除调用 DELETE /hrm/salary/tax-rule/delete,已被薪资组引用时后端会拒绝。

# 薪资组

薪资组列表由 @/views/hrm/salary/config/group/index.vue 实现,调用 HrmSalaryGroupController 的 GET /hrm/salary/group/page。新增、修改打开 SalaryGroupForm.vue,配置月计薪标准、转正/调薪月规则、计税规则和适用部门/员工,分别调用 POST /hrm/salary/group/create、PUT /hrm/salary/group/update;删除调用 DELETE /hrm/salary/group/delete。

保存适用范围时,后端会处理不同薪资组之间重复的部门和员工;核算前的准备检查会列出仍未命中任何薪资组的员工。

# 工资项

工资项页面由 @/views/hrm/salary/config/option/index.vue 实现,调用 HrmSalaryOptionController 的 GET /hrm/salary/option/list,按“企业工资项”和“系统工资项”两个页签展示工资项树。

企业页签可调用 PUT /hrm/salary/option/sync 同步标准目录,也可通过 SalaryOptionForm.vue 和 POST /hrm/salary/option/create 新增自定义项。标准项删除等同停用,自定义项才会逻辑删除;启停调用 PUT /hrm/salary/option/update-enabled。系统页签通过 PUT /hrm/salary/option/update-visible 控制预置项是否展示。

# 调薪模板

调薪模板列表由 @/views/hrm/salary/config/change-template/index.vue 实现,调用 HrmSalaryChangeTemplateController 的 GET /hrm/salary/change-template/list。新增、修改打开 SalaryChangeTemplateForm.vue 选择可调整工资项,分别调用 POST /hrm/salary/change-template/create、PUT /hrm/salary/change-template/update;非默认模板可调用 DELETE /hrm/salary/change-template/delete 删除。

# 2. 薪资档案与调薪

员工当前薪资由 HrmSalaryEmployeeInfoController 提供接口,定薪、调薪和未来变更记录由 HrmSalaryChangeRecordController 提供查询、取消和删除接口。两表的 employee_id 都关联 hrm_employee.id,不直接关联后台账号。

# 2.1 表结构

CREATE TABLE `hrm_salary_employee_info` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `employee_id` bigint NOT NULL COMMENT '员工编号',
  `change_reason` tinyint DEFAULT NULL COMMENT '变更原因',
  `effect_time` datetime DEFAULT NULL COMMENT '生效时间',
  `change_type` tinyint DEFAULT NULL COMMENT '变更类型',
  `probation_salary` decimal(12,2) DEFAULT NULL COMMENT '试用期工资',
  `regular_salary` decimal(12,2) DEFAULT NULL COMMENT '正式工资',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `salary_options` varchar(20000) DEFAULT NULL COMMENT '正式工资项快照 JSON',
  `probation_salary_options` varchar(20000) DEFAULT NULL COMMENT '试用期工资项快照 JSON',
  PRIMARY KEY (`id`),
  UNIQUE KEY `uk_hrm_salary_employee_info_employee_id` (`employee_id`)
) COMMENT='HRM 员工薪资档案';

① employee_id 唯一,每名员工只有一份当前有效薪资档案;历史和未来薪资保存在 hrm_salary_change_record。

② salary_options、probation_salary_options 是工资项 JSON 快照。后续修改工资项不会回写已生效的薪资记录。

hrm_salary_change_record 表结构
CREATE TABLE `hrm_salary_change_record` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `employee_id` bigint NOT NULL COMMENT '员工编号',
  `type` tinyint DEFAULT NULL COMMENT '记录类型',
  `reason` tinyint DEFAULT NULL COMMENT '调整原因',
  `effect_time` datetime DEFAULT NULL COMMENT '生效时间',
  `before_total` decimal(12,2) DEFAULT NULL COMMENT '调整前正式薪资',
  `after_total` decimal(12,2) DEFAULT NULL COMMENT '调整后正式薪资',
  `probation_before_total` decimal(12,2) DEFAULT NULL COMMENT '调整前试用期薪资',
  `probation_after_total` decimal(12,2) DEFAULT NULL COMMENT '调整后试用期薪资',
  `salary_options` varchar(4000) DEFAULT NULL COMMENT '正式工资项后态快照 JSON',
  `probation_salary_options` varchar(4000) DEFAULT NULL COMMENT '试用期工资项后态快照 JSON',
  `status` tinyint DEFAULT NULL COMMENT '状态:0 待生效、1 已生效、2 已取消',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  PRIMARY KEY (`id`)
) COMMENT='HRM 定薪调薪记录';

employee_id 关联员工;前后总额便于展示变动,两个工资项字段保存变更后的明细。未来生效的记录先保持待生效,定时任务到期后更新 hrm_salary_employee_info;同一员工同时只允许一条待生效记录。

调薪状态

立即生效:创建 ──→ 已生效(1) ──→ 更新员工当前薪资

未来生效:创建 ──→ 待生效(0) ──定时任务──→ 已生效(1)
                         │
                         └──取消──→ 已取消(2)

已生效记录不可删除;待生效记录可取消,取消后可删除。

# 2.2 管理后台

对应 [HRM 人力资源 -> 薪资管理 -> 薪资档案] 菜单。

# 列表

列表由 @/views/hrm/salary/employee-info/index.vue 实现,通过 HrmSalaryEmployeeInfoController 的 GET /hrm/salary/employee-info/page 查询员工,可按姓名、工号、部门、岗位和在职状态筛选。状态页签数量由 GET /hrm/salary/employee-info/status-count 返回;未建立档案的员工显示“定薪”,已有档案的员工显示“调薪”。

管理后台 - 薪资档案

# 定薪 / 调薪

点击“定薪”或“调薪”打开 SalaryEmployeeInfoForm.vue。表单先调用 GET /hrm/salary/employee-info/get 读取当前档案,并按调薪模板填写正式、试用期工资项、生效时间、原因和备注;后端允许的最早生效日期由 GET /hrm/salary/employee-info/get-adjustment-min-effect-date 返回。

保存统一调用 PUT /hrm/salary/employee-info/update。生效时间为今天或过去时立即更新当前档案;未来日期只创建待生效记录,等 HrmSalaryChangeJob 到期处理。

# 批量调薪

选择多名员工后打开 SalaryEmployeeInfoBatchForm.vue,统一设置调薪项、方式、生效时间和原因,调用 PUT /hrm/salary/employee-info/update-list。批量处理中,立即生效的记录同步更新当前档案,未来记录保持待生效;接口返回每名员工的成功或失败原因。

# Excel 导入

SalaryEmployeeInfoImportForm.vue 支持“固定工资导入”和“调薪导入”。页面分别从 GET /hrm/salary/employee-info/get-fix-import-template、GET /hrm/salary/employee-info/get-change-import-template 下载模板,再把 .xls 或 .xlsx 文件提交到 POST /hrm/salary/employee-info/import-fix、POST /hrm/salary/employee-info/import-change。完成后展示成功数和逐行失败原因,并刷新列表。

# 薪资详情与变更记录

点击员工姓名进入 @/views/hrm/salary/employee-info/detail/index.vue。SalaryEmployeeInfoDetails.vue 展示当前正式、试用期工资和工资项;SalaryChangeRecordList.vue 调用 HrmSalaryChangeRecordController 的 GET /hrm/salary/change-record/list 展示全部定薪、调薪记录。

待生效记录可调用 PUT /hrm/salary/change-record/cancel 取消;待生效或已取消记录可调用 DELETE /hrm/salary/change-record/delete 删除,已生效记录只读。

# 3. 月度工资

月表由 HrmSalaryMonthRecordController 提供接口,员工明细由 HrmSalaryMonthEmployeeRecordController 提供接口。核算时读取计薪周期内有效的员工薪资,并可同步社保、同步或导入考勤,以及导入累计个税和专项附加扣除。

# 3.1 表结构

CREATE TABLE `hrm_salary_month_record` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `title` varchar(128) DEFAULT NULL COMMENT '工资表标题',
  `year` int NOT NULL COMMENT '年份',
  `month` int NOT NULL COMMENT '月份',
  `employee_count` int DEFAULT NULL COMMENT '员工人数',
  `start_time` datetime DEFAULT NULL COMMENT '计薪开始时间',
  `end_time` datetime DEFAULT NULL COMMENT '计薪结束时间',
  `expected_pay_salary` decimal(12,2) DEFAULT NULL COMMENT '应发工资',
  `personal_tax` decimal(12,2) DEFAULT NULL COMMENT '个人所得税',
  `real_pay_salary` decimal(12,2) DEFAULT NULL COMMENT '实发工资',
  `personal_insurance_amount` decimal(12,2) DEFAULT NULL COMMENT '个人社保',
  `personal_provident_fund_amount` decimal(12,2) DEFAULT NULL COMMENT '个人公积金',
  `corporate_insurance_amount` decimal(12,2) DEFAULT NULL COMMENT '企业社保',
  `corporate_provident_fund_amount` decimal(12,2) DEFAULT NULL COMMENT '企业公积金',
  `option_headers` varchar(20000) DEFAULT NULL COMMENT '工资项表头快照 JSON',
  `status` tinyint DEFAULT NULL COMMENT '状态:5 未核算、11 已核算、10 已归档',
  PRIMARY KEY (`id`)
) COMMENT='HRM 月度工资表';

option_headers 保存本月工资项树。之后修改计薪设置不会改写已创建工资表的表头快照。

hrm_salary_month_employee_record 表结构
CREATE TABLE `hrm_salary_month_employee_record` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `month_record_id` bigint NOT NULL COMMENT '月度工资表编号',
  `employee_id` bigint NOT NULL COMMENT '员工编号',
  `actual_work_day` decimal(10,2) DEFAULT NULL COMMENT '实际工作天数',
  `need_work_day` decimal(10,2) DEFAULT NULL COMMENT '应工作天数',
  `year` int NOT NULL COMMENT '年份',
  `month` int NOT NULL COMMENT '月份',
  `expected_pay_salary` decimal(12,2) DEFAULT NULL COMMENT '应发工资',
  `taxable_salary` decimal(12,2) DEFAULT NULL COMMENT '应税工资',
  `personal_tax` decimal(12,2) DEFAULT NULL COMMENT '个人所得税',
  `real_pay_salary` decimal(12,2) DEFAULT NULL COMMENT '实发工资',
  `option_values` varchar(20000) DEFAULT NULL COMMENT '员工工资项值快照 JSON',
  PRIMARY KEY (`id`)
) COMMENT='HRM 员工月度工资记录';

month_record_id 关联 hrm_salary_month_record.id,employee_id 关联员工;冗余 year/month 用于员工历史查询和工资条生成。option_values 与月表的 option_headers 按工资项 code 对齐,保存当月每个项目的金额快照。

① 月工资状态为:5 未核算、11 已核算、10 已归档。已核算月份仍可在线调整或重新核算,生成下月后才归档。

② 只能删除最新且未归档的工资表,并至少保留一张;删除后上一月恢复为当前可编辑状态。

月度工资状态

未核算(5) ──核算/重新核算──→ 已核算(11) ──生成下月──→ 已归档(10)

# 3.2 管理后台

对应 [HRM 人力资源 -> 薪资管理 -> 月度工资表] 菜单。

# 当前工资表

@/views/hrm/salary/month-record/index.vue 通过 HrmSalaryMonthRecordController 的 GET /hrm/salary/month-record/last 读取当前工资表,通过 HrmSalaryMonthEmployeeRecordController 的 GET /hrm/salary/month-employee-record/page 查询员工明细。列表可按员工、工号和部门筛选,并以“计薪人数、新入职、离职、转正、调岗”页签查看本月人员变化。

SalaryPayrollReadinessAlert.vue 调用 GET /hrm/salary/month-record/payroll-readiness 检查核算准备:未命中薪资组的员工会阻止核算;没有当前薪资档案时优先沿用上月工资,仍无数据则按 0 处理。

管理后台 - 月度工资

# 在线编辑

未归档月份可点击“在线编辑”打开 SalaryBatchEmployeeRecordForm.vue。表单只允许修改本月可计算的叶子工资项和计薪天数,保存调用 PUT /hrm/salary/month-employee-record/update-list,随后重新汇总主表金额。

# 核算 / 重新核算

点击“核算工资”打开 SalaryMonthComputeForm.vue。可选择是否同步社保,并选择直接同步考勤或上传考勤文件;累计个税和专项附加扣除也可以上传。页面从 HrmSalaryMonthRecordController 下载三类导入模板。

管理后台 - 核算工资表

当前页面无论是否上传文件,都以 multipart 调用 POST /hrm/salary/month-record/compute-import;未上传的文件字段保持为空。核算会重新生成员工工资项、应发、应税、个税和实发汇总,工资表状态变为已核算。

# 创建下月 / 删除

点击“创建下月工资表”并确认,调用 POST /hrm/salary/month-record/create-next:当前月归档并变为只读,系统按计薪周期创建下一月。最新未归档工资表可调用 DELETE /hrm/salary/month-record/delete 删除,删除后上一月恢复为当前月。

# 历史工资表

历史列表由 @/views/hrm/salary/month-record/history/index.vue 实现,通过 GET /hrm/salary/month-record/page 按年份查询已归档月份。点击月份进入 @/views/hrm/salary/month-record/detail/index.vue,通过 GET /hrm/salary/month-record/get 和员工明细接口查看只读工资表。

# 4. 工资条

工资条由 HrmSalarySlipTemplateController、HrmSalarySlipSendRecordController 和 HrmSalarySlipController 提供接口,按“模板 → 发放批次 → 员工工资条”三级保存。模板决定展示分类和工资项;每次发放创建一个批次,并为选中员工生成独立快照。

# 4.1 表结构

hrm_salary_slip_template 表结构
CREATE TABLE `hrm_salary_slip_template` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `name` varchar(64) NOT NULL COMMENT '工资条模板名称',
  `hide_empty` bit NOT NULL DEFAULT 0 COMMENT '是否隐藏空项',
  `default_status` bit NOT NULL DEFAULT 0 COMMENT '是否默认模板',
  `options` varchar(20000) NOT NULL COMMENT '工资条模板项 JSON',
  PRIMARY KEY (`id`)
) COMMENT='HRM 工资条模板';

options 以树形 JSON 保存分类、工资项编码、名称、说明、隐藏状态和排序。默认模板作为兜底模板,管理端不能修改或删除。

hrm_salary_slip_send_record 表结构
CREATE TABLE `hrm_salary_slip_send_record` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `month_record_id` bigint NOT NULL COMMENT '月度工资表编号',
  `employee_count` int DEFAULT NULL COMMENT '工资表总人数',
  `send_employee_count` int DEFAULT NULL COMMENT '本批次发放人数',
  `year` int NOT NULL COMMENT '年份',
  `month` int NOT NULL COMMENT '月份',
  PRIMARY KEY (`id`)
) COMMENT='HRM 工资条发放记录';

month_record_id 关联 hrm_salary_month_record.id。同一月度工资表可以分多批次发放,因此发放记录保持独立,并冗余年月和人数供列表展示。

hrm_salary_slip 表结构
CREATE TABLE `hrm_salary_slip` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '编号',
  `send_record_id` bigint NOT NULL COMMENT '发放批次编号',
  `month_employee_record_id` bigint NOT NULL COMMENT '员工月工资编号',
  `employee_id` bigint NOT NULL COMMENT '员工编号',
  `year` int NOT NULL COMMENT '年份',
  `month` int NOT NULL COMMENT '月份',
  `read_status` tinyint DEFAULT NULL COMMENT '阅读状态',
  `real_pay_salary` decimal(12,2) DEFAULT NULL COMMENT '实发工资',
  `remark` varchar(500) DEFAULT NULL COMMENT '备注',
  `options` varchar(20000) NOT NULL COMMENT '工资条内容快照 JSON',
  PRIMARY KEY (`id`)
) COMMENT='HRM 员工工资条';

① send_record_id 关联发放批次,month_employee_record_id 关联员工月工资,employee_id 关联员工。删除发放批次会同时删除本批次工资条,之后才可重新发放。

② options 是发放时快照,月工资后续重新核算不会改写已经发出的工资条。

③ 同一员工、同一年月只保留一张有效工资条。指定员工发放时,未绑定后台账号会导致请求失败;按筛选结果全部发放时,系统会过滤未绑定账号的员工。

# 4.2 管理后台

对应 [HRM 人力资源 -> 薪资管理 -> 发放记录] 菜单。

# 发放工资条

已核算工资表点击“发送工资条”打开 @/views/hrm/salary/slip/send-record/SalarySlipSendForm.vue。第一步调用 HrmSalarySlipTemplateController 的 GET /hrm/salary/slip-template/list 选择模板,可调整隐藏空项、项目顺序和展示内容,并可另存为模板。

第二步调用 HrmSalarySlipSendRecordController 的 GET /hrm/salary/slip-send-record/employee-page,按员工姓名、部门和已发/未发状态筛选。可以勾选员工发放,也可以按当前筛选条件全部发放;提交调用 POST /hrm/salary/slip-send-record/create,一次生成发放批次及员工工资条快照。

管理后台 - 工资条发放

# 维护工资条模板

发放弹窗中的“新增模板”“编辑模板”打开 @/views/hrm/salary/slip/template/SalarySlipTemplateForm.vue,内部使用 SalarySlipTemplateOptionEditor.vue 编排分类和工资项,分别调用 POST /hrm/salary/slip-template/create、PUT /hrm/salary/slip-template/update。非默认模板可调用 DELETE /hrm/salary/slip-template/delete 删除。

# 发放记录

批次列表由 @/views/hrm/salary/slip/send-record/index.vue 实现,通过 GET /hrm/salary/slip-send-record/page 按年月查询发放记录。点击批次进入 @/views/hrm/salary/slip/send-record/detail/index.vue,调用 GET /hrm/salary/slip-send-record/get 展示批次汇总。

# 工资条详情与备注

批次详情中的 SalarySlipList.vue 调用 HrmSalarySlipController 的 GET /hrm/salary/slip/page,可按员工、部门、阅读状态和备注筛选。点击员工打开 SalarySlipDetail.vue,通过 GET /hrm/salary/slip/get 查看工资条快照;单条或批量设置、清空备注时调用 PUT /hrm/salary/slip/remark。

# 删除发放记录

确认后调用 DELETE /hrm/salary/slip-send-record/delete。系统同时逻辑删除该批次的员工工资条,因此这些员工会重新出现在对应月份的“未发送”筛选中,可再次发放。

# 4.3 员工端

员工端由 HrmPortalSalarySlipController 提供接口,根据当前 system_users.id 反查 hrm_employee.user_id,只返回本人工资条。

对应 [HRM 人力资源 -> HRM 员工端 -> 我的工资条] 菜单。

# 查询工资条

页面由 @/views/hrm/portal/salary/slip/index.vue 实现,通过 GET /hrm/portal/salary/slip/list 按月份范围和排序方式查询本人历史工资条,展开后查看发放时保存的工资项和实发金额快照。

员工端 - 我的工资条

# 标记已读

页面通过 GET /hrm/portal/salary/slip/unread-summary 获取未读汇总。加载工资条后,把本次返回的未读记录调用 PUT /hrm/portal/salary/slip/read 标记为已读,管理端的阅读状态随之更新。

# 5. 与其它模块的衔接

  • 员工:定薪、调薪和工资条都以 hrm_employee.id 为业务关联;只有员工端访问和工资条通知需要绑定后台账号。
  • 考勤:月度核算可读取实时考勤统计,也可通过 Excel 导入考勤结果。
  • 社保:按计薪配置选择上月、当月或次月的社保月度记录,并同步个人/企业社保与公积金。
  • 绩效:已归档绩效可按计薪月份提供绩效系数;当前系数作为衔接数据返回,不会自动乘入工资项。
【社保】社保管理
【绩效】绩效模板、绩效计划

← 【社保】社保管理 【绩效】绩效模板、绩效计划→

Theme by Vdoing | Copyright © 2019-2026 芋道源码 | MIT License
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式
×