Files
huangjin fe3ad20fe2 'init'
2026-06-29 17:34:59 +08:00

333 lines
18 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 model
import (
"time"
)
// User 用户模型
type User struct {
BaseModel
Openid string `gorm:"uniqueIndex;size:100;not null;comment:微信OpenID" json:"openid"`
Nickname string `gorm:"size:50;comment:微信昵称" json:"nickname"`
RealName string `gorm:"size:50;comment:真实姓名" json:"real_name"`
Phone string `gorm:"size:20;comment:手机号" json:"phone"`
PhoneVerified bool `gorm:"default:false;comment:手机号是否已验证" json:"phone_verified"`
AvatarURL string `gorm:"size:500;comment:头像URL" json:"avatar_url"`
FaceImageURL string `gorm:"size:500;comment:人脸图片URL" json:"face_image_url"`
Role string `gorm:"size:20;default:visitor;comment:角色(visitor/employee/guard)" json:"role"`
Status int `gorm:"default:1;comment:用户状态1正常 0禁用" json:"status"`
}
func (User) TableName() string { return "users" }
// UserDepartment 员工-部门关联表
type UserDepartment struct {
ID uint `gorm:"primarykey;comment:主键ID" json:"id"`
CreatedAt time.Time `gorm:"comment:创建时间" json:"created_at"`
UpdatedAt time.Time `gorm:"comment:更新时间" json:"updated_at"`
UserID uint `gorm:"uniqueIndex;not null;comment:用户ID" json:"user_id"`
User *User `gorm:"foreignKey:UserID;comment:关联用户信息" json:"user,omitempty"`
DepartmentID uint `gorm:"not null;index;comment:部门ID" json:"department_id"`
Department *Department `gorm:"foreignKey:DepartmentID;comment:关联部门信息" json:"department,omitempty"`
DepartmentName string `gorm:"size:100;comment:部门名称(冗余)" json:"department_name"`
Position string `gorm:"size:100;comment:职位" json:"position"`
EmployeeType string `gorm:"size:30;default:employee;comment:员工类型" json:"employee_type"`
EmployeeStatus int `gorm:"default:1;comment:员工状态1在职 0离职" json:"employee_status"`
DingTalkUserID string `gorm:"column:ding_talk_user_id;size:100;comment:钉钉用户unionId从通讯录导入" json:"dingtalk_user_id"`
}
func (UserDepartment) TableName() string { return "user_departments" }
// Visitor 访客信息
type Visitor struct {
BaseModel
UserID *uint `gorm:"comment:关联用户ID可为空" json:"user_id"`
Company string `gorm:"size:200;comment:访客公司名称" json:"company"`
Name string `gorm:"size:50;not null;comment:访客姓名" json:"name"`
Phone string `gorm:"size:20;not null;comment:访客电话" json:"phone"`
Gender int `gorm:"comment:性别0未知 1男 2女" json:"gender"`
IDType string `gorm:"size:20;comment:证件类型" json:"id_type"`
IDNumber string `gorm:"size:50;comment:证件号码" json:"id_number"`
FaceVerified bool `gorm:"default:false;comment:是否已完成人脸验证" json:"face_verified"`
PhoneVerified bool `gorm:"default:false;comment:是否已完成手机验证" json:"phone_verified"`
}
func (Visitor) TableName() string { return "visitors" }
// Appointment 预约
type Appointment struct {
BaseModel
VisitUserID uint `gorm:"comment:被访用户ID" json:"visit_user_id"`
CreatorUserID uint `gorm:"comment:创建人用户ID" json:"creator_user_id"`
Creator *User `gorm:"foreignKey:CreatorUserID;comment:创建人信息" json:"creator,omitempty"`
VisitType string `gorm:"size:50;comment:来访目的" json:"visit_type"`
VisitStartTime time.Time `gorm:"comment:预计来访开始时间" json:"visit_start_time"`
VisitEndTime time.Time `gorm:"comment:预计来访结束时间" json:"visit_end_time"`
Status int `gorm:"default:0;comment:预约状态(0审核中 1通过 2拒绝 3取消)" json:"status"`
Remark string `gorm:"type:text;comment:备注" json:"remark"`
Comment string `gorm:"type:text;comment:审核意见" json:"comment"`
VisitPurpose string `gorm:"type:text;comment:来访目的" json:"visit_purpose"`
VisitorCompany string `gorm:"size:200;comment:来访单位名" json:"visitor_company"`
QrCodeURL string `gorm:"size:500;comment:入场二维码URL" json:"qr_code_url"`
VisitorInfo string `gorm:"type:jsonb;comment:所有访客信息(JSON数组)" json:"visitor_info"`
CreatorInfo string `gorm:"type:jsonb;comment:创建人信息(JSON)" json:"creator_info"`
EmployeeInfo string `gorm:"type:jsonb;comment:被访人信息(JSON)" json:"employee_info"`
GoodsInfo string `gorm:"type:jsonb;comment:携带物品信息(JSON)" json:"goods_info"`
AreasInfo string `gorm:"type:jsonb;comment:到访区域信息(JSON)" json:"areas_info"`
VehicleInfo string `gorm:"type:jsonb;comment:车辆信息(JSON数组)" json:"vehicle_info"`
}
func (Appointment) TableName() string { return "appointments" }
// InviteCode 邀请码
type InviteCode struct {
Code string `gorm:"primaryKey;size:100;comment:邀请码" json:"code"`
VisitUserID uint `gorm:"index;comment:被访人用户ID" json:"visit_user_id"`
VisitUser *User `gorm:"foreignKey:VisitUserID;comment:被访人信息" json:"visit_user,omitempty"`
CreatedAt time.Time `gorm:"comment:创建时间" json:"created_at"`
ExpiresAt time.Time `gorm:"comment:过期时间" json:"expires_at"`
}
func (InviteCode) TableName() string { return "invite_codes" }
// VisitRecord 访问记录
type VisitRecord struct {
BaseModel
AppointmentID uint `gorm:"comment:关联的预约ID" json:"appointment_id"`
Appointment *Appointment `gorm:"foreignKey:AppointmentID;comment:关联的预约信息" json:"appointment,omitempty"`
GuardID uint `gorm:"comment:登记保安的用户ID" json:"guard_id"`
Guard *User `gorm:"foreignKey:GuardID;comment:关联的保安用户信息" json:"guard,omitempty"`
CheckType int `gorm:"comment:登记类型1进场 2出场" json:"check_type"`
CheckTime time.Time `gorm:"comment:登记时间" json:"check_time"`
IsValid bool `gorm:"default:true;comment:是否有效" json:"is_valid"`
Remark string `gorm:"type:text;comment:备注" json:"remark"`
}
func (VisitRecord) TableName() string { return "visit_records" }
// Invitation 邀请
type Invitation struct {
BaseModel
EmployeeID uint `gorm:"comment:发起邀请的员工用户ID" json:"employee_id"`
Employee *User `gorm:"foreignKey:EmployeeID;comment:关联的员工信息" json:"employee,omitempty"`
InviteCode string `gorm:"size:100;uniqueIndex;not null;comment:邀请码" json:"invite_code"`
VisitorName string `gorm:"size:50;comment:被邀请访客姓名" json:"visitor_name"`
VisitorPhone string `gorm:"size:20;comment:被邀请访客电话" json:"visitor_phone"`
VisitType string `gorm:"size:50;comment:来访目的" json:"visit_type"`
VisitArea string `gorm:"size:200;comment:允许访问的区域" json:"visit_area"`
ValidFrom time.Time `gorm:"comment:邀请生效时间" json:"valid_from"`
ValidUntil time.Time `gorm:"comment:邀请失效时间" json:"valid_until"`
MaxUseCount int `gorm:"default:1;comment:最大使用次数" json:"max_use_count"`
UsedCount int `gorm:"default:0;comment:已使用次数" json:"used_count"`
IsActive bool `gorm:"default:true;comment:是否有效" json:"is_active"`
}
func (Invitation) TableName() string { return "invitations" }
// Banner 首页轮播图
type Banner struct {
BaseModel
ImageURL string `gorm:"size:500;not null;comment:图片地址" json:"image_url"`
JumpPath string `gorm:"size:500;comment:跳转链接" json:"jump_path"`
IsJump bool `gorm:"default:false;comment:是否可跳转" json:"is_jump"`
Sort int `gorm:"default:0;comment:排序号" json:"sort"`
IsValid bool `gorm:"default:true;comment:是否有效" json:"is_valid"`
}
func (Banner) TableName() string { return "banners" }
// Department 部门(树形结构)
type Department struct {
BaseModel
Name string `gorm:"size:100;not null;comment:部门名称" json:"name"`
ParentID *uint `gorm:"comment:上级部门ID" json:"parent_id"`
Parent *Department `gorm:"foreignKey:ParentID;comment:上级部门" json:"parent,omitempty"`
Children []Department `gorm:"foreignKey:ParentID;comment:子部门列表" json:"children,omitempty"`
LeaderID *uint `gorm:"comment:部门负责人部长用户ID" json:"leader_id"`
Leader *User `gorm:"foreignKey:LeaderID;comment:部门负责人信息" json:"leader,omitempty"`
DeputyID *uint `gorm:"comment:部门副负责人副部长用户ID" json:"deputy_id"`
Deputy *User `gorm:"foreignKey:DeputyID;comment:部门副负责人信息" json:"deputy,omitempty"`
ApproverUserIDs string `gorm:"type:text;comment:部门指定审批人用户ID列表(JSON数组)" json:"approver_user_ids"`
VpUserIDs string `gorm:"type:text;comment:分管领导用户ID列表(JSON数组)" json:"vp_user_ids"`
Sort int `gorm:"default:0;comment:排序号" json:"sort"`
Status int `gorm:"default:1;comment:状态1启用 0禁用" json:"status"`
Description string `gorm:"size:200;comment:部门描述" json:"description"`
}
func (Department) TableName() string { return "departments" }
// EmployeeCertification 角色认证申请
type EmployeeCertification struct {
BaseModel
UserID uint `gorm:"not null;index;comment:申请人用户ID" json:"user_id"`
User *User `gorm:"foreignKey:UserID;comment:关联的申请人信息" json:"user,omitempty"`
RealName string `gorm:"size:50;not null;comment:真实姓名" json:"real_name"`
Phone string `gorm:"size:20;not null;comment:手机号" json:"phone"`
Role string `gorm:"size:20;default:员工;comment:角色类型(员工/保安)" json:"role"`
Snapshot []string `gorm:"type:text;serializer:json;comment:材料截图URL列表" json:"snapshot"`
Position string `gorm:"size:100;comment:职位" json:"position"`
DepartmentID *uint `gorm:"comment:分配的部门ID审核通过后设置" json:"department_id"`
Department *Department `gorm:"foreignKey:DepartmentID;comment:关联的部门信息" json:"department,omitempty"`
Status int `gorm:"default:0;comment:审核状态0待审核 1通过 2拒绝" json:"status"`
ApproverID *uint `gorm:"comment:审批人用户ID" json:"approver_id"`
Approver *User `gorm:"foreignKey:ApproverID;comment:关联的审批人信息" json:"approver,omitempty"`
Comment string `gorm:"type:text;comment:审核意见" json:"comment"`
}
func (EmployeeCertification) TableName() string { return "employee_certifications" }
// Notice 系统通知
type Notice struct {
BaseModel
Title string `gorm:"size:200;not null;comment:通知标题" json:"title"`
Content string `gorm:"type:text;not null;comment:通知内容" json:"content"`
IsValid bool `gorm:"default:true;comment:是否有效" json:"is_valid"`
Sort int `gorm:"default:0;comment:排序号" json:"sort"`
}
func (Notice) TableName() string { return "notices" }
// Notification 用户通知
type Notification struct {
BaseModel
UserID uint `gorm:"index;not null;comment:接收用户ID" json:"user_id"`
User *User `gorm:"foreignKey:UserID;comment:关联的用户信息" json:"user,omitempty"`
Title string `gorm:"size:200;not null;comment:通知标题" json:"title"`
Content string `gorm:"type:text;not null;comment:通知内容" json:"content"`
Type string `gorm:"size:50;default:appointment;comment:通知类型(appointment/certification)" json:"type"`
RefID *uint `gorm:"comment:关联业务ID" json:"ref_id"`
IsRead bool `gorm:"default:false;comment:是否已读" json:"is_read"`
}
func (Notification) TableName() string { return "notifications" }
// GoodsTemplate 物品模板
type GoodsTemplate struct {
BaseModel
UserID uint `gorm:"index;not null;comment:用户ID" json:"user_id"`
Name string `gorm:"size:200;not null;comment:物品名称" json:"name"`
Quantity int `gorm:"default:1;comment:物品数量" json:"quantity"`
Model string `gorm:"size:100;comment:物品型号" json:"model"`
Remark string `gorm:"type:text;comment:物品备注" json:"remark"`
}
func (GoodsTemplate) TableName() string { return "goods_templates" }
// VehicleInfo 用户车辆信息
type VehicleInfo struct {
BaseModel
UserID uint `gorm:"index;not null;comment:用户ID" json:"user_id"`
LicensePlate string `gorm:"size:20;comment:车牌号" json:"license_plate"`
Brand string `gorm:"size:50;comment:品牌型号" json:"brand"`
Color string `gorm:"size:20;comment:车辆颜色" json:"color"`
}
func (VehicleInfo) TableName() string { return "vehicle_infos" }
// ==================== 工作流引擎模型 ====================
// ProcessDefinition 流程定义
type ProcessDefinition struct {
BaseModel
ProcessName string `gorm:"size:100;not null;comment:流程名称" json:"process_name"`
ProcessCode string `gorm:"uniqueIndex;size:50;not null;comment:流程编码" json:"process_code"`
Source string `gorm:"size:100;comment:流程来源" json:"source"`
Description string `gorm:"size:200;comment:流程描述" json:"description"`
IsActive bool `gorm:"default:true;comment:是否启用" json:"is_active"`
RevokeEvents string `gorm:"type:text;comment:撤销事件JSON" json:"revoke_events"`
NodesJSON string `gorm:"type:text;comment:节点配置JSON" json:"nodes_json"`
}
func (ProcessDefinition) TableName() string { return "process_definitions" }
// ProcessInstance 流程实例
type ProcessInstance struct {
BaseModel
ProcessDefID uint `gorm:"index;not null;comment:流程定义ID" json:"process_def_id"`
ProcessDef *ProcessDefinition `gorm:"foreignKey:ProcessDefID" json:"process_def,omitempty"`
BusinessType string `gorm:"size:50;not null;comment:业务类型" json:"business_type"`
BusinessID uint `gorm:"index;not null;comment:业务ID" json:"business_id"`
Status int `gorm:"default:0;comment:实例状态0运行中 1已完成 2已终止 3已撤销" json:"status"`
StarterID uint `gorm:"comment:发起人用户ID" json:"starter_id"`
Starter *User `gorm:"foreignKey:StarterID" json:"starter,omitempty"`
CurrentNodeID string `gorm:"size:50;comment:当前节点ID" json:"current_node_id"`
Variables string `gorm:"type:text;comment:流程变量JSON" json:"variables"`
FinishedAt *time.Time `gorm:"comment:完成时间" json:"finished_at"`
}
func (ProcessInstance) TableName() string { return "process_instances" }
// Task 任务
type Task struct {
BaseModel
InstanceID uint `gorm:"index;not null;comment:流程实例ID" json:"instance_id"`
Instance *ProcessInstance `gorm:"foreignKey:InstanceID" json:"instance,omitempty"`
NodeID string `gorm:"size:50;not null;comment:节点ID" json:"node_id"`
NodeName string `gorm:"size:100;comment:节点名称" json:"node_name"`
Status int `gorm:"default:0;comment:任务状态0待处理 1已完成 2已拒绝 3已取消" json:"status"`
AssigneeID *uint `gorm:"comment:处理人用户ID" json:"assignee_id"`
Assignee *User `gorm:"foreignKey:AssigneeID" json:"assignee,omitempty"`
Comment string `gorm:"type:text;comment:处理意见" json:"comment"`
HandledAt *time.Time `gorm:"comment:处理时间" json:"handled_at"`
}
func (Task) TableName() string { return "tasks" }
// AdminUser 后台管理员账号
type AdminUser struct {
BaseModel
Account string `gorm:"uniqueIndex;size:50;not null;comment:登录账号" json:"account"`
Password string `gorm:"size:200;not null;comment:密码(SHA256)" json:"-"`
Name string `gorm:"size:50;comment:管理员姓名" json:"name"`
IsSuper bool `gorm:"default:false;comment:是否超级管理员" json:"is_super"`
Status int `gorm:"default:1;comment:状态(1正常 0禁用)" json:"status"`
}
func (AdminUser) TableName() string { return "admin_users" }
// VisitorArea 到访区域
type VisitorArea struct {
BaseModel
Name string `gorm:"size:100;not null;comment:区域名称" json:"name"`
Sort int `gorm:"default:0;comment:排序号" json:"sort"`
Status int `gorm:"default:1;comment:状态1启用 0禁用" json:"status"`
}
func (VisitorArea) TableName() string { return "visitor_areas" }
// VisitType 来访目的
type VisitType struct {
BaseModel
Name string `gorm:"size:100;not null;comment:类型名称" json:"name"`
Sort int `gorm:"default:0;comment:排序号" json:"sort"`
Status int `gorm:"default:1;comment:状态1启用 0禁用" json:"status"`
}
func (VisitType) TableName() string { return "visit_types" }
// PendingEmployee 待确认员工(通讯录导入)
type PendingEmployee struct {
BaseModel
RealName string `gorm:"size:50;not null;index;comment:真实姓名" json:"real_name"`
Phone string `gorm:"size:20;not null;index;comment:手机号" json:"phone"`
DepartmentID uint `gorm:"not null;comment:部门ID" json:"department_id"`
DepartmentName string `gorm:"size:100;comment:部门名称" json:"department_name"`
Position string `gorm:"size:100;comment:职位" json:"position"`
EmployeeType string `gorm:"size:30;default:employee;comment:员工类型" json:"employee_type"`
DingTalkUserID string `gorm:"column:ding_talk_user_id;size:100;comment:钉钉用户unionId" json:"dingtalk_user_id"`
IsMatched bool `gorm:"default:false;comment:是否已匹配用户" json:"is_matched"`
MatchedUserID *uint `gorm:"comment:匹配到的用户ID" json:"matched_user_id"`
MatchedAt *time.Time `gorm:"comment:匹配时间" json:"matched_at"`
}
func (PendingEmployee) TableName() string { return "pending_employees" }
// GlobalApprover 全局兜底审批人
type GlobalApprover struct {
BaseModel
UserID uint `gorm:"uniqueIndex;not null;comment:审批人用户ID" json:"user_id"`
User *User `gorm:"foreignKey:UserID;comment:关联用户信息" json:"user,omitempty"`
}
func (GlobalApprover) TableName() string { return "global_approvers" }