# 请假类型扣款配置 & 薪酬核算联动 & 薪资发放流程
## 概述
薪酬核算模块新增请假扣款功能,并实现薪酬核算到薪资发放的自动流转。
## 涉及页面
- 薪酬管理 -> 薪酬设置 -> 请假扣款配置
- 薪酬管理 -> 薪酬核算 -> 薪酬核算预览
- 薪酬管理 -> 薪资发放 -> 薪资发放台账
- 薪酬管理 -> 薪资发放 -> 薪资发放明细
---
## 一、请假扣款配置
### 1. 获取请假类型配置列表
**请求:**
```
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-禁用 |
### 2. 更新请假类型配置
**请求:**
```
PUT /admin-api/hrm/leave-type-config/update
```
**请求体:**
```json
{
"id": 2,
"deductionRatio": 0.3000,
"remark": "按30%扣款",
"status": 0
}
```
**响应:**
```json
{
"code": 0,
"data": true,
"msg": "操作成功"
}
```
---
## 二、薪酬核算(已集成请假扣款)
### 1. 预览薪酬核算
**请求:**
```
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 | 请假扣款金额 |
### 2. 批量确认薪酬核算
**请求:**
```
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脚本:
```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;
```
---
## 五、前端修改点
### 1. 请假扣款配置页面
```html
{{ (row.deductionRatio * 100).toFixed(0) }}%
编辑
%
```
### 2. 薪酬核算表格新增列
```html
```
### 3. 批量确认按钮
```html
批量确认
```
```js
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();
});
}
```
---
## 注意事项
1. 请假扣款只计算已审批通过的请假记录
2. 只有启用的请假类型配置才会参与计算
3. 日工资按国家标准21.75天计算
4. 薪酬核算预览接口实时计算,不依赖数据库已存储的数据
---
## 六、薪资发放流程
### 业务流程图
```
薪酬核算(待确认) → 批量确认 → 薪酬核算(已确认) → [全部确认后自动生成发放台账] → 薪资发放(待发放) → 发放薪资 → 薪资发放(已发放)
```
**自动生成规则**:当该周期所有薪酬核算记录都确认后,系统自动生成薪资发放台账。
### 1. 生成薪资发放台账
将已确认的薪酬核算记录自动转入发放台账。
**请求:**
```
POST /admin-api/hrm/salary/payment/generate?period=2026-02
```
**参数说明:**
| 参数 | 类型 | 必填 | 说明 |
|------|------|------|------|
| period | String | 是 | 核算周期 |
**响应:**
```json
{
"code": 0,
"data": 1,
"msg": "操作成功"
}
```
返回发放台账ID。
### 2. 获取薪资发放台账分页
**请求:**
```
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 | 备注 |
### 3. 获取薪资发放明细列表
**请求:**
```
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": "操作成功"
}
```
### 4. 发放薪资(整个台账)
**请求:**
```
POST /admin-api/hrm/salary/payment/pay?id=1
```
**响应:**
```json
{
"code": 0,
"data": true,
"msg": "操作成功"
}
```
发放后,台账状态变为已发放,所有明细状态变为已发放。
### 5. 批量发放薪资明细
可选择性发放部分员工的薪资。
**请求:**
```
POST /admin-api/hrm/salary/payment/pay-detail
```
**请求体:**
```json
{
"detailIds": [1, 2, 3]
}
```
**响应:**
```json
{
"code": 0,
"data": true,
"msg": "操作成功"
}
```
---
## 七、薪资发放数据库变更
```sql
-- 薪资发放明细表
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 '薪资发放明细';
```
---
## 八、薪资发放前端修改点
### 1. 薪资发放台账页面
```html
生成发放台账
{{ row.status === 0 ? '待发放' : '已发放' }}
查看明细
发放薪资
```
### 2. 发放明细弹窗
```html
{{ row.status === 0 ? '待发放' : '已发放' }}
```
### 3. 生成发放台账方法
```js
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();
});
});
}
```
---
## 注意事项(薪资发放)
1. 生成发放台账前,必须先确认薪酬核算记录
2. 每个周期只能生成一个发放台账
3. 生成台账后,薪酬核算状态变为"已发放"
4. 发放薪资后不可撤销