liu
21 小时以前 3e144b2eb8fc9447d2d092edb71db533d12abc52
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
-- =====================================================================
-- 功能:薪酬核算 —— 全勤奖支持工资表行内调整
-- 日期: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
-- =====================================================================