编辑 | blame | 历史 | 原始文档

请假类型扣款配置 & 薪酬核算联动 & 薪资发放流程

概述

薪酬核算模块新增请假扣款功能,并实现薪酬核算到薪资发放的自动流转。

涉及页面

  • 薪酬管理 -> 薪酬设置 -> 请假扣款配置
  • 薪酬管理 -> 薪酬核算 -> 薪酬核算预览
  • 薪酬管理 -> 薪资发放 -> 薪资发放台账
  • 薪酬管理 -> 薪资发放 -> 薪资发放明细

一、请假扣款配置

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脚本:

-- 请假类型扣款配置表
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. 请假扣款配置页面

<!-- 配置列表表格 -->
<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>

2. 薪酬核算表格新增列

<el-table-column prop="leaveDeduction" label="请假扣款" />

3. 批量确认按钮

<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();
  });
}

注意事项

  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": "操作成功" }


七、薪资发放数据库变更

-- 薪资发放明细表
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. 薪资发放台账页面

<!-- 生成发放台账按钮 -->
<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>

2. 发放明细弹窗

<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>

3. 生成发放台账方法

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. 发放薪资后不可撤销