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"` Role string `gorm:"size:50;default:'user'" json:"role"` CreatedAt time.Time `json:"createdAt"` UpdatedAt time.Time `json:"updatedAt"` DeletedAt gorm.DeletedAt `gorm:"index" json:"-"` Serials []Serial `gorm:"foreignKey:CreatedBy" json:"-"` } // 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"` Role string `json:"role"` CreatedAt time.Time `json:"createdAt"` } // 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" validate:"required,min=3,max=50"` Password string `json:"password" validate:"required,min=6"` Name string `json:"name" validate:"required"` Email string `json:"email" validate:"omitempty,email"` Role string `json:"role" validate:"required,oneof=admin technician employee user"` } // UpdateUserDTO 管理员更新用户信息请求 type UpdateUserDTO struct { Name string `json:"name,omitempty"` Email string `json:"email,omitempty" validate:"omitempty,email"` Role string `json:"role,omitempty" validate:"omitempty,oneof=admin technician employee user"` } // 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"` 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"` } // 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"` 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"` Company *Company `gorm:"foreignKey:CompanyName;references:CompanyName" json:"company,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 时必填 // RejectReason 为客户拒绝的原因,仅 reject 时必填 type CustomerConfirmDTO struct { Action string `json:"action" validate:"required,oneof=authorize reject"` Signature string `json:"signature,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"` }