增加ai办公,考勤管理
This commit is contained in:
1 parent
eb9b7beff5
commit
31ae07175d
46 files changed
+9250
-296
No files matched your search
@@ -207,6 +207,8 @@ func Init(_ string) {
|
||||
new(OaSchedulePlan),
|
||||
new(OaScheduleEntry),
|
||||
new(OaScheduleChange),
|
||||
// 考勤打卡(docs/sql/create_oa_attendance.sql)
|
||||
new(OaAttendance),
|
||||
new(OaHoliday),
|
||||
new(OaNotice),
|
||||
// 工作日报(docs/sql/create_oa_dailyreport.sql)
|
||||
|
||||
@@ -0,0 +1,72 @@
|
||||
package models
|
||||
|
||||
import "time"
|
||||
|
||||
// 考勤与排班的匹配状态(match_status)
|
||||
const (
|
||||
OaAttendMatchUnknown int8 = 0 // 未判定(历史数据)
|
||||
OaAttendMatchOK int8 = 1 // 已匹配到当日排班
|
||||
OaAttendMatchMissing int8 = 2 // 未匹配到排班(仍允许打卡,只做提醒)
|
||||
)
|
||||
|
||||
// 单次打卡结果(clock_in_status / clock_out_status)
|
||||
// - 签到侧:1 正常 2 迟到 3 无排班打卡 4 不在班次时段
|
||||
// - 签退侧:1 正常 2 早退 3 无排班打卡 4 不在班次时段
|
||||
const (
|
||||
OaAttendClockNone int8 = 0 // 未打卡
|
||||
OaAttendClockNormal int8 = 1 // 正常
|
||||
OaAttendClockLate int8 = 2 // 迟到(签退侧表示早退)
|
||||
OaAttendClockNoShift int8 = 3 // 未匹配排班时的打卡
|
||||
OaAttendClockOffTime int8 = 4 // 不在班次时段内
|
||||
)
|
||||
|
||||
// 考勤数据来源(source)
|
||||
const (
|
||||
OaAttendSourceApp int8 = 1 // 移动端打卡
|
||||
OaAttendSourceWeb int8 = 2 // 后台补录
|
||||
)
|
||||
|
||||
// OaAttendance OA 考勤打卡 yz_backend_oa_attendance
|
||||
//
|
||||
// 一人一天一条:签到与签退写同一行,便于按「人 × 日期」做统计与展示。
|
||||
// 打卡时会实时联动排班明细(yz_backend_oa_schedule_entry):
|
||||
// - 匹配上:把班次名称与上下班时间快照到本表(排班后续被改也不影响历史判定);
|
||||
// - 匹配不上:match_status=2,仍正常落库,clock_*_note 记录提醒文案。
|
||||
//
|
||||
// 唯一键为 (tid, uid, attend_date):uid 是登录身份,员工档案缺失时也能打卡,
|
||||
// employee_id=0 表示未绑定员工(后台只能按账号/姓名检索到)。
|
||||
type OaAttendance struct {
|
||||
ID uint64 `orm:"column(id);pk;auto" json:"id"`
|
||||
Tid int `orm:"column(tid)" json:"tid"`
|
||||
Uid uint64 `orm:"column(uid);default(0)" json:"uid"`
|
||||
EmployeeID uint `orm:"column(employee_id);default(0)" 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"`
|
||||
AttendDate string `orm:"column(attend_date);type(date)" json:"attend_date"`
|
||||
EntryID uint64 `orm:"column(entry_id);default(0)" json:"entry_id"`
|
||||
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"`
|
||||
MatchStatus int8 `orm:"column(match_status);default(0)" json:"match_status"`
|
||||
ClockInTime *time.Time `orm:"column(clock_in_time);type(datetime);null" json:"clock_in_time"`
|
||||
ClockInStatus int8 `orm:"column(clock_in_status);default(0)" json:"clock_in_status"`
|
||||
ClockInNote string `orm:"column(clock_in_note);size(255);default()" json:"clock_in_note"`
|
||||
ClockOutTime *time.Time `orm:"column(clock_out_time);type(datetime);null" json:"clock_out_time"`
|
||||
ClockOutStatus int8 `orm:"column(clock_out_status);default(0)" json:"clock_out_status"`
|
||||
ClockOutNote string `orm:"column(clock_out_note);size(255);default()" json:"clock_out_note"`
|
||||
Location string `orm:"column(location);size(255);default()" json:"location"`
|
||||
Remark string `orm:"column(remark);size(255);default()" json:"remark"`
|
||||
Source int8 `orm:"column(source);default(1)" json:"source"`
|
||||
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"`
|
||||
}
|
||||
|
||||
func (m *OaAttendance) TableName() string {
|
||||
return "yz_backend_oa_attendance"
|
||||
}
|
||||
@@ -66,6 +66,14 @@ var PlatformSiteSettingDefs = []PlatformSiteSettingDef{
|
||||
{Tag: "privacy", Title: "隐私政策", Remark: "隐私政策链接,如 /page/privacy | group:政策条款"},
|
||||
{Tag: "terms", Title: "使用条款", Remark: "使用条款链接,如 /page/terms | group:政策条款"},
|
||||
|
||||
// 平台信息(系统设置 → 平台设置 → 平台信息)
|
||||
{Tag: "logo_square", Title: "平台 Logo(正方形)", Remark: "正方形图标,用于后台顶栏等小尺寸场景 | group:平台信息 | type:image"},
|
||||
{Tag: "logo_rect", Title: "平台 Logo(长方形)", Remark: "横向品牌图,用于页头等较宽场景 | group:平台信息 | type:image"},
|
||||
{Tag: "logo_square_dark", Title: "平台 Logo(正方形·深色主题)", Remark: "深色主题下替换方形 Logo,留空沿用浅色主题版本 | group:平台信息 | type:image"},
|
||||
{Tag: "logo_rect_dark", Title: "平台 Logo(长方形·深色主题)", Remark: "深色主题下替换横向 Logo,留空回退官网浅色 Logo | group:平台信息 | type:image"},
|
||||
{Tag: "ico", Title: "站点图标(favicon)", Remark: "浏览器标签页图标,建议 32×32 / 64×64 的 .ico 或 PNG | group:平台信息 | type:image"},
|
||||
{Tag: "platform_intro", Title: "平台简介", Remark: "平台的一句话简介,用于登录页/关于页等品牌说明 | group:平台信息 | type:textarea"},
|
||||
|
||||
// 登录页品牌(统一认证中心 /auth/login 左侧展示)
|
||||
{Tag: "login_title", Title: "登录页主标题", Remark: "登录页左侧主标题,留空则使用默认文案 | group:登录页设置"},
|
||||
{Tag: "login_subtitle", Title: "登录页副标题", Remark: "登录页左侧副标题,留空则使用默认文案 | group:登录页设置"},
|
||||
|
||||
Reference in new issue
Block a user