Files
2026-10-26 08:54:34 +08:00

177 lines
11 KiB
Go
Raw Permalink Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
package models
import "time"
// OaShift OA 工作排班-班次定义表 yz_backend_oa_shift
//
// 班次是排班的最小单位,描述一段可被复用的工作时间(如早班 09:00-18:00)。
// 字段中的时间均为 "HH:mm" 字符串,休息时段可为空表示不区分午休。
type OaShift struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
Tid int `orm:"column(tid)" json:"tid"`
Name string `orm:"column(name);size(50)" json:"name"`
ShortName string `orm:"column(short_name);size(20);default()" json:"short_name"`
Color string `orm:"column(color);size(20);default(#409EFF)" json:"color"`
WorkStart string `orm:"column(work_start);size(8);default()" json:"work_start"`
WorkEnd string `orm:"column(work_end);size(8);default()" json:"work_end"`
RestStart string `orm:"column(rest_start);size(8);default()" json:"rest_start"`
RestEnd string `orm:"column(rest_end);size(8);default()" json:"rest_end"`
WorkHours float64 `orm:"column(work_hours);type(decimal);digits(5);decimals(2);default(0)" json:"work_hours"`
IsDefault int8 `orm:"column(is_default);default(0)" json:"is_default"`
Status int8 `orm:"column(status);default(1)" json:"status"`
Sort int `orm:"column(sort);default(0)" json:"sort"`
Remark *string `orm:"column(remark);size(255);null" json:"remark"`
IsDeleted int8 `orm:"column(is_deleted);default(0)" json:"is_deleted"`
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);auto_now;type(datetime);null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
func (m *OaShift) TableName() string {
return "yz_backend_oa_shift"
}
// 排班方案类型(plan_type)
const (
OaPlanTypeRegular int8 = 1 // 常规排班:按组织范围周期性下发
OaPlanTypeTemp int8 = 2 // 临时方案:针对单个/多个员工的短期安排
)
// 排班作用范围(scope_type)
const (
OaScopeCompany int8 = 1 // 整个公司
OaScopeOrg int8 = 2 // 部门 / 小组(可含下级组织)
OaScopeEmployees int8 = 3 // 指定员工(一人或多人)
)
// OaSchedulePlan 排班方案 yz_backend_oa_schedule_plan
//
// 方案只描述“谁、在什么时间、上什么班”的规则,发布后由后端展开成
// yz_backend_oa_schedule_entry 明细(每人每天一条),这样看板查询与
// 临时调配都只操作明细表,方案本身可以随时停用而不影响已下发的排班。
//
// 两种排班方式:
// - 按星期(AlignMode=0):Weekdays + ShiftID,一人一天一个固定班次;
// - 按模板(AlignMode=1/2/3):Pattern 存周期的每日规则快照,
// 发布时按自然周 / 开始日滚动 / 自然月推算每天是否上班、上哪个班次。
// 模板来自平台端(yz_platform_sched_tpl),调用后即固化到本方案,
// 之后模板调整与方案无关。
type OaSchedulePlan struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
Tid int `orm:"column(tid)" json:"tid"`
PlanName string `orm:"column(plan_name);size(100)" json:"plan_name"`
PlanType int8 `orm:"column(plan_type);default(1)" json:"plan_type"`
ScopeType int8 `orm:"column(scope_type);default(2)" json:"scope_type"`
OrgID uint64 `orm:"column(org_id);default(0)" json:"org_id"`
OrgName string `orm:"column(org_name);size(128);default()" json:"org_name"`
IncludeChild int8 `orm:"column(include_child);default(1)" json:"include_child"`
EmployeeIDs string `orm:"column(employee_ids);type(text);null" json:"employee_ids"`
EmployeeNames string `orm:"column(employee_names);type(text);null" json:"employee_names"`
StartDate string `orm:"column(start_date);type(date)" json:"start_date"`
EndDate string `orm:"column(end_date);type(date)" json:"end_date"`
Weekdays string `orm:"column(weekdays);size(32);default()" json:"weekdays"`
ShiftID uint64 `orm:"column(shift_id);default(0)" json:"shift_id"`
// 模板快照与周期规则(平台模板调用后固化到方案,见 models/sched_template.go)
TemplateID uint64 `orm:"column(template_id);default(0)" json:"template_id"`
TemplateCode string `orm:"column(template_code);size(50);default()" json:"template_code"`
TemplateName string `orm:"column(template_name);size(50);default()" json:"template_name"`
AlignMode int8 `orm:"column(align_mode);default(0)" json:"align_mode"`
CycleDays int `orm:"column(cycle_days);default(0)" json:"cycle_days"`
WeekOffset int8 `orm:"column(week_offset);default(0)" json:"week_offset"`
MonthRestDays int8 `orm:"column(month_rest_days);default(0)" json:"month_rest_days"`
MonthRestWeekday int8 `orm:"column(month_rest_weekday);default(0)" json:"month_rest_weekday"`
Pattern string `orm:"column(pattern);type(text);null" json:"pattern"`
ShiftName string `orm:"column(shift_name);size(50);default()" json:"shift_name"`
Color string `orm:"column(color);size(20);default(#409EFF)" json:"color"`
Note string `orm:"column(note);size(500);default()" json:"note"`
Status int8 `orm:"column(status);default(1)" json:"status"`
PublishStatus int8 `orm:"column(publish_status);default(0)" json:"publish_status"`
EntryCount int `orm:"column(entry_count);default(0)" json:"entry_count"`
CreatedBy uint64 `orm:"column(created_by);default(0)" json:"created_by"`
CreatedByName string `orm:"column(created_by_name);size(64);default()" json:"created_by_name"`
IsDeleted int8 `orm:"column(is_deleted);default(0)" json:"is_deleted"`
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);auto_now;type(datetime);null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
func (m *OaSchedulePlan) TableName() string {
return "yz_backend_oa_schedule_plan"
}
// 排班明细来源(source)
const (
OaEntrySourcePlan int8 = 1 // 由排班方案发布生成
OaEntrySourceTemp int8 = 2 // 临时调配 / 单人多人手工安排
)
// OaScheduleEntry 排班明细 yz_backend_oa_schedule_entry
//
// 一人一天一条有效记录:唯一键 (tid, employee_id, schedule_date, is_deleted)。
// 删除时把 is_deleted 写成记录 ID,既保留历史痕迹,又避免同一天重新排班
// 与软删记录冲突(与 OA 工作日报的处理方式一致)。
type OaScheduleEntry struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
Tid int `orm:"column(tid)" json:"tid"`
PlanID uint64 `orm:"column(plan_id);default(0)" json:"plan_id"`
EmployeeID uint `orm:"column(employee_id)" json:"employee_id"`
EmployeeName string `orm:"column(employee_name);size(50);default()" json:"employee_name"`
EmployeeAccount string `orm:"column(employee_account);size(50);default()" json:"employee_account"`
OrgID uint64 `orm:"column(org_id);default(0)" json:"org_id"`
OrgName string `orm:"column(org_name);size(128);default()" json:"org_name"`
Position string `orm:"column(position);size(50);default()" json:"position"`
ScheduleDate string `orm:"column(schedule_date);type(date)" json:"schedule_date"`
ShiftID uint64 `orm:"column(shift_id);default(0)" json:"shift_id"`
ShiftName string `orm:"column(shift_name);size(50);default()" json:"shift_name"`
ShortName string `orm:"column(short_name);size(20);default()" json:"short_name"`
Color string `orm:"column(color);size(20);default(#409EFF)" json:"color"`
WorkStart string `orm:"column(work_start);size(8);default()" json:"work_start"`
WorkEnd string `orm:"column(work_end);size(8);default()" json:"work_end"`
Source int8 `orm:"column(source);default(1)" json:"source"`
Note string `orm:"column(note);size(255);default()" json:"note"`
CreatedBy uint64 `orm:"column(created_by);default(0)" json:"created_by"`
CreatedByName string `orm:"column(created_by_name);size(64);default()" json:"created_by_name"`
IsDeleted uint64 `orm:"column(is_deleted);default(0)" json:"is_deleted"`
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"`
UpdateTime *time.Time `orm:"column(update_time);auto_now;type(datetime);null" json:"update_time"`
DeleteTime *time.Time `orm:"column(delete_time);type(datetime);null" json:"delete_time"`
}
func (m *OaScheduleEntry) TableName() string {
return "yz_backend_oa_schedule_entry"
}
// 排班变更类型(change_type)
const (
OaChangeShift int8 = 1 // 调班:换班次
OaChangeClear int8 = 2 // 清除排班
OaChangeManual int8 = 3 // 手工新增排班
OaChangePublish int8 = 4 // 方案发布覆盖
)
// OaScheduleChange 排班变更留痕 yz_backend_oa_schedule_change
//
// 只记录“人 + 日期 + 原班次 -> 新班次”的关键信息,用于回答
// “这天谁被临时调班了、为什么调”,不做完整审计日志。
type OaScheduleChange struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
Tid int `orm:"column(tid)" json:"tid"`
EntryID uint64 `orm:"column(entry_id);default(0)" json:"entry_id"`
EmployeeID uint `orm:"column(employee_id)" json:"employee_id"`
EmployeeName string `orm:"column(employee_name);size(50);default()" json:"employee_name"`
ScheduleDate string `orm:"column(schedule_date);type(date)" json:"schedule_date"`
ChangeType int8 `orm:"column(change_type);default(1)" json:"change_type"`
OldShiftID uint64 `orm:"column(old_shift_id);default(0)" json:"old_shift_id"`
OldShiftName string `orm:"column(old_shift_name);size(50);default()" json:"old_shift_name"`
NewShiftID uint64 `orm:"column(new_shift_id);default(0)" json:"new_shift_id"`
NewShiftName string `orm:"column(new_shift_name);size(50);default()" json:"new_shift_name"`
Reason string `orm:"column(reason);size(255);default()" json:"reason"`
OperatorID uint64 `orm:"column(operator_id);default(0)" json:"operator_id"`
OperatorName string `orm:"column(operator_name);size(64);default()" json:"operator_name"`
CreateTime time.Time `orm:"column(create_time);auto_now_add;type(datetime)" json:"create_time"`
}
func (m *OaScheduleChange) TableName() string {
return "yz_backend_oa_schedule_change"
}