-- ============================================================ -- 薪资拆分明细表 + 考勤数据表 建表SQL -- 创建时间: 2026-07-29 -- 数据来源: 薪资拆分明细表_脱敏.xlsx / 考勤数据表-脱敏.xlsx -- 导入规则: 遵循现有 import_log + records 模式 -- ============================================================ -- ============================================================ -- 一、薪资拆分明细表 -- ============================================================ -- 1. 导入日志表 CREATE TABLE IF NOT EXISTS public.salary_import_log ( import_id BIGSERIAL PRIMARY KEY, report_month DATE NOT NULL, source_file TEXT NOT NULL, file_sha256 TEXT NOT NULL, workbook_rows INTEGER, imported_rows INTEGER, imported_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE(report_month, source_file, file_sha256) ); -- 2. 薪资明细记录表 CREATE TABLE IF NOT EXISTS public.salary_detail_records ( record_id BIGSERIAL PRIMARY KEY, import_id BIGINT NOT NULL REFERENCES public.salary_import_log(import_id) ON DELETE CASCADE, source_row INTEGER NOT NULL, -- 组织层级 org_level1 TEXT, org_level2 TEXT, org_level3 TEXT, org_level4 TEXT, org_level5 TEXT, -- 门店名 org_level6 TEXT, org_level7 TEXT, org_level8 TEXT, -- 员工信息 employee_code TEXT NOT NULL, salary_period TEXT, position TEXT, work_type TEXT, employment_type TEXT, hire_date TEXT, leave_date TEXT, -- 工资构成 salary_standard NUMERIC(18,2) DEFAULT 0, -- 工资额度 base_wage NUMERIC(18,2) DEFAULT 0, -- 基本工资 overtime_subsidy NUMERIC(18,2) DEFAULT 0, -- 加班补贴 social_subsidy NUMERIC(18,2) DEFAULT 0, -- 社保补贴 position_wage NUMERIC(18,2) DEFAULT 0, -- 岗位工资 tenure_wage NUMERIC(18,2) DEFAULT 0, -- 工龄工资 hourly_rate NUMERIC(18,2) DEFAULT 0, -- 时薪 total_wage NUMERIC(18,2) DEFAULT 0, -- 工资总额 brand_wage NUMERIC(18,2) DEFAULT 0, -- 品牌工资 rent_subsidy NUMERIC(18,2) DEFAULT 0, -- 租房补贴 -- 出勤信息 month_days NUMERIC(18,2) DEFAULT 0, -- 本月天数 expected_attend NUMERIC(18,2) DEFAULT 0, -- 应出勤天数 calc_attend NUMERIC(18,2) DEFAULT 0, -- 算薪天数 actual_attend NUMERIC(18,2) DEFAULT 0, -- 实出勤天数 actual_hours NUMERIC(18,2) DEFAULT 0, -- 实际出勤时长 expected_rest NUMERIC(18,2) DEFAULT 0, -- 应休公休天数 actual_rest NUMERIC(18,2) DEFAULT 0, -- 实公休天数 expected_legal_holiday NUMERIC(18,2) DEFAULT 0, actual_legal_holiday NUMERIC(18,2) DEFAULT 0, comp_leave_days NUMERIC(18,2) DEFAULT 0, -- 调休天数 annual_leave NUMERIC(18,2) DEFAULT 0, -- 年假天数 marriage_leave NUMERIC(18,2) DEFAULT 0, paid_leave NUMERIC(18,2) DEFAULT 0, bereavement_leave NUMERIC(18,2) DEFAULT 0, personal_leave_days NUMERIC(18,2) DEFAULT 0, personal_leave_deduction NUMERIC(18,2) DEFAULT 0, furlough_days NUMERIC(18,2) DEFAULT 0, furlough_deduction NUMERIC(18,2) DEFAULT 0, injury_leave_days NUMERIC(18,2) DEFAULT 0, injury_leave_deduction NUMERIC(18,2) DEFAULT 0, absent_days NUMERIC(18,2) DEFAULT 0, -- 旷工天数 absent_deduction NUMERIC(18,2) DEFAULT 0, join_leave_absent NUMERIC(18,2) DEFAULT 0, -- 薪资计算 attendance_wage NUMERIC(18,2) DEFAULT 0, -- 出勤薪资 rest_subsidy NUMERIC(18,2) DEFAULT 0, -- 公休补助 overtime_pay NUMERIC(18,2) DEFAULT 0, -- 加班 shift_subsidy NUMERIC(18,2) DEFAULT 0, -- 班次补贴 comp_leave_wage NUMERIC(18,2) DEFAULT 0, cashier_amount NUMERIC(18,2) DEFAULT 0, -- 收银金额 bonus NUMERIC(18,2) DEFAULT 0, -- 奖励 subsidy NUMERIC(18,2) DEFAULT 0, -- 补助 subsidy_remark TEXT, rush_wage NUMERIC(18,2) DEFAULT 0, -- 抢班工资 total_supplement NUMERIC(18,2) DEFAULT 0, -- 应补合计 late_deduction NUMERIC(18,2) DEFAULT 0, -- 迟到早退扣款 no_punch_deduction NUMERIC(18,2) DEFAULT 0, -- 未打卡扣款 internal_social_total NUMERIC(18,2) DEFAULT 0, internal_social_remark TEXT, loan NUMERIC(18,2) DEFAULT 0, loan_remark TEXT, fine NUMERIC(18,2) DEFAULT 0, compensation NUMERIC(18,2) DEFAULT 0, total_deduction NUMERIC(18,2) DEFAULT 0, -- 应扣合计 injury_wage NUMERIC(18,2) DEFAULT 0, singapore_subsidy NUMERIC(18,2) DEFAULT 0, -- 绩效 perf_standard NUMERIC(18,2) DEFAULT 0, perf_score NUMERIC(18,2) DEFAULT 0, perf_amount NUMERIC(18,2) DEFAULT 0, -- 其他 phone_allowance NUMERIC(18,2) DEFAULT 0, dorm_fee NUMERIC(18,2) DEFAULT 0, net_salary NUMERIC(18,2) DEFAULT 0, -- 实得薪资 gross_pay NUMERIC(18,2) DEFAULT 0, -- 应发工资 income_tax NUMERIC(18,2) DEFAULT 0, -- 个人所得税 net_pay NUMERIC(18,2) DEFAULT 0, -- 实发工资 -- 外账 external_base_standard NUMERIC(18,2) DEFAULT 0, external_overtime NUMERIC(18,2) DEFAULT 0, external_absence NUMERIC(18,2) DEFAULT 0, external_bonus NUMERIC(18,2) DEFAULT 0, external_subsidy NUMERIC(18,2) DEFAULT 0, external_other_deduction NUMERIC(18,2) DEFAULT 0, external_gross NUMERIC(18,2) DEFAULT 0, pension_deduction NUMERIC(18,2) DEFAULT 0, medical_deduction NUMERIC(18,2) DEFAULT 0, unemployment_deduction NUMERIC(18,2) DEFAULT 0, external_social_total NUMERIC(18,2) DEFAULT 0, external_tax NUMERIC(18,2) DEFAULT 0, external_net NUMERIC(18,2) DEFAULT 0, internal_tax NUMERIC(18,2) DEFAULT 0, internal_net NUMERIC(18,2) DEFAULT 0, -- 其他字段 external_unit TEXT, attendance_remark TEXT, -- 考勤备注_店长填写 employment_type_orig TEXT, -- 雇佣类型 salary_category TEXT, -- 薪酬类别 imported_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_salary_import_id ON public.salary_detail_records(import_id); CREATE INDEX IF NOT EXISTS idx_salary_employee ON public.salary_detail_records(employee_code); CREATE INDEX IF NOT EXISTS idx_salary_org5 ON public.salary_detail_records(org_level5); CREATE INDEX IF NOT EXISTS idx_salary_period ON public.salary_detail_records(salary_period); -- ============================================================ -- 二、考勤数据表 -- ============================================================ -- 1. 导入日志表 CREATE TABLE IF NOT EXISTS public.attendance_import_log ( import_id BIGSERIAL PRIMARY KEY, report_month DATE NOT NULL, source_file TEXT NOT NULL, file_sha256 TEXT NOT NULL, workbook_rows INTEGER, imported_rows INTEGER, imported_at TIMESTAMPTZ NOT NULL DEFAULT now(), UNIQUE(report_month, source_file, file_sha256) ); -- 2. 考勤记录表(宽表:工号×日期) CREATE TABLE IF NOT EXISTS public.attendance_records ( record_id BIGSERIAL PRIMARY KEY, import_id BIGINT NOT NULL REFERENCES public.attendance_import_log(import_id) ON DELETE CASCADE, source_row INTEGER NOT NULL, employee_code TEXT NOT NULL, position TEXT, department TEXT, -- 所在部门 day_01 TEXT, day_02 TEXT, day_03 TEXT, day_04 TEXT, day_05 TEXT, day_06 TEXT, day_07 TEXT, day_08 TEXT, day_09 TEXT, day_10 TEXT, day_11 TEXT, day_12 TEXT, day_13 TEXT, day_14 TEXT, day_15 TEXT, day_16 TEXT, day_17 TEXT, day_18 TEXT, day_19 TEXT, day_20 TEXT, day_21 TEXT, day_22 TEXT, day_23 TEXT, day_24 TEXT, day_25 TEXT, day_26 TEXT, day_27 TEXT, day_28 TEXT, day_29 TEXT, day_30 TEXT, day_31 TEXT, imported_at TIMESTAMPTZ NOT NULL DEFAULT now() ); CREATE INDEX IF NOT EXISTS idx_attendance_import_id ON public.attendance_records(import_id); CREATE INDEX IF NOT EXISTS idx_attendance_employee ON public.attendance_records(employee_code);