All checks were successful
技能自动化发布 / release (push) Successful in 15s
基于 skill-template 脚手架开发,包含: - 5 张业务表(教职工、请假政策、考勤日历、请假记录、假期余额) - 请假核算引擎(扣薪计算、审批层级判定、年假抵扣) - CLI 入口(import-employees / calculate-leave / render-html) - HTML 审批与扣薪报告生成 - 示例数据与完整测试套件(295 tests passed)
443 lines
15 KiB
Python
443 lines
15 KiB
Python
"""高校人事请假考勤:数据管理展示元数据。"""
|
|
|
|
from __future__ import annotations
|
|
|
|
import json
|
|
|
|
from db.display_metadata import (
|
|
DATETIME_UNIX_SECONDS,
|
|
list_physical_column_names,
|
|
seed_column_metadata_batch,
|
|
upsert_table_metadata,
|
|
)
|
|
from db.schema import (
|
|
ATTENDANCE_HOLIDAYS_TABLE,
|
|
EMPLOYEES_TABLE,
|
|
LEAVE_BALANCES_TABLE,
|
|
LEAVE_POLICIES_TABLE,
|
|
LEAVE_REQUESTS_TABLE,
|
|
)
|
|
|
|
IS_ACTIVE_OPTIONS = (
|
|
'[{"value":"1","label":"启用"},'
|
|
'{"value":"0","label":"停用"}]'
|
|
)
|
|
|
|
STATUS_OPTIONS = (
|
|
'[{"value":"draft","label":"草稿"},'
|
|
'{"value":"completed","label":"已完成"},'
|
|
'{"value":"failed","label":"失败"}]'
|
|
)
|
|
|
|
DAY_BASIS_OPTIONS = (
|
|
'[{"value":"workday","label":"工作日"},'
|
|
'{"value":"natural","label":"自然日"}]'
|
|
)
|
|
|
|
POSITION_CATEGORY_OPTIONS = (
|
|
'[{"value":"教师","label":"教师"},'
|
|
'{"value":"行政","label":"行政"},'
|
|
'{"value":"科研","label":"科研"}]'
|
|
)
|
|
|
|
HOLIDAY_TYPE_OPTIONS = (
|
|
'[{"value":"法定假日","label":"法定假日"},'
|
|
'{"value":"寒暑假","label":"寒暑假"},'
|
|
'{"value":"校庆","label":"校庆"},'
|
|
'{"value":"周末","label":"周末"}]'
|
|
)
|
|
|
|
APPROVAL_LEVEL_OPTIONS = (
|
|
'[{"value":"系主任","label":"系主任"},'
|
|
'{"value":"系主任+人事处","label":"系主任+人事处"},'
|
|
'{"value":"系主任+人事处+校领导","label":"系主任+人事处+校领导"}]'
|
|
)
|
|
|
|
BALANCE_TYPE_OPTIONS = (
|
|
'[{"value":"annual","label":"年假"},'
|
|
'{"value":"sick","label":"病假"},'
|
|
'{"value":"marriage","label":"婚假"},'
|
|
'{"value":"maternity","label":"产假"},'
|
|
'{"value":"bereavement","label":"丧假"}]'
|
|
)
|
|
|
|
REQUIRES_CERTIFICATE_OPTIONS = (
|
|
'[{"value":"1","label":"是"},'
|
|
'{"value":"0","label":"否"}]'
|
|
)
|
|
|
|
CAN_OFFSET_OPTIONS = (
|
|
'[{"value":"1","label":"是"},'
|
|
'{"value":"0","label":"否"}]'
|
|
)
|
|
|
|
|
|
def _ts(column: str, label: str, *, editable: int = 0) -> dict[str, object]:
|
|
return {
|
|
"column_name": column,
|
|
"display_name": label,
|
|
"visible": 1,
|
|
"searchable": 0,
|
|
"editable": editable,
|
|
"display_type": DATETIME_UNIX_SECONDS,
|
|
}
|
|
|
|
|
|
def _lookup(ref_table: str, value_column: str, label_column: str) -> str:
|
|
return json.dumps(
|
|
{
|
|
"ref_table": ref_table,
|
|
"value_column": value_column,
|
|
"label_column": label_column,
|
|
},
|
|
ensure_ascii=False,
|
|
)
|
|
|
|
|
|
def _seed_table(cursor, table_name: str, columns: tuple[dict[str, object], ...]) -> None:
|
|
physical = list_physical_column_names(cursor, table_name)
|
|
seed_column_metadata_batch(
|
|
cursor,
|
|
table_name=table_name,
|
|
columns=columns,
|
|
valid_column_names=physical,
|
|
)
|
|
|
|
|
|
def seed_leave_display_metadata(cursor) -> None:
|
|
upsert_table_metadata(
|
|
cursor,
|
|
table_name=EMPLOYEES_TABLE,
|
|
display_name="教职工",
|
|
description="教职工基本信息:部门、岗位、入职日期、月薪标准、年假余额",
|
|
grid_help="可用「导入教职工」从 JSON 批量写入;停用教职工不参与请假核算。",
|
|
readonly=0,
|
|
)
|
|
_seed_table(
|
|
cursor,
|
|
EMPLOYEES_TABLE,
|
|
(
|
|
{"column_name": "id", "display_name": "编号", "editable": 0, "searchable": 1},
|
|
{"column_name": "name", "display_name": "姓名", "editable": 1, "searchable": 1},
|
|
{"column_name": "employee_no", "display_name": "工号", "editable": 1, "searchable": 1},
|
|
{"column_name": "department", "display_name": "部门", "editable": 1, "searchable": 1},
|
|
{"column_name": "position", "display_name": "岗位", "editable": 1, "searchable": 1},
|
|
{
|
|
"column_name": "position_category",
|
|
"display_name": "岗位类别",
|
|
"editable": 1,
|
|
"searchable": 1,
|
|
"display_type": "enum",
|
|
"options_json": POSITION_CATEGORY_OPTIONS,
|
|
},
|
|
{"column_name": "join_date", "display_name": "入职日期", "editable": 1, "searchable": 1},
|
|
{
|
|
"column_name": "monthly_salary",
|
|
"display_name": "月薪标准",
|
|
"editable": 1,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "annual_leave_remaining",
|
|
"display_name": "年假余额",
|
|
"editable": 1,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "is_active",
|
|
"display_name": "启用",
|
|
"editable": 1,
|
|
"searchable": 1,
|
|
"display_type": "enum",
|
|
"options_json": IS_ACTIVE_OPTIONS,
|
|
},
|
|
{"column_name": "notes", "display_name": "备注", "editable": 1, "searchable": 1},
|
|
_ts("created_at", "创建时间"),
|
|
_ts("updated_at", "更新时间"),
|
|
),
|
|
)
|
|
|
|
upsert_table_metadata(
|
|
cursor,
|
|
table_name=LEAVE_POLICIES_TABLE,
|
|
display_name="请假政策",
|
|
description="各类假别的扣薪规则、审批阈值与证件要求",
|
|
grid_help="按学校政策维护各类假别参数;核算时按 leave_type 匹配。",
|
|
readonly=0,
|
|
)
|
|
_seed_table(
|
|
cursor,
|
|
LEAVE_POLICIES_TABLE,
|
|
(
|
|
{"column_name": "id", "display_name": "编号", "editable": 0, "searchable": 1},
|
|
{"column_name": "leave_type", "display_name": "请假类型", "editable": 1, "searchable": 1},
|
|
{
|
|
"column_name": "max_days",
|
|
"display_name": "最大可休天数",
|
|
"editable": 1,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "day_basis",
|
|
"display_name": "计薪日基准",
|
|
"editable": 1,
|
|
"searchable": 1,
|
|
"display_type": "enum",
|
|
"options_json": DAY_BASIS_OPTIONS,
|
|
},
|
|
{
|
|
"column_name": "paid_days",
|
|
"display_name": "带薪天数",
|
|
"editable": 1,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "partial_pay_ratio",
|
|
"display_name": "部分扣薪比例",
|
|
"editable": 1,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "unpaid_after_days",
|
|
"display_name": "无薪起始天数",
|
|
"editable": 1,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "requires_certificate",
|
|
"display_name": "需证件",
|
|
"editable": 1,
|
|
"searchable": 1,
|
|
"display_type": "enum",
|
|
"options_json": REQUIRES_CERTIFICATE_OPTIONS,
|
|
},
|
|
{
|
|
"column_name": "can_offset_annual",
|
|
"display_name": "可抵年假",
|
|
"editable": 1,
|
|
"searchable": 1,
|
|
"display_type": "enum",
|
|
"options_json": CAN_OFFSET_OPTIONS,
|
|
},
|
|
{
|
|
"column_name": "approval_threshold_dept",
|
|
"display_name": "系主任阈值",
|
|
"editable": 1,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "approval_threshold_hr",
|
|
"display_name": "人事处阈值",
|
|
"editable": 1,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{"column_name": "notes", "display_name": "备注", "editable": 1, "searchable": 1},
|
|
_ts("created_at", "创建时间"),
|
|
_ts("updated_at", "更新时间"),
|
|
),
|
|
)
|
|
|
|
upsert_table_metadata(
|
|
cursor,
|
|
table_name=ATTENDANCE_HOLIDAYS_TABLE,
|
|
display_name="考勤日历",
|
|
description="法定节假日、寒暑假、校庆等非工作日",
|
|
grid_help="核算工作日时排除此处登记的日期。",
|
|
readonly=0,
|
|
)
|
|
_seed_table(
|
|
cursor,
|
|
ATTENDANCE_HOLIDAYS_TABLE,
|
|
(
|
|
{"column_name": "id", "display_name": "编号", "editable": 0, "searchable": 1},
|
|
{"column_name": "holiday_date", "display_name": "日期", "editable": 1, "searchable": 1},
|
|
{"column_name": "holiday_name", "display_name": "名称", "editable": 1, "searchable": 1},
|
|
{
|
|
"column_name": "holiday_type",
|
|
"display_name": "类型",
|
|
"editable": 1,
|
|
"searchable": 1,
|
|
"display_type": "enum",
|
|
"options_json": HOLIDAY_TYPE_OPTIONS,
|
|
},
|
|
_ts("created_at", "创建时间"),
|
|
_ts("updated_at", "更新时间"),
|
|
),
|
|
)
|
|
|
|
upsert_table_metadata(
|
|
cursor,
|
|
table_name=LEAVE_REQUESTS_TABLE,
|
|
display_name="请假记录",
|
|
description="请假申请与核算结果(系统写入)",
|
|
grid_help="在教职工表执行「请假核算」后查看扣薪明细与审批层级。",
|
|
readonly=1,
|
|
)
|
|
_seed_table(
|
|
cursor,
|
|
LEAVE_REQUESTS_TABLE,
|
|
(
|
|
{"column_name": "id", "display_name": "编号", "editable": 0, "searchable": 1},
|
|
{
|
|
"column_name": "employee_id",
|
|
"display_name": "教职工",
|
|
"editable": 0,
|
|
"searchable": 1,
|
|
"display_type": "lookup",
|
|
"options_json": _lookup(EMPLOYEES_TABLE, "id", "name"),
|
|
},
|
|
{"column_name": "leave_type", "display_name": "请假类型", "editable": 0, "searchable": 1},
|
|
{"column_name": "start_date", "display_name": "开始日期", "editable": 0, "searchable": 1},
|
|
{"column_name": "end_date", "display_name": "结束日期", "editable": 0, "searchable": 1},
|
|
{
|
|
"column_name": "has_certificate",
|
|
"display_name": "附证件",
|
|
"editable": 0,
|
|
"searchable": 1,
|
|
"display_type": "enum",
|
|
"options_json": REQUIRES_CERTIFICATE_OPTIONS,
|
|
},
|
|
{"column_name": "certificate_type", "display_name": "证件类型", "editable": 0, "searchable": 1},
|
|
{
|
|
"column_name": "natural_days",
|
|
"display_name": "自然日数",
|
|
"editable": 0,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "working_days",
|
|
"display_name": "工作日数",
|
|
"editable": 0,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "monthly_salary",
|
|
"display_name": "月薪",
|
|
"editable": 0,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "working_days_in_month",
|
|
"display_name": "当月应出勤",
|
|
"editable": 0,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "daily_salary",
|
|
"display_name": "日薪",
|
|
"editable": 0,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "deduction_amount",
|
|
"display_name": "应扣工资",
|
|
"editable": 0,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "annual_leave_used",
|
|
"display_name": "已抵年假",
|
|
"editable": 0,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "remaining_annual_leave",
|
|
"display_name": "剩余年假",
|
|
"editable": 0,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "approval_level",
|
|
"display_name": "审批层级",
|
|
"editable": 0,
|
|
"searchable": 1,
|
|
"display_type": "enum",
|
|
"options_json": APPROVAL_LEVEL_OPTIONS,
|
|
},
|
|
{
|
|
"column_name": "status",
|
|
"display_name": "状态",
|
|
"editable": 0,
|
|
"searchable": 1,
|
|
"display_type": "enum",
|
|
"options_json": STATUS_OPTIONS,
|
|
},
|
|
{"column_name": "params_json", "display_name": "参数(JSON)", "editable": 0, "searchable": 0},
|
|
{"column_name": "summary", "display_name": "摘要", "editable": 0, "searchable": 1},
|
|
{"column_name": "error_message", "display_name": "错误信息", "editable": 0, "searchable": 1},
|
|
_ts("created_at", "创建时间"),
|
|
_ts("updated_at", "更新时间"),
|
|
),
|
|
)
|
|
|
|
upsert_table_metadata(
|
|
cursor,
|
|
table_name=LEAVE_BALANCES_TABLE,
|
|
display_name="假期余额",
|
|
description="教职工各类假期余额(系统更新)",
|
|
grid_help="核算后自动维护已用天数与剩余天数。",
|
|
readonly=1,
|
|
)
|
|
_seed_table(
|
|
cursor,
|
|
LEAVE_BALANCES_TABLE,
|
|
(
|
|
{"column_name": "id", "display_name": "编号", "editable": 0, "searchable": 1},
|
|
{
|
|
"column_name": "employee_id",
|
|
"display_name": "教职工",
|
|
"editable": 0,
|
|
"searchable": 1,
|
|
"display_type": "lookup",
|
|
"options_json": _lookup(EMPLOYEES_TABLE, "id", "name"),
|
|
},
|
|
{
|
|
"column_name": "balance_type",
|
|
"display_name": "假期类型",
|
|
"editable": 0,
|
|
"searchable": 1,
|
|
"display_type": "enum",
|
|
"options_json": BALANCE_TYPE_OPTIONS,
|
|
},
|
|
{
|
|
"column_name": "total_days",
|
|
"display_name": "总额度",
|
|
"editable": 0,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "used_days",
|
|
"display_name": "已用",
|
|
"editable": 0,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
{
|
|
"column_name": "remaining_days",
|
|
"display_name": "剩余",
|
|
"editable": 0,
|
|
"searchable": 0,
|
|
"display_type": "number",
|
|
},
|
|
_ts("created_at", "创建时间"),
|
|
_ts("updated_at", "更新时间"),
|
|
),
|
|
)
|