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" }