75a483bfdb
- 新增人员预测tab,基于多维度产能指标生成招聘/优化建议 - 规则引擎:7条优化规则 + 7条招聘规则 + 4步决策逻辑 - 动态标准值:基于全部门店中位数计算,替代硬编码阈值 - 互斥逻辑:有优化信号时抑制所有招聘信号 - 占比超配时不触发招聘信号(R9/R11/R12/R13) - 离职缺口需出勤不足才触发招聘(R10) - 管理岗满编时不触发出勤不足招聘(R9) - 前端可折叠规则引擎面板,展示全部规则和触发条件 - 产能指标对比展示实际值 vs 中位数标准
214 lines
8.2 KiB
SQL
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);
|