# 请假类型扣款配置 & 薪酬核算联动 & 薪资发放流程 ## 概述 薪酬核算模块新增请假扣款功能,并实现薪酬核算到薪资发放的自动流转。 ## 涉及页面 - 薪酬管理 -> 薪酬设置 -> 请假扣款配置 - 薪酬管理 -> 薪酬核算 -> 薪酬核算预览 - 薪酬管理 -> 薪资发放 -> 薪资发放台账 - 薪酬管理 -> 薪资发放 -> 薪资发放明细 --- ## 一、请假扣款配置 ### 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 % ``` ### 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 生成发放台账 ``` ### 2. 发放明细弹窗 ```html ``` ### 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. 发放薪资后不可撤销