-- ===================================================================== -- 功能:薪酬核算 —— 全勤奖支持工资表行内调整 -- 日期: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 -- =====================================================================