348 lines
14 KiB
Go
348 lines
14 KiB
Go
package models
|
|
|
|
import (
|
|
"time"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
// User 模型
|
|
type User struct {
|
|
ID uint `gorm:"primaryKey" json:"id"`
|
|
Username string `gorm:"uniqueIndex;size:255" json:"username"`
|
|
Password string `gorm:"size:255" json:"-"`
|
|
Name string `gorm:"size:255" json:"name"`
|
|
Email string `gorm:"size:255" json:"email"`
|
|
Phone string `gorm:"size:50" json:"phone"`
|
|
EmployeeNo string `gorm:"uniqueIndex;size:100" json:"employeeNo"`
|
|
Position string `gorm:"size:255" json:"position"`
|
|
Role string `gorm:"size:50;default:'employee'" json:"role"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
|
Serials []Serial `gorm:"foreignKey:CreatedBy" json:"-"`
|
|
EmployeeSerials []EmployeeSerial `gorm:"foreignKey:EmployeeID" json:"employeeSerials,omitempty"`
|
|
}
|
|
|
|
// Company 模型
|
|
type Company struct {
|
|
ID uint `gorm:"primaryKey" json:"id"`
|
|
CompanyName string `gorm:"uniqueIndex;size:255" json:"companyName"`
|
|
IsActive bool `gorm:"default:true" json:"isActive"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
|
Serials []Serial `gorm:"foreignKey:CompanyName;references:CompanyName" json:"-"`
|
|
}
|
|
|
|
// Serial 模型
|
|
type Serial struct {
|
|
ID uint `gorm:"primaryKey" json:"id"`
|
|
SerialNumber string `gorm:"uniqueIndex;size:255" json:"serialNumber"`
|
|
CompanyName string `gorm:"index;size:255" json:"companyName"`
|
|
ValidUntil *time.Time `json:"validUntil"`
|
|
IsActive bool `gorm:"default:true" json:"isActive"`
|
|
CreatedBy *uint `json:"createdBy"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
|
User *User `gorm:"foreignKey:CreatedBy" json:"user,omitempty"`
|
|
Company *Company `gorm:"foreignKey:CompanyName;references:CompanyName" json:"company,omitempty"`
|
|
}
|
|
|
|
// UserDTO 数据传输对象
|
|
type UserDTO struct {
|
|
ID uint `json:"id"`
|
|
Username string `json:"username"`
|
|
Name string `json:"name"`
|
|
Email string `json:"email"`
|
|
Phone string `json:"phone"`
|
|
EmployeeNo string `json:"employeeNo"`
|
|
Position string `json:"position"`
|
|
Role string `json:"role"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
EmployeeSerials []EmployeeSerial `json:"employeeSerials,omitempty"`
|
|
}
|
|
|
|
// LoginDTO 登录请求数据
|
|
type LoginDTO struct {
|
|
Username string `json:"username" validate:"required"`
|
|
Password string `json:"password" validate:"required,min=6"`
|
|
}
|
|
|
|
// ChangePasswordDTO 密码修改请求数据
|
|
type ChangePasswordDTO struct {
|
|
CurrentPassword string `json:"currentPassword" validate:"required"`
|
|
NewPassword string `json:"newPassword" validate:"required,min=6"`
|
|
}
|
|
|
|
// UpdateProfileDTO 个人信息更新请求数据
|
|
type UpdateProfileDTO struct {
|
|
Name string `json:"name" validate:"required"`
|
|
Email string `json:"email" validate:"required,email"`
|
|
}
|
|
|
|
// CreateUserDTO 管理员创建用户请求
|
|
type CreateUserDTO struct {
|
|
Username string `json:"username,omitempty"`
|
|
Password string `json:"password,omitempty"`
|
|
Name string `json:"name" validate:"required"`
|
|
Email string `json:"email" validate:"omitempty,email"`
|
|
Phone string `json:"phone" validate:"required"`
|
|
EmployeeNo string `json:"employeeNo" validate:"required"`
|
|
Position string `json:"position" validate:"required"`
|
|
Role string `json:"role" validate:"required,oneof=admin technician employee"`
|
|
}
|
|
|
|
// UpdateUserDTO 管理员更新用户信息请求
|
|
type UpdateUserDTO struct {
|
|
Name string `json:"name,omitempty"`
|
|
Email string `json:"email,omitempty" validate:"omitempty,email"`
|
|
Phone string `json:"phone,omitempty"`
|
|
EmployeeNo string `json:"employeeNo,omitempty"`
|
|
Position string `json:"position,omitempty"`
|
|
Role string `json:"role,omitempty" validate:"omitempty,oneof=admin technician employee"`
|
|
}
|
|
|
|
// AdminResetPasswordDTO 管理员重置用户密码
|
|
type AdminResetPasswordDTO struct {
|
|
NewPassword string `json:"newPassword" validate:"required,min=6"`
|
|
}
|
|
|
|
// GenerateSerialDTO 生成序列号请求数据
|
|
type GenerateSerialDTO struct {
|
|
CompanyName string `json:"companyName" validate:"required"`
|
|
Quantity int `json:"quantity" validate:"min=1,max=1000"`
|
|
ValidDays int `json:"validDays" validate:"min=1,max=3650"`
|
|
}
|
|
|
|
// GenerateWithPrefixDTO 带前缀生成序列号请求数据
|
|
type GenerateWithPrefixDTO struct {
|
|
CompanyName string `json:"companyName" validate:"required"`
|
|
Quantity int `json:"quantity" validate:"min=1,max=1000"`
|
|
ValidDays int `json:"validDays" validate:"min=1,max=3650"`
|
|
SerialPrefix string `json:"serialPrefix" validate:"omitempty,alphanum"`
|
|
}
|
|
|
|
// UpdateSerialDTO 序列号更新请求数据
|
|
type UpdateSerialDTO struct {
|
|
CompanyName string `json:"companyName,omitempty" validate:"omitempty"`
|
|
ValidUntil *time.Time `json:"validUntil,omitempty"`
|
|
IsActive *bool `json:"isActive,omitempty"`
|
|
}
|
|
|
|
// QRCodeDTO 二维码生成请求数据
|
|
type QRCodeDTO struct {
|
|
BaseUrl string `json:"baseUrl,omitempty"`
|
|
}
|
|
|
|
// LoginResponse 登录响应
|
|
type LoginResponse struct {
|
|
Message string `json:"message"`
|
|
AccessToken string `json:"accessToken"`
|
|
User UserDTO `json:"user"`
|
|
}
|
|
|
|
// BaseResponse 基础响应
|
|
type BaseResponse struct {
|
|
Message string `json:"message"`
|
|
}
|
|
|
|
// ErrorResponse 错误响应
|
|
type ErrorResponse struct {
|
|
Message string `json:"message"`
|
|
Error string `json:"error,omitempty"`
|
|
}
|
|
|
|
// DataResponse 数据响应
|
|
type DataResponse struct {
|
|
Message string `json:"message"`
|
|
Data any `json:"data"`
|
|
}
|
|
|
|
// PaginationResponse 分页响应
|
|
type PaginationResponse struct {
|
|
Message string `json:"message"`
|
|
Data any `json:"data"`
|
|
Pagination Pagination `json:"pagination"`
|
|
}
|
|
|
|
// Pagination 分页信息
|
|
type Pagination struct {
|
|
Page int `json:"page"`
|
|
Limit int `json:"limit"`
|
|
Total int64 `json:"total"`
|
|
TotalPages int `json:"totalPages"`
|
|
}
|
|
|
|
// QRCodeResponse 二维码响应
|
|
type QRCodeResponse struct {
|
|
Message string `json:"message"`
|
|
QRCodeData string `json:"qrCodeData"`
|
|
QueryURL string `json:"queryUrl"`
|
|
}
|
|
|
|
// CompanyResponse 企业响应
|
|
type CompanyResponse struct {
|
|
Message string `json:"message"`
|
|
Company Company `json:"company"`
|
|
}
|
|
|
|
// CompanyDataRequest 企业数据请求
|
|
type CompanyDataRequest struct {
|
|
CompanyName string `json:"companyName" validate:"required"`
|
|
}
|
|
|
|
// CompanyUpdateRequest 企业更新请求
|
|
type CompanyUpdateRequest struct {
|
|
CompanyName string `json:"companyName"`
|
|
IsActive *bool `json:"isActive"`
|
|
}
|
|
|
|
// CompanyStatsOverviewDTO 企业统计概览
|
|
type CompanyStatsOverviewDTO struct {
|
|
TotalCompanies int64 `json:"totalCompanies"`
|
|
ActiveCompanies int64 `json:"activeCompanies"`
|
|
InactiveCompanies int64 `json:"inactiveCompanies"`
|
|
TotalSerials int64 `json:"totalSerials"`
|
|
ActiveSerials int64 `json:"activeSerials"`
|
|
RevokedSerials int64 `json:"revokedSerials"`
|
|
TotalEmployeeSerials int64 `json:"totalEmployeeSerials"`
|
|
ActiveEmployeeSerials int64 `json:"activeEmployeeSerials"`
|
|
RevokedEmployeeSerials int64 `json:"revokedEmployeeSerials"`
|
|
TotalAftersales int64 `json:"totalAftersales"`
|
|
PendingConfirmation int64 `json:"pendingConfirmation"`
|
|
ClosedAftersales int64 `json:"closedAftersales"`
|
|
RejectedAftersales int64 `json:"rejectedAftersales"`
|
|
}
|
|
|
|
// EmployeeSerial 员工序列号模型
|
|
type EmployeeSerial struct {
|
|
ID uint `gorm:"primaryKey" json:"id"`
|
|
SerialNumber string `gorm:"uniqueIndex;size:255" json:"serialNumber"`
|
|
CompanyName string `gorm:"index;size:255" json:"companyName"`
|
|
Position string `gorm:"size:255" json:"position"`
|
|
EmployeeName string `gorm:"size:255" json:"employeeName"`
|
|
EmployeeID *uint `gorm:"index" json:"employeeId,omitempty"`
|
|
IsActive bool `gorm:"default:true" json:"isActive"`
|
|
CreatedBy *uint `json:"createdBy"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
|
User *User `gorm:"foreignKey:CreatedBy" json:"user,omitempty"`
|
|
Employee *User `gorm:"foreignKey:EmployeeID" json:"employee,omitempty"`
|
|
Company *Company `gorm:"foreignKey:CompanyName;references:CompanyName" json:"company,omitempty"`
|
|
}
|
|
|
|
// GenerateEmployeeSerialDTO 生成员工序列号请求数据
|
|
type GenerateEmployeeSerialDTO struct {
|
|
CompanyName string `json:"companyName" validate:"required"`
|
|
Position string `json:"position" validate:"required"`
|
|
EmployeeName string `json:"employeeName" validate:"required"`
|
|
Quantity int `json:"quantity" validate:"min=1,max=1000"`
|
|
SerialPrefix string `json:"serialPrefix,omitempty"`
|
|
}
|
|
|
|
// UpdateEmployeeSerialDTO 员工序列号更新请求数据
|
|
type UpdateEmployeeSerialDTO struct {
|
|
CompanyName string `json:"companyName,omitempty" validate:"omitempty"`
|
|
Position string `json:"position,omitempty" validate:"omitempty"`
|
|
EmployeeName string `json:"employeeName,omitempty" validate:"omitempty"`
|
|
IsActive *bool `json:"isActive,omitempty"`
|
|
}
|
|
|
|
// AftersalesOrder 售后工单模型
|
|
type AftersalesOrder struct {
|
|
ID uint `gorm:"primaryKey" json:"id"`
|
|
SerialNumber string `gorm:"uniqueIndex;size:64" json:"serialNumber"`
|
|
CompanyName string `gorm:"index;size:255" json:"companyName"`
|
|
CompanyAddress string `gorm:"size:500" json:"companyAddress"`
|
|
ContactName string `gorm:"size:100" json:"contactName"`
|
|
ContactPhone string `gorm:"size:32" json:"contactPhone"`
|
|
ServiceType string `gorm:"size:32" json:"serviceType"`
|
|
IssueDescription string `gorm:"type:text" json:"issueDescription"`
|
|
ResolutionNote string `gorm:"type:text" json:"resolutionNote"`
|
|
|
|
WorkOrderStatus string `gorm:"size:32;default:'created'" json:"workOrderStatus"`
|
|
AuthorizationStatus string `gorm:"size:32;default:'pending'" json:"authorizationStatus"`
|
|
|
|
TechnicianID *uint `json:"technicianId"`
|
|
CreatedBy *uint `json:"createdBy"`
|
|
ScannedAt *time.Time `json:"scannedAt"`
|
|
ConfirmedAt *time.Time `json:"confirmedAt"`
|
|
RejectCount int `gorm:"default:0" json:"rejectCount"`
|
|
Signature string `gorm:"type:text" json:"signature,omitempty"`
|
|
ResponsibleSignature string `gorm:"type:text" json:"responsibleSignature,omitempty"`
|
|
SiteImagesJSON string `gorm:"type:text;column:site_images" json:"-"`
|
|
SiteImages []string `gorm:"-" json:"siteImages,omitempty"`
|
|
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
UpdatedAt time.Time `json:"updatedAt"`
|
|
DeletedAt gorm.DeletedAt `gorm:"index" json:"-"`
|
|
|
|
Technician *User `gorm:"foreignKey:TechnicianID" json:"technician,omitempty"`
|
|
Creator *User `gorm:"foreignKey:CreatedBy" json:"creator,omitempty"`
|
|
}
|
|
|
|
// CreateAftersalesOrderDTO 创建售后工单请求数据
|
|
type CreateAftersalesOrderDTO struct {
|
|
CompanyName string `json:"companyName" validate:"required"`
|
|
CompanyAddress string `json:"companyAddress" validate:"required"`
|
|
ContactName string `json:"contactName" validate:"required"`
|
|
ContactPhone string `json:"contactPhone" validate:"required,len=11"`
|
|
ServiceType string `json:"serviceType" validate:"required,oneof=software hardware maintenance"`
|
|
IssueDescription string `json:"issueDescription" validate:"required"`
|
|
TechnicianID *uint `json:"technicianId,omitempty"`
|
|
}
|
|
|
|
// UpdateAftersalesOrderDTO 更新售后工单请求数据
|
|
type UpdateAftersalesOrderDTO struct {
|
|
CompanyAddress string `json:"companyAddress,omitempty"`
|
|
ContactName string `json:"contactName,omitempty"`
|
|
ContactPhone string `json:"contactPhone,omitempty" validate:"omitempty,len=11"`
|
|
ServiceType string `json:"serviceType,omitempty" validate:"omitempty,oneof=software hardware maintenance"`
|
|
IssueDescription string `json:"issueDescription,omitempty"`
|
|
ResolutionNote string `json:"resolutionNote,omitempty"`
|
|
TechnicianID *uint `json:"technicianId,omitempty"`
|
|
}
|
|
|
|
// SubmitForConfirmationDTO 提交客户确认请求
|
|
type SubmitForConfirmationDTO struct {
|
|
ResolutionNote string `json:"resolutionNote" validate:"required"`
|
|
}
|
|
|
|
// CustomerConfirmDTO 客户确认请求
|
|
// Signature 为客户在网页上手写签名的 base64 PNG dataURL,仅 authorize 时必填
|
|
// ResponsibleSignature 为负责人在网页上手写签名的 base64 PNG dataURL,仅 authorize 时必填
|
|
// RejectReason 为客户拒绝的原因,仅 reject 时必填
|
|
type CustomerConfirmDTO struct {
|
|
Action string `json:"action" validate:"required,oneof=authorize reject"`
|
|
Signature string `json:"signature,omitempty" validate:"required_if=Action authorize"`
|
|
ResponsibleSignature string `json:"responsibleSignature,omitempty" validate:"required_if=Action authorize"`
|
|
RejectReason string `json:"rejectReason,omitempty" validate:"required_if=Action reject"`
|
|
}
|
|
|
|
// ReassignAftersalesDTO 重新分配技术员请求
|
|
type ReassignAftersalesDTO struct {
|
|
TechnicianID uint `json:"technicianId" validate:"required"`
|
|
}
|
|
|
|
// AftersalesPublicView 公开查询返回视图(脱敏)
|
|
type AftersalesPublicView struct {
|
|
SerialNumber string `json:"serialNumber"`
|
|
CompanyName string `json:"companyName"`
|
|
CompanyAddress string `json:"companyAddress"`
|
|
ContactName string `json:"contactName"`
|
|
ServiceType string `json:"serviceType"`
|
|
IssueDescription string `json:"issueDescription"`
|
|
ResolutionNote string `json:"resolutionNote"`
|
|
WorkOrderStatus string `json:"workOrderStatus"`
|
|
AuthorizationStatus string `json:"authorizationStatus"`
|
|
TechnicianName string `json:"technicianName"`
|
|
CreatedAt time.Time `json:"createdAt"`
|
|
ConfirmedAt *time.Time `json:"confirmedAt"`
|
|
Signature string `json:"signature,omitempty"`
|
|
ResponsibleSignature string `json:"responsibleSignature,omitempty"`
|
|
SiteImages []string `json:"siteImages,omitempty"`
|
|
}
|