【薪资】薪资管理
薪资管理用于完成计薪规则配置、员工定薪调薪、月度工资核算和工资条发放。管理端负责配置与核算,员工端只查看发给本人的工资条。
模块由 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 导入考勤结果。
- 社保:按计薪配置选择上月、当月或次月的社保月度记录,并同步个人/企业社保与公积金。
- 绩效:已归档绩效可按计薪月份提供绩效系数;当前系数作为衔接数据返回,不会自动乘入工资项。