-- =====================================================================
|
-- 功能:薪酬核算 —— 全勤奖支持工资表行内调整
|
-- 日期:2026-09-18
|
-- 分支:dev_天津_玮苓乐器
|
--
|
-- 【重要说明】
|
-- 本功能为纯代码层改动:
|
-- 前端 formDia.vue(全勤奖列放开编辑 + 实时重算)
|
-- 后端 SchemeApplicableStaffServiceImpl.resolveAttendanceBonus(优先取行内传入值)
|
-- 所依赖的 attendance_bonus 字段在两个表中【本来就已存在】,
|
-- 因此在标准环境下【无需执行任何数据库变更】,直接部署前后端代码即可。
|
--
|
-- 本脚本用于:目标环境(如客户现场库、旧版本库)缺少该字段时安全补齐。
|
-- 脚本可重复执行,已存在则自动跳过,不会报错。
|
--
|
-- 涉及表:
|
-- staff_on_job.attendance_bonus 员工档案全勤奖(NOT NULL 默认 100.00)
|
-- staff_salary_detail.attendance_bonus 工资明细全勤奖(NOT NULL 默认 100.00)
|
-- =====================================================================
|
|
-- ---------------------------------------------------------------------
|
-- 1. 执行前自检:查看两个字段的现状
|
-- ---------------------------------------------------------------------
|
SELECT table_name AS 表名,
|
column_name AS 字段名,
|
column_type AS 类型,
|
is_nullable AS 可空,
|
column_default AS 默认值,
|
column_comment AS 注释
|
FROM information_schema.columns
|
WHERE table_schema = DATABASE()
|
AND table_name IN ('staff_on_job', 'staff_salary_detail')
|
AND column_name = 'attendance_bonus';
|
|
-- ---------------------------------------------------------------------
|
-- 2. 幂等补齐字段(字段已存在则跳过)
|
-- 注意:DELIMITER 是客户端指令,Navicat / DBeaver / mysql CLI 均支持;
|
-- 若用不支持 DELIMITER 的工具,请只执行其中缺失的那条 ALTER。
|
-- ---------------------------------------------------------------------
|
DROP PROCEDURE IF EXISTS sp_add_attendance_bonus;
|
|
DELIMITER $$
|
CREATE PROCEDURE sp_add_attendance_bonus()
|
BEGIN
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
WHERE table_schema = DATABASE()
|
AND table_name = 'staff_on_job'
|
AND column_name = 'attendance_bonus') THEN
|
ALTER TABLE staff_on_job
|
ADD COLUMN attendance_bonus DECIMAL(10,2) NOT NULL DEFAULT 100.00 COMMENT '全勤奖金';
|
END IF;
|
|
IF NOT EXISTS (SELECT 1 FROM information_schema.columns
|
WHERE table_schema = DATABASE()
|
AND table_name = 'staff_salary_detail'
|
AND column_name = 'attendance_bonus') THEN
|
ALTER TABLE staff_salary_detail
|
ADD COLUMN attendance_bonus DECIMAL(10,2) NOT NULL DEFAULT 100.00 COMMENT '全勤奖金';
|
END IF;
|
END$$
|
DELIMITER ;
|
|
CALL sp_add_attendance_bonus();
|
DROP PROCEDURE sp_add_attendance_bonus;
|
|
-- ---------------------------------------------------------------------
|
-- 3. 历史数据兜底(可选)
|
-- 仅当目标环境该字段允许 NULL 且存在 NULL 值时,才需要执行下面两条;
|
-- 标准环境下字段为 NOT NULL 默认 100,无需执行。
|
-- ---------------------------------------------------------------------
|
-- UPDATE staff_on_job SET attendance_bonus = 100.00 WHERE attendance_bonus IS NULL;
|
-- UPDATE staff_salary_detail SET attendance_bonus = 100.00 WHERE attendance_bonus IS NULL;
|
|
-- ---------------------------------------------------------------------
|
-- 4. 执行后验证:应能看到两行记录,类型 decimal(10,2)、默认值 100.00
|
-- ---------------------------------------------------------------------
|
SELECT table_name AS 表名,
|
column_name AS 字段名,
|
column_type AS 类型,
|
is_nullable AS 可空,
|
column_default AS 默认值,
|
column_comment AS 注释
|
FROM information_schema.columns
|
WHERE table_schema = DATABASE()
|
AND table_name IN ('staff_on_job', 'staff_salary_detail')
|
AND column_name = 'attendance_bonus';
|
|
-- =====================================================================
|
-- 附:本次功能的行为说明(无需执行 SQL,仅备查)
|
-- 应发合计 = 全勤奖 + 基本工资 × 效益(折合倍数) + 津贴 + 其他收入
|
-- 全勤奖取值优先级:工资表行内传入值(支持 0) > 员工档案 staff_on_job.attendance_bonus
|
-- =====================================================================
|