feat: 智能排班人员预测系统
- 新增人员预测tab,基于多维度产能指标生成招聘/优化建议 - 规则引擎:7条优化规则 + 7条招聘规则 + 4步决策逻辑 - 动态标准值:基于全部门店中位数计算,替代硬编码阈值 - 互斥逻辑:有优化信号时抑制所有招聘信号 - 占比超配时不触发招聘信号(R9/R11/R12/R13) - 离职缺口需出勤不足才触发招聘(R10) - 管理岗满编时不触发出勤不足招聘(R9) - 前端可折叠规则引擎面板,展示全部规则和触发条件 - 产能指标对比展示实际值 vs 中位数标准
This commit is contained in:
@@ -0,0 +1,213 @@
|
||||
-- ============================================================
|
||||
-- 薪资拆分明细表 + 考勤数据表 建表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);
|
||||
Reference in New Issue
Block a user