177 lines
11 KiB
Go
177 lines
11 KiB
Go
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"
|
||
}
|