薪酬核算模块新增请假扣款功能,并实现薪酬核算到薪资发放的自动流转。
请求: GET /admin-api/hrm/leave-type-config/list
响应:json { "code": 0, "data": [ { "id": 1, "leaveType": 1, "name": "事假", "deductionRatio": 1.0000, "remark": "全额扣款", "status": 0 }, { "id": 2, "leaveType": 2, "name": "病假", "deductionRatio": 0.5000, "remark": "按50%扣款", "status": 0 }, { "id": 3, "leaveType": 3, "name": "年假", "deductionRatio": 0.0000, "remark": "不扣款", "status": 0 } ], "msg": "操作成功" }
字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Long | 主键 |
| leaveType | Integer | 请假类型:1-事假, 2-病假, 3-年假, 4-婚假, 5-产假, 6-丧假 |
| name | String | 类型名称 |
| deductionRatio | BigDecimal | 扣款比例(0-1之间,如0.5表示扣50%) |
| remark | String | 备注 |
| status | Integer | 状态:0-启用, 1-禁用 |
请求: PUT /admin-api/hrm/leave-type-config/update
请求体:json { "id": 2, "deductionRatio": 0.3000, "remark": "按30%扣款", "status": 0 }
响应:json { "code": 0, "data": true, "msg": "操作成功" }
请求: GET /admin-api/hrm/salary/calculation/preview?period=2026-02&deptId=103
参数说明:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| period | String | 是 | 核算周期,格式如2026-02 |
| deptId | Long | 否 | 部门ID,不传则查询全部 |
响应:json { "code": 0, "data": [ { "id": null, "no": null, "period": "2026-02", "userId": 1, "userName": "张三", "deptId": 103, "deptName": "研发部", "baseSalary": 10000.00, "performanceSalary": 2000.00, "overtimePay": 0.00, "mealAllowance": 500.00, "transportAllowance": 300.00, "otherAllowance": 0.00, "socialSecurityDeduction": 1020.00, "housingFundDeduction": 1200.00, "taxDeduction": 0.00, "otherDeduction": 0.00, "leaveDeduction": 460.00, "actualSalary": 10620.00, "workDays": 22, "overtimeHours": 0.00, "status": null, "remark": null } ], "msg": "操作成功" }
新增字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| leaveDeduction | BigDecimal | 请假扣款金额 |
请求: POST /admin-api/hrm/salary/calculation/confirm
请求体:json { "ids": [1, 2, 3] }
响应:json { "code": 0, "data": true, "msg": "操作成功" }
请假扣款 = 日工资 × 请假天数 × 扣款比例
日工资 = 基本工资 / 21.75
| 请假类型 | 默认扣款比例 | 说明 |
|---|---|---|
| 事假 | 100% | 全额扣款 |
| 病假 | 50% | 按比例扣款 |
| 年假 | 0% | 不扣款 |
| 婚假 | 0% | 不扣款 |
| 产假 | 0% | 不扣款 |
| 丧假 | 0% | 不扣款 |
员工张三:
- 基本工资:10000元
- 日工资:10000 / 21.75 = 460元
- 请假记录:事假2天,病假1天
计算:
- 事假扣款:460 × 2 × 100% = 920元
- 病假扣款:460 × 1 × 50% = 230元
- 总请假扣款:920 + 230 = 1150元
执行以下SQL脚本:
-- 请假类型扣款配置表
CREATE TABLE IF NOT EXISTS hrm_leave_type_config (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
leave_type INT NOT NULL COMMENT '请假类型:1-事假, 2-病假, 3-年假, 4-婚假, 5-产假, 6-丧假',
name VARCHAR(32) NOT NULL COMMENT '类型名称',
deduction_ratio DECIMAL(5,4) NOT NULL DEFAULT 0.0000 COMMENT '扣款比例(0-1之间)',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
status INT NOT NULL DEFAULT 0 COMMENT '状态:0-启用, 1-禁用',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
creator VARCHAR(64) DEFAULT '' COMMENT '创建人',
updater VARCHAR(64) DEFAULT '' COMMENT '更新人',
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '请假类型扣款配置';
-- 初始化默认数据
INSERT INTO hrm_leave_type_config (leave_type, name, deduction_ratio, remark, status) VALUES
(1, '事假', 1.0000, '全额扣款', 0),
(2, '病假', 0.5000, '按50%扣款', 0),
(3, '年假', 0.0000, '不扣款', 0),
(4, '婚假', 0.0000, '不扣款', 0),
(5, '产假', 0.0000, '不扣款', 0),
(6, '丧假', 0.0000, '不扣款', 0);
-- 薪酬核算表添加请假扣款字段
ALTER TABLE hrm_salary_calculation ADD COLUMN leave_deduction DECIMAL(10,2) DEFAULT 0.00 COMMENT '请假扣款' AFTER other_deduction;
<!-- 配置列表表格 -->
<el-table :data="configList">
<el-table-column prop="name" label="请假类型" />
<el-table-column prop="deductionRatio" label="扣款比例">
<template #default="{ row }">
{{ (row.deductionRatio * 100).toFixed(0) }}%
</template>
</el-table-column>
<el-table-column prop="remark" label="备注" />
<el-table-column label="操作">
<template #default="{ row }">
<el-button @click="handleEdit(row)">编辑</el-button>
</template>
</el-table-column>
</el-table>
<!-- 编辑弹窗 -->
<el-dialog v-model="editVisible" title="编辑扣款比例">
<el-form>
<el-form-item label="扣款比例">
<el-input-number v-model="editForm.deductionRatio" :min="0" :max="100" :step="10" />
<span>%</span>
</el-form-item>
<el-form-item label="备注">
<el-input v-model="editForm.remark" />
</el-form-item>
</el-form>
</el-dialog>
<el-table-column prop="leaveDeduction" label="请假扣款" />
<el-button @click="handleConfirm">批量确认</el-button>
handleConfirm() {
const ids = this.selectedRows.map(row => row.id);
if (ids.length === 0) {
this.$message.warning('请选择要确认的记录');
return;
}
request.post('/hrm/salary/calculation/confirm', { ids }).then(res => {
this.$message.success('确认成功');
this.getList();
});
}
薪酬核算(待确认) → 批量确认 → 薪酬核算(已确认) → [全部确认后自动生成发放台账] → 薪资发放(待发放) → 发放薪资 → 薪资发放(已发放)
自动生成规则:当该周期所有薪酬核算记录都确认后,系统自动生成薪资发放台账。
将已确认的薪酬核算记录自动转入发放台账。
请求: POST /admin-api/hrm/salary/payment/generate?period=2026-02
参数说明:
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| period | String | 是 | 核算周期 |
响应:json { "code": 0, "data": 1, "msg": "操作成功" }
返回发放台账ID。
请求: GET /admin-api/hrm/salary/payment/page?pageNo=1&pageSize=20
响应:json { "code": 0, "data": { "list": [ { "id": 1, "no": "SF202602010001", "period": "2026-02", "totalAmount": 150000.00, "totalCount": 15, "paymentMethod": null, "paymentTime": null, "status": 0, "fileUrl": null, "remark": null } ], "total": 1 }, "msg": "操作成功" }
字段说明:
| 字段 | 类型 | 说明 |
|---|---|---|
| id | Long | 发放台账ID |
| no | String | 发放单号 |
| period | String | 发放周期 |
| totalAmount | BigDecimal | 发放总金额 |
| totalCount | Integer | 发放人数 |
| paymentMethod | Integer | 发放方式:1-银行转账,2-现金 |
| paymentTime | LocalDateTime | 发放时间 |
| status | Integer | 状态:0-待发放,10-已发放 |
| fileUrl | String | 银行回单附件 |
| remark | String | 备注 |
请求: GET /admin-api/hrm/salary/payment/detail/list?paymentId=1
响应:json { "code": 0, "data": [ { "id": 1, "paymentId": 1, "calculationId": 1, "userId": 1, "userName": "张三", "deptId": 103, "deptName": "研发部", "actualSalary": 10620.00, "status": 0, "paymentTime": null, "remark": null } ], "msg": "操作成功" }
请求: POST /admin-api/hrm/salary/payment/pay?id=1
响应:json { "code": 0, "data": true, "msg": "操作成功" }
发放后,台账状态变为已发放,所有明细状态变为已发放。
可选择性发放部分员工的薪资。
请求: POST /admin-api/hrm/salary/payment/pay-detail
请求体:json { "detailIds": [1, 2, 3] }
响应:json { "code": 0, "data": true, "msg": "操作成功" }
-- 薪资发放明细表
CREATE TABLE IF NOT EXISTS hrm_salary_payment_detail (
id BIGINT AUTO_INCREMENT PRIMARY KEY COMMENT '主键',
payment_id BIGINT NOT NULL COMMENT '发放台账ID',
calculation_id BIGINT NOT NULL COMMENT '薪酬核算ID',
user_id BIGINT NOT NULL COMMENT '员工ID',
dept_id BIGINT DEFAULT NULL COMMENT '部门ID',
actual_salary DECIMAL(10,2) NOT NULL DEFAULT 0.00 COMMENT '实发工资',
status INT NOT NULL DEFAULT 0 COMMENT '发放状态:0-待发放,10-已发放',
payment_time DATETIME DEFAULT NULL COMMENT '发放时间',
remark VARCHAR(255) DEFAULT NULL COMMENT '备注',
create_time DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
update_time DATETIME DEFAULT NULL ON UPDATE CURRENT_TIMESTAMP COMMENT '更新时间',
creator VARCHAR(64) DEFAULT '' COMMENT '创建人',
updater VARCHAR(64) DEFAULT '' COMMENT '更新人',
deleted BIT NOT NULL DEFAULT 0 COMMENT '是否删除',
INDEX idx_payment_id (payment_id),
INDEX idx_calculation_id (calculation_id)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT '薪资发放明细';
<!-- 生成发放台账按钮 -->
<el-button @click="handleGenerate">生成发放台账</el-button>
<!-- 台账列表 -->
<el-table :data="paymentList">
<el-table-column prop="no" label="发放单号" />
<el-table-column prop="period" label="发放周期" />
<el-table-column prop="totalAmount" label="发放总金额" />
<el-table-column prop="totalCount" label="发放人数" />
<el-table-column prop="status" label="状态">
<template #default="{ row }">
{{ row.status === 0 ? '待发放' : '已发放' }}
</template>
</el-table-column>
<el-table-column label="操作">
<template #default="{ row }">
<el-button @click="handleViewDetail(row)">查看明细</el-button>
<el-button v-if="row.status === 0" @click="handlePay(row)">发放薪资</el-button>
</template>
</el-table-column>
</el-table>
<el-dialog v-model="detailVisible" title="发放明细">
<el-table :data="detailList">
<el-table-column prop="userName" label="员工姓名" />
<el-table-column prop="deptName" label="部门" />
<el-table-column prop="actualSalary" label="实发工资" />
<el-table-column prop="status" label="状态">
<template #default="{ row }">
{{ row.status === 0 ? '待发放' : '已发放' }}
</template>
</el-table-column>
</el-table>
</el-dialog>
handleGenerate() {
this.$prompt('请输入发放周期', '生成发放台账', {
inputPattern: /^\d{4}-\d{2}$/,
inputErrorMessage: '周期格式不正确,如2026-02'
}).then(({ value }) => {
request.post(`/hrm/salary/payment/generate?period=${value}`).then(res => {
this.$message.success('生成成功');
this.getList();
});
});
}