更新若干事项

This commit is contained in:
hero920103 committed 2026-10-26 08:54:34 +08:00
1 parent 68cdaf38fa
commit 9898962836
30 files changed
+7715

No files matched your search

+8
View File
@@ -190,6 +190,14 @@ func Init(_ string) {
new(BackendScheduleReminderSendLog),
new(OaSchedule),
// 平台端排班模板(docs/sql/create_platform_sched_template.sql)
new(PlatformSchedTpl),
new(PlatformSchedTplDay),
// 工作排班(docs/sql/create_oa_scheduling.sql)
new(OaShift),
new(OaSchedulePlan),
new(OaScheduleEntry),
new(OaScheduleChange),
new(OaHoliday),
new(OaNotice),
// 工作日报(docs/sql/create_oa_dailyreport.sql)
+176
View File
@@ -0,0 +1,176 @@
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"
}
+84
View File
@@ -0,0 +1,84 @@
package models
import "time"
// 排班模板对齐方式(align_mode)
//
// 1 按自然周:双休 / 单休 / 大小周,day_index 0=周一 ... 6=周日
// 2 按开始日滚动:三班倒 / 做一休一,从方案开始日期起按周期顺延
// 3 按自然月:月休,按月计算休息日
const (
SchedTplAlignWeek int8 = 1
SchedTplAlignRoll int8 = 2
SchedTplAlignMonth int8 = 3
)
// 排班模板每天类型(day_type)
const (
SchedTplDayWork int8 = 1 // 上班
SchedTplDayRest int8 = 2 // 休息
)
// 排班模板类型(template_type)
const (
SchedTplTypeDoubleWeekend int8 = 1 // 双休
SchedTplTypeSingleWeekend int8 = 2 // 单休
SchedTplTypeBigSmallWeek int8 = 3 // 大小周
SchedTplTypeMonthRest int8 = 4 // 月休
SchedTplTypeThreeShift int8 = 5 // 三班倒
SchedTplTypeWorkRestOne int8 = 6 // 做一休一
SchedTplTypeCustom int8 = 9 // 自定义
)
// PlatformSchedTpl 平台端排班模板 yz_platform_sched_tpl
//
// 模板是全局数据(不按租户隔离),只有平台端可维护;系统预置模板
// (is_system=1)由平台锁定,禁止编辑 / 删除 / 停用。租户端调用模板时
// 会把规则快照进自己的排班方案(OaSchedulePlan.Pattern),之后互不影响。
type PlatformSchedTpl struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
Code string `orm:"column(code);size(50);default()" json:"code"`
Name string `orm:"column(name);size(50)" json:"name"`
TemplateType int8 `orm:"column(template_type);default(9)" json:"template_type"`
AlignMode int8 `orm:"column(align_mode);default(1)" json:"align_mode"`
CycleDays int `orm:"column(cycle_days);default(7)" 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"`
Summary string `orm:"column(summary);size(255);default()" json:"summary"`
IsSystem int8 `orm:"column(is_system);default(0)" json:"is_system"`
Status int8 `orm:"column(status);default(1)" json:"status"`
Sort int `orm:"column(sort);default(0)" json:"sort"`
Creater string `orm:"column(creater);size(50);default()" json:"creater"`
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 *PlatformSchedTpl) TableName() string {
return "yz_platform_sched_tpl"
}
// PlatformSchedTplDay 平台端排班模板的周期每日规则 yz_platform_sched_tpl_day
//
// day_index 为周期内第几天(从 0 开始)。day_type=2 表示休息,
// 此时班次字段为空;day_type=1 时填写班次名称与上下班时间。
type PlatformSchedTplDay struct {
ID uint64 `orm:"column(id);pk;auto" json:"id"`
TemplateID uint64 `orm:"column(template_id);default(0)" json:"template_id"`
DayIndex int `orm:"column(day_index);default(0)" json:"day_index"`
DayType int8 `orm:"column(day_type);default(1)" json:"day_type"`
ShiftName string `orm:"column(shift_name);size(50);default()" json:"shift_name"`
ShiftShort string `orm:"column(shift_short);size(20);default()" json:"shift_short"`
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"`
Remark string `orm:"column(remark);size(100);default()" json:"remark"`
}
func (m *PlatformSchedTplDay) TableName() string {
return "yz_platform_sched_tpl_day"
}