Files
SBrainCO/db/import_salary_attendance.sql
T
freedakgmail 75a483bfdb feat: 智能排班人员预测系统
- 新增人员预测tab,基于多维度产能指标生成招聘/优化建议
- 规则引擎:7条优化规则 + 7条招聘规则 + 4步决策逻辑
- 动态标准值:基于全部门店中位数计算,替代硬编码阈值
- 互斥逻辑:有优化信号时抑制所有招聘信号
- 占比超配时不触发招聘信号(R9/R11/R12/R13)
- 离职缺口需出勤不足才触发招聘(R10)
- 管理岗满编时不触发出勤不足招聘(R9)
- 前端可折叠规则引擎面板,展示全部规则和触发条件
- 产能指标对比展示实际值 vs 中位数标准
2026-07-29 23:41:56 +08:00

214 lines
8.2 KiB
SQL

-- ============================================================
-- 薪资拆分明细表 + 考勤数据表 建表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);