sync: 同步 v1.0.4 并脱敏配置与镜像

This commit is contained in:
MiFaZhan
2026-10-29 14:36:49 +08:00
parent 743e8e6e6e
commit 2206a393f7
516 changed files with 18119 additions and 2253 deletions
+18 -3
View File
@@ -3,9 +3,24 @@ package model
import "github.com/gogf/gf/v2/os/gtime"
type AgentDeptListParam struct {
DeptName string `json:"deptName"`
Status string `json:"status"`
DeptType *int `json:"deptType"`
ExportColumnsJson string `json:"exportColumnsJson"`
Page int `json:"page" d:"1" v:"min:1|max:100000000" `
PageSize int `json:"pageSize" d:"20" v:"min:1|max:2000" `
DeptName string `json:"deptName"`
Status string `json:"status"`
DeptType *int `json:"deptType"`
}
func (in *AgentDeptListParam) NormalizePagination() {
if in.Page <= 0 {
in.Page = 1
}
if in.PageSize <= 0 {
in.PageSize = 20
}
if in.PageSize > 2000 {
in.PageSize = 2000
}
}
type AgentDeptModel struct {
+15
View File
@@ -0,0 +1,15 @@
package model
import "testing"
func TestAgentDeptPaginationDefaultsAndBounds(t *testing.T) {
for _, test := range []struct{ page, size, wantPage, wantSize int }{
{0, 0, 1, 20}, {-1, -10, 1, 20}, {3, 50, 3, 50}, {1, 5000, 1, 2000},
} {
params := AgentDeptListParam{Page: test.page, PageSize: test.size}
params.NormalizePagination()
if params.Page != test.wantPage || params.PageSize != test.wantSize {
t.Fatalf("pagination = %d/%d, want %d/%d", params.Page, params.PageSize, test.wantPage, test.wantSize)
}
}
}
+12 -5
View File
@@ -3,11 +3,18 @@ package model
import "github.com/gogf/gf/v2/os/gtime"
type AgentRoleSyncMessage struct {
TenantId string `json:"tenantId"`
SourceRoleId int64 `json:"sourceRoleId"`
SourceDeptId int64 `json:"sourceDeptId"`
ActorId int64 `json:"actorId"`
RetryCount int `json:"retryCount"`
TemplateRole bool `json:"templateRole,omitempty"`
Superseded bool `json:"superseded,omitempty"`
TaskId string `json:"taskId,omitempty"`
TotalCount int `json:"totalCount,omitempty"`
SuccessCount int `json:"successCount,omitempty"`
FailedCount int `json:"failedCount,omitempty"`
TenantId string `json:"tenantId"`
SourceRoleId int64 `json:"sourceRoleId"`
SourceDeptId int64 `json:"sourceDeptId"`
ActorId int64 `json:"actorId"`
RetryCount int `json:"retryCount"`
ChildDeptIds []int64 `json:"childDeptIds,omitempty"`
}
type AgentRoleSyncDeadLetterMessage struct {
+8 -7
View File
@@ -8,13 +8,14 @@ import (
type AgentUserListParam struct {
request.PageInfo
DeptId int64 `json:"deptId"`
UserName string `json:"userName"`
NickName string `json:"nickName"`
Email string `json:"email"`
Phonenumber string `json:"phonenumber"`
Status string `json:"status"`
CreatedAt []string `json:"createdAt"`
ExportColumnsJson string `json:"exportColumnsJson"`
DeptId int64 `json:"deptId"`
UserName string `json:"userName"`
NickName string `json:"nickName"`
Email string `json:"email"`
Phonenumber string `json:"phonenumber"`
Status string `json:"status"`
CreatedAt []string `json:"createdAt"`
}
type AgentUserListModel struct {
@@ -7,6 +7,7 @@ import (
)
type BatchCardListParam struct {
DetailStatus *int `json:"detailStatus" v:"in:0,1,2,3,4,5#明细状态不合法" dc:"明细状态"`
request.PageInfo
BatchNo string `json:"batchNo" v:"required#批次号不能为空" dc:"批次编号"`
BatchType *int `json:"batchType" dc:"批次类型"`
@@ -20,6 +21,7 @@ func (in *BatchCardListParam) Filter(ctx context.Context) (err error) {
}
type BatchCardListModel struct {
ErrorReason string `json:"errorReason" dc:"失败或待核查原因"`
allocationunits.Fields
RowNo int `json:"rowNo" dc:"行号"`
Iccid string `json:"iccid" dc:"ICCID"`
+28 -1
View File
@@ -2,10 +2,10 @@ package model
import (
"context"
"github.com/gogf/gf/v2/encoding/gjson"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/allocationunits"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/library/xgorm/hook"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/request"
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/os/gtime"
)
@@ -37,7 +37,10 @@ type BatchExecutionLogListModel struct {
BatchType int `json:"batchType" dc:"批次类型"`
SourceType *int `json:"sourceType" dc:"来源方式 枚举"`
BatchAsyncStatus int `json:"batchAsyncStatus" dc:"异步处理状态"`
RestartPhase string `json:"restartPhase" orm:"-" dc:"重启阶段 waiting_resume=等待复机"`
RestartResumeAt string `json:"restartResumeAt" orm:"-" dc:"计划复机时间"`
TotalCount int `json:"totalCount" dc:"总数量"`
UnknownCount int `json:"unknownCount" orm:"-" dc:"待核查数量"`
RunResult int `json:"runResult" dc:"运行结果"`
FailReason string `json:"failReason" dc:"失败原因"`
StartTime *gtime.Time `json:"startTime" dc:"开始时间"`
@@ -56,15 +59,36 @@ func (in *BatchExecutionLogDetailParam) Filter(ctx context.Context) (err error)
return
}
// BatchExecutionLogSyncReviewParam 手动同步待核查批次的上游执行结果。
// 只按既有受理号(jobId)重查一次,不重发办理。
type BatchExecutionLogSyncReviewParam struct {
BatchNo string `json:"batchNo" v:"required#批次号不能为空" dc:"批次编号"`
Reason string `json:"reason" dc:"同步原因"`
}
func (in *BatchExecutionLogSyncReviewParam) Filter(ctx context.Context) (err error) {
return
}
type BatchExecutionLogSyncReviewModel struct {
BatchNo string `json:"batchNo" dc:"批次编号"`
BatchType int `json:"batchType" dc:"批次类型"`
BatchAsyncStatus int `json:"batchAsyncStatus" dc:"异步处理状态"`
UnknownCount int `json:"unknownCount" dc:"待核查数量"`
Queued bool `json:"queued" dc:"是否已提交同步"`
}
type BatchExecutionLogFileModel struct {
OssId int64 `json:"ossId" dc:"OSS文件ID"`
Url string `json:"url" dc:"文件URL"`
}
type BatchExecutionLogResultFileModel struct {
ExportTaskId int64 `json:"exportTaskId,omitempty" dc:"导出任务ID"`
DownloadId int64 `json:"downloadId" dc:"下载任务ID"`
OssId int64 `json:"ossId" dc:"OSS文件ID"`
Url string `json:"url" dc:"文件URL"`
OriginalName string `json:"originalName" dc:"原始下载文件名"`
DownloadStatus int `json:"downloadStatus" dc:"下载状态"`
}
@@ -77,9 +101,12 @@ type BatchExecutionLogDetailModel struct {
BatchType int `json:"batchType" dc:"批次类型"`
SourceType *int `json:"sourceType" dc:"来源方式 枚举"`
BatchAsyncStatus int `json:"batchAsyncStatus" dc:"异步处理状态 0=已创建 1=待处理 2=处理中 3=成功 4=失败 5=部分成功"`
RestartPhase string `json:"restartPhase" orm:"-" dc:"重启阶段 waiting_resume=等待复机"`
RestartResumeAt string `json:"restartResumeAt" orm:"-" dc:"计划复机时间"`
RunResult int `json:"runResult" dc:"运行结果"`
FailReason string `json:"failReason" dc:"失败原因"`
TotalCount int `json:"totalCount" dc:"总数量"`
UnknownCount int `json:"unknownCount" dc:"待核查数量"`
StartTime *gtime.Time `json:"startTime" dc:"开始时间"`
EndTime *gtime.Time `json:"endTime" dc:"结束时间"`
SourceFile *BatchExecutionLogFileModel `json:"sourceFile" dc:"源文件"`
@@ -0,0 +1,48 @@
package model
import (
"context"
"encoding/json"
"testing"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/request"
"github.com/gogf/gf/v2/frame/g"
)
func TestBatchExecutionLogSourceTypeValidation(t *testing.T) {
page := request.PageInfo{Page: 1, PageSize: 20}
if err := g.Validator().Data(BatchExecutionLogListParam{PageInfo: page}).Run(context.Background()); err != nil {
t.Fatalf("omitted sourceType: %v", err)
}
for _, value := range []int{-1, 0, 1, 2, 3, 4, 5} {
err := g.Validator().Data(BatchExecutionLogListParam{PageInfo: page, SourceType: &value}).Run(context.Background())
valid := value >= 0 && value <= 4
if (err == nil) != valid {
t.Fatalf("sourceType=%d: valid=%t err=%v", value, valid, err)
}
}
}
func TestBatchExecutionLogDetailModelOmitsItemCounts(t *testing.T) {
payload, err := json.Marshal(BatchExecutionLogDetailModel{
TotalCount: 7,
})
if err != nil {
t.Fatalf("marshal summary model: %v", err)
}
var fields map[string]any
if err := json.Unmarshal(payload, &fields); err != nil {
t.Fatalf("decode summary model: %v", err)
}
if got := fields["totalCount"]; got != float64(7) {
t.Fatalf("totalCount = %v, want 7", got)
}
for _, field := range []string{"validCount", "successCount", "failCount"} {
if _, ok := fields[field]; ok {
t.Fatalf("summary response still contains %q", field)
}
}
}
+2 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -208,6 +208,7 @@ type BatchMainListModel struct {
// BatchMainSuccessListParam 获取指定类型成功批次列表
type BatchMainSuccessListParam struct {
request.PageInfo
ChanKey string `json:"chanKey" dc:"上游渠道编码"`
BatchType int `json:"batchType" dc:"批次类型(不传则查询所有成功批次)"`
BatchNo string `json:"batchNo" dc:"批次编号"`
Time []*gtime.Time `json:"time" dc:"批次执行时间"`
+4 -4
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
@@ -9,9 +9,9 @@ import "github.com/gogf/gf/v2/frame/g"
// 上下文结构
type Context struct {
User *Identity // 上下文用户信息
IsWebSocket bool // 是否是WebSocket
Data g.Map // 自定KV变量,业务模块根据需要设置,不固定
User *Identity // 上下文用户信息
IsWebSocket bool // 是否是WebSocket
Data g.Map // 自定KV变量,业务模块根据需要设置,不固定
}
type Role struct {
@@ -0,0 +1,18 @@
// =================================================================================
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
// =================================================================================
package do
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
)
// SysPermissionRevision is the golang structure of table sys_permission_revision for DAO operations like Where/Data.
type SysPermissionRevision struct {
g.Meta `orm:"table:sys_permission_revision, do:true"`
Id any //
Revision any //
UpdatedAt *gtime.Time //
}
@@ -0,0 +1,32 @@
// =================================================================================
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
// =================================================================================
package do
import (
"github.com/gogf/gf/v2/frame/g"
"github.com/gogf/gf/v2/os/gtime"
)
// SysRoleSyncTask is the golang structure of table sys_role_sync_task for DAO operations like Where/Data.
type SysRoleSyncTask struct {
g.Meta `orm:"table:sys_role_sync_task, do:true"`
TaskId any //
TenantId any //
SourceRoleId any //
SourceDeptId any //
ActorId any //
Status any //
Attempts any //
NextAttemptAt any //
LeaseUntil any //
LeaseToken any //
Payload any //
LastError any //
TotalCount any //
SuccessCount any //
FailedCount any //
CreatedAt *gtime.Time //
UpdatedAt *gtime.Time //
}
+26 -26
View File
@@ -11,30 +11,30 @@ import (
// SysUser is the golang structure of table sys_user for DAO operations like Where/Data.
type SysUser struct {
g.Meta `orm:"table:sys_user, do:true"`
UserId any // 用户ID
TenantId any // 租户编号
DeptId any // 部门ID
UserName any // 用户账号
NickName any // 用户昵称
UserType any // 用户类型(sys_user系统用户)
Email any // 用户邮箱
Phonenumber any // 手机号码
Sex any // 用户性别(0男 1女 2未知)
Avatar any // 头像地址
Salt any // 加密盐
Password any // 密码
IsInitPassword any // 当前密码是否未由用户本人设置(1=初始或管理员临时密码 0=用户已自设)
Status any // 帐号状态(0正常 1停用)
LoginIp any // 最后登录IP
LoginDate *gtime.Time // 最后登录时间
MfaEnabled any // 是否开启邮箱MFA 0否 1是
CreatedDept any // 创建部门
CreatedBy any // 创建者
CreatedAt *gtime.Time // 创建时间
UpdatedBy any // 更新者
UpdatedAt *gtime.Time // 更新时间
DeletedBy any // 删除人
DeletedAt *gtime.Time // 删除时间
Remark any // 备注
g.Meta `orm:"table:sys_user, do:true"`
UserId any // 用户ID
TenantId any // 租户编号
DeptId any // 部门ID
UserName any // 用户账号
NickName any // 用户昵称
UserType any // 用户类型(sys_user系统用户)
Email any // 用户邮箱
Phonenumber any // 手机号码
Sex any // 用户性别(0男 1女 2未知)
Avatar any // 头像地址
Salt any // 加密盐
Password any // 密码
IsInitPassword any // 当前密码是否未由用户本人设置(1=初始或管理员临时密码 0=用户已自设)
Status any // 帐号状态(0正常 1停用)
LoginIp any // 最后登录IP
LoginDate *gtime.Time // 最后登录时间
MfaEnabled any // 是否开启邮箱MFA 0否 1是
CreatedDept any // 创建部门
CreatedBy any // 创建者
CreatedAt *gtime.Time // 创建时间
UpdatedBy any // 更新者
UpdatedAt *gtime.Time // 更新时间
DeletedBy any // 删除人
DeletedAt *gtime.Time // 删除时间
Remark any // 备注
}
+69
View File
@@ -0,0 +1,69 @@
package model
import (
"github.com/gogf/gf/v2/os/gtime"
"git.5iot.com/iotlcm-public/iotlcm-admin-svr/internal/model/request"
)
// ExportIdentitySnapshot 提交导出时的用户身份与角色范围快照。
// 异步执行时用它还原 ctx,保证 FilterAuth 仍按提交人的数据范围过滤。
type ExportIdentitySnapshot struct {
UserId int64 `json:"userId"`
DeptId int64 `json:"deptId"`
TenantId string `json:"tenantId"`
Roles []Role `json:"roles"`
AccessCodeList []string `json:"accessCodeList"`
CurrentRoleId string `json:"currentRoleId"`
CurrentRoleDataScope string `json:"currentRoleDataScope"`
}
// DownloadCenterListParam 下载中心列表查询
type DownloadCenterListParam struct {
request.PageInfo
BizKey string `json:"bizKey" dc:"业务标识"`
Status string `json:"status" dc:"状态,多个用逗号分隔 0排队 2生成中 1已完成 3失败"`
CreatedAt []*gtime.Time `json:"createdAt" dc:"创建时间区间"`
}
// DownloadCenterListModel 下载中心列表项
type DownloadCenterListModel struct {
Id int64 `json:"id" dc:"主键ID"`
TaskNo string `json:"taskNo" dc:"任务编号"`
BizKey string `json:"bizKey" dc:"业务标识"`
BizName string `json:"bizName" dc:"业务名称"`
Status int `json:"status" dc:"状态"`
TotalCount int `json:"totalCount" dc:"导出总行数"`
FileName string `json:"fileName" dc:"文件名"`
FileSize int64 `json:"fileSize" dc:"文件大小"`
ErrorMessage string `json:"errorMessage" dc:"失败原因"`
CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"`
FinishTime *gtime.Time `json:"finishTime" dc:"完成时间"`
ExpireTime *gtime.Time `json:"expireTime" dc:"过期时间"`
DeletedTime *gtime.Time `json:"deletedTime" dc:"文件清理时间"`
DeleteReason string `json:"deleteReason" dc:"清理原因 user/expired"`
}
// DownloadCenterTaskParam 按任务ID操作
type DownloadCenterTaskParam struct {
TaskId int64 `json:"taskId" v:"required|min:1#任务ID不能为空|任务ID不正确" dc:"任务ID"`
}
// DownloadCenterDownloadModel 下载结果
type DownloadCenterDownloadModel struct {
FileName string `json:"fileName" dc:"文件名"`
OssId int64 `json:"ossId" dc:"OSS文件ID"`
TaskNo string `json:"taskNo" dc:"任务编号"`
}
// DownloadCenterRecentParam 右上角全局入口:最近任务
type DownloadCenterRecentParam struct {
Limit int `json:"limit" d:"5" dc:"返回条数"`
}
// DownloadCenterRecentModel 全局入口返回
type DownloadCenterRecentModel struct {
Items []*DownloadCenterListModel `json:"items" dc:"最近任务"`
RunningCount int `json:"runningCount" dc:"进行中数量"`
FinishedCount int `json:"finishedCount" dc:"已完成数量"`
}
@@ -0,0 +1,16 @@
// =================================================================================
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
// =================================================================================
package entity
import (
"github.com/gogf/gf/v2/os/gtime"
)
// SysPermissionRevision is the golang structure for table sys_permission_revision.
type SysPermissionRevision struct {
Id int `json:"id" orm:"id" description:""`
Revision int64 `json:"revision" orm:"revision" description:""`
UpdatedAt *gtime.Time `json:"updatedAt" orm:"updated_at" description:""`
}
@@ -0,0 +1,30 @@
// =================================================================================
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
// =================================================================================
package entity
import (
"github.com/gogf/gf/v2/os/gtime"
)
// SysRoleSyncTask is the golang structure for table sys_role_sync_task.
type SysRoleSyncTask struct {
TaskId string `json:"taskId" orm:"task_id" description:""`
TenantId string `json:"tenantId" orm:"tenant_id" description:""`
SourceRoleId int64 `json:"sourceRoleId" orm:"source_role_id" description:""`
SourceDeptId int64 `json:"sourceDeptId" orm:"source_dept_id" description:""`
ActorId int64 `json:"actorId" orm:"actor_id" description:""`
Status string `json:"status" orm:"status" description:""`
Attempts int `json:"attempts" orm:"attempts" description:""`
NextAttemptAt int64 `json:"nextAttemptAt" orm:"next_attempt_at" description:""`
LeaseUntil int64 `json:"leaseUntil" orm:"lease_until" description:""`
LeaseToken string `json:"leaseToken" orm:"lease_token" description:""`
Payload string `json:"payload" orm:"payload" description:""`
LastError string `json:"lastError" orm:"last_error" description:""`
TotalCount int `json:"totalCount" orm:"total_count" description:""`
SuccessCount int `json:"successCount" orm:"success_count" description:""`
FailedCount int `json:"failedCount" orm:"failed_count" description:""`
CreatedAt *gtime.Time `json:"createdAt" orm:"created_at" description:""`
UpdatedAt *gtime.Time `json:"updatedAt" orm:"updated_at" description:""`
}
+25 -25
View File
@@ -10,29 +10,29 @@ import (
// SysUser is the golang structure for table sys_user.
type SysUser struct {
UserId int64 `json:"userId" orm:"user_id" description:"用户ID"`
TenantId string `json:"tenantId" orm:"tenant_id" description:"租户编号"`
DeptId int64 `json:"deptId" orm:"dept_id" description:"部门ID"`
UserName string `json:"userName" orm:"user_name" description:"用户账号"`
NickName string `json:"nickName" orm:"nick_name" description:"用户昵称"`
UserType string `json:"userType" orm:"user_type" description:"用户类型(sys_user系统用户)"`
Email string `json:"email" orm:"email" description:"用户邮箱"`
Phonenumber string `json:"phonenumber" orm:"phonenumber" description:"手机号码"`
Sex string `json:"sex" orm:"sex" description:"用户性别(0男 1女 2未知)"`
Avatar string `json:"avatar" orm:"avatar" description:"头像地址"`
Salt string `json:"salt" orm:"salt" description:"加密盐"`
Password string `json:"password" orm:"password" description:"密码"`
IsInitPassword int `json:"isInitPassword" orm:"is_init_password" description:"当前密码是否未由用户本人设置(1=初始或管理员临时密码 0=用户已自设)"`
Status string `json:"status" orm:"status" description:"帐号状态(0正常 1停用)"`
LoginIp string `json:"loginIp" orm:"login_ip" description:"最后登录IP"`
LoginDate *gtime.Time `json:"loginDate" orm:"login_date" description:"最后登录时间"`
MfaEnabled int `json:"mfaEnabled" orm:"mfa_enabled" description:"是否开启邮箱MFA 0否 1是"`
CreatedDept int64 `json:"createdDept" orm:"created_dept" description:"创建部门"`
CreatedBy int64 `json:"createdBy" orm:"created_by" description:"创建者"`
CreatedAt *gtime.Time `json:"createdAt" orm:"created_at" description:"创建时间"`
UpdatedBy int64 `json:"updatedBy" orm:"updated_by" description:"更新者"`
UpdatedAt *gtime.Time `json:"updatedAt" orm:"updated_at" description:"更新时间"`
DeletedBy int64 `json:"deletedBy" orm:"deleted_by" description:"删除人"`
DeletedAt *gtime.Time `json:"deletedAt" orm:"deleted_at" description:"删除时间"`
Remark string `json:"remark" orm:"remark" description:"备注"`
UserId int64 `json:"userId" orm:"user_id" description:"用户ID"`
TenantId string `json:"tenantId" orm:"tenant_id" description:"租户编号"`
DeptId int64 `json:"deptId" orm:"dept_id" description:"部门ID"`
UserName string `json:"userName" orm:"user_name" description:"用户账号"`
NickName string `json:"nickName" orm:"nick_name" description:"用户昵称"`
UserType string `json:"userType" orm:"user_type" description:"用户类型(sys_user系统用户)"`
Email string `json:"email" orm:"email" description:"用户邮箱"`
Phonenumber string `json:"phonenumber" orm:"phonenumber" description:"手机号码"`
Sex string `json:"sex" orm:"sex" description:"用户性别(0男 1女 2未知)"`
Avatar string `json:"avatar" orm:"avatar" description:"头像地址"`
Salt string `json:"salt" orm:"salt" description:"加密盐"`
Password string `json:"password" orm:"password" description:"密码"`
IsInitPassword int `json:"isInitPassword" orm:"is_init_password" description:"当前密码是否未由用户本人设置(1=初始或管理员临时密码 0=用户已自设)"`
Status string `json:"status" orm:"status" description:"帐号状态(0正常 1停用)"`
LoginIp string `json:"loginIp" orm:"login_ip" description:"最后登录IP"`
LoginDate *gtime.Time `json:"loginDate" orm:"login_date" description:"最后登录时间"`
MfaEnabled int `json:"mfaEnabled" orm:"mfa_enabled" description:"是否开启邮箱MFA 0否 1是"`
CreatedDept int64 `json:"createdDept" orm:"created_dept" description:"创建部门"`
CreatedBy int64 `json:"createdBy" orm:"created_by" description:"创建者"`
CreatedAt *gtime.Time `json:"createdAt" orm:"created_at" description:"创建时间"`
UpdatedBy int64 `json:"updatedBy" orm:"updated_by" description:"更新者"`
UpdatedAt *gtime.Time `json:"updatedAt" orm:"updated_at" description:"更新时间"`
DeletedBy int64 `json:"deletedBy" orm:"deleted_by" description:"删除人"`
DeletedAt *gtime.Time `json:"deletedAt" orm:"deleted_at" description:"删除时间"`
Remark string `json:"remark" orm:"remark" description:"备注"`
}
@@ -0,0 +1,42 @@
// =================================================================================
// Code generated and maintained by GoFrame CLI tool. DO NOT EDIT.
// =================================================================================
package entity
import (
"github.com/gogf/gf/v2/encoding/gjson"
"github.com/gogf/gf/v2/os/gtime"
)
// TExportTask is the golang structure for table t_export_task.
type TExportTask struct {
Id int64 `json:"id" orm:"id" description:"主键ID"`
TaskNo string `json:"taskNo" orm:"task_no" description:"任务编号(=执行日志批次编号=文件名主体)"`
BizKey string `json:"bizKey" orm:"biz_key" description:"业务标识"`
BizName string `json:"bizName" orm:"biz_name" description:"业务名称"`
PermCode string `json:"permCode" orm:"perm_code" description:"导出权限码快照,K1用"`
QueryParams *gjson.Json `json:"queryParams" orm:"query_params" description:"筛选条件快照"`
IdentitySnapshot *gjson.Json `json:"identitySnapshot" orm:"identity_snapshot" description:"提交时用户身份与角色范围快照"`
Status int `json:"status" orm:"status" description:"状态 0排队 2生成中 1已完成 3失败"`
TotalCount int `json:"totalCount" orm:"total_count" description:"导出总行数"`
OssId int64 `json:"ossId" orm:"oss_id" description:"OSS文件ID"`
FileName string `json:"fileName" orm:"file_name" description:"文件名"`
FileSize int64 `json:"fileSize" orm:"file_size" description:"文件大小(字节)"`
FileMd5 string `json:"fileMd5" orm:"file_md5" description:"文件MD5"`
DownloadCount int `json:"downloadCount" orm:"download_count" description:"下载次数"`
LastDownloadTime *gtime.Time `json:"lastDownloadTime" orm:"last_download_time" description:"最后下载时间"`
ErrorMessage string `json:"errorMessage" orm:"error_message" description:"失败原因"`
OwnerUserId int64 `json:"ownerUserId" orm:"owner_user_id" description:"发起用户ID,K2用"`
DeptId int64 `json:"deptId" orm:"dept_id" description:"机构ID"`
TenantId string `json:"tenantId" orm:"tenant_id" description:"租户ID"`
CreatedDept int64 `json:"createdDept" orm:"created_dept" description:"创建部门ID"`
CreatedBy int64 `json:"createdBy" orm:"created_by" description:"创建者ID"`
CreatedAt *gtime.Time `json:"createdAt" orm:"created_at" description:"创建时间"`
StartTime *gtime.Time `json:"startTime" orm:"start_time" description:"开始生成时间"`
FinishTime *gtime.Time `json:"finishTime" orm:"finish_time" description:"完成/失败时间"`
ExpireTime *gtime.Time `json:"expireTime" orm:"expire_time" description:"文件过期时间"`
DeletedTime *gtime.Time `json:"deletedTime" orm:"deleted_time" description:"文件清理时间"`
DeleteReason string `json:"deleteReason" orm:"delete_reason" description:"文件清理原因 user/expired"`
UpdatedAt *gtime.Time `json:"updatedAt" orm:"updated_at" description:"更新时间"`
}
+18
View File
@@ -0,0 +1,18 @@
package model
// ExportColumn 导出列。
// 由前端按「当前列表显示列」传入,顺序即导出列顺序。
type ExportColumn struct {
// Field 列表模型字段名(对应 JSON tag),导出时按它取值
Field string `json:"field" dc:"字段名"`
// Label 表头文字,取列表页列标题
Label string `json:"label" dc:"列标题"`
DictType string `json:"dictType,omitempty" dc:"列表列使用的字典类型"`
// DictValueMap 字典取值前的值归一化(页面渲染前改过值时用)
DictValueMap map[string]string `json:"dictValueMap,omitempty" dc:"列表渲染前的值归一化"`
// ValueMap 固定值映射:页面用三元表达式等非字典方式渲染的列(如 1→池卡、0→单卡)
ValueMap map[string]string `json:"valueMap,omitempty" dc:"固定值映射,键为原始值"`
// ValueDefault 固定值映射未命中时的兜底文案;为空则保留原值
ValueDefault string `json:"valueDefault,omitempty" dc:"固定值映射兜底文案"`
FallbackField string `json:"fallbackField,omitempty" dc:"旧数据备用字段"`
}
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package genin
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package request
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package request
+1 -1
View File
@@ -1,7 +1,7 @@
// package response
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package response
+115
View File
@@ -0,0 +1,115 @@
package model
import (
"github.com/gogf/gf/v2/os/gtime"
)
// 卡基础信息查询 / 月历史用量查询 共用的输入模式。
const (
SimCardQueryModeExcel = "excel" // Excel 模板导入
SimCardQueryModeInput = "input" // 多行文本批量输入
SimCardQueryModeRange = "range" // 连号(起止号段)
SimCardQueryModeDept = "dept" // 按所属公司查询(仅月历史用量查询支持)
)
// 单次查询的号码条数上限。
//
// 取值依据:
// - 与现有批量卡操作上限 20000 保持一致,避免用户对「批量」能力的容量认知分裂;
// - t_export_task.query_params 是 JSON 列,20000 条号码快照约 1MB,仍在可控范围;
// - 20000 行 xlsx 约 3~5MB,导出中心单任务 10 分钟超时内可以写完。
const SimCardQueryMaxRows = 20000
// SimCardQueryExportParam 卡基础信息查询导出参数。
// Excel 模式用 File,批量输入用 BatchInput,连号模式用 Dimension/StartNum/EndNum。
type SimCardQueryExportParam struct {
Mode string `json:"mode" dc:"输入方式 excel/input/range"`
BatchInput string `json:"batchInput" dc:"批量输入内容,每行 ICCID 或 ICCID MSISDN IMSI"`
Dimension string `json:"dimension" dc:"连号维度 iccid/msisdn/imsi"`
StartNum string `json:"startNum" dc:"起始号段"`
EndNum string `json:"endNum" dc:"结束号段"`
Iccid string `json:"iccid" dc:"仅按 ICCID 精确查询"`
ExportColumnsJson string `json:"exportColumnsJson" dc:"导出列(JSON字符串)"`
ExportColumns []ExportColumn `json:"exportColumns" dc:"导出列"`
}
// SimCardUsageHistoryExportParam 月历史用量查询导出参数。
// 在卡基础信息查询的基础上增加「按所属公司」模式。
type SimCardUsageHistoryExportParam struct {
SimCardQueryExportParam
DeptId int64 `json:"deptId" dc:"所属公司部门ID,mode=dept 时必填"`
// 到期日期区间,仅 dept 模式生效;为空表示不限。
ExpireStartTime string `json:"expireStartTime" dc:"到期日期起(含)"`
ExpireEndTime string `json:"expireEndTime" dc:"到期日期止(含)"`
}
// SimCardQuerySubmitRes 提交导出后的回执。
// 文件不在本次响应里返回,用户到「下载中心」下载;执行日志里看汇总结果。
type SimCardQuerySubmitRes struct {
TaskId int64 `json:"taskId" dc:"任务ID"`
TaskNo string `json:"taskNo" dc:"任务编号"`
Total int `json:"total" dc:"预计导出行数"`
}
// SimCardQueryResolveResult 输入解析结果。
// Rows 为按输入顺序展开的待导出行,未命中的行同样保留,用于在文件里写明失败原因。
type SimCardQueryResolveResult struct {
Rows []*SimCardBaseQueryRow
HitCount int
MissCount int
// Summaries 输入侧的错误(如某行格式错误),按行记录,最终汇总进执行日志。
Summaries []string
}
// SimCardBaseQueryRow 卡基础信息查询的导出行。
// 字段顺序即无列清单时的默认导出顺序;Field 名与前端列配置的 field 一一对应。
type SimCardBaseQueryRow struct {
Iccid string `json:"iccid" dc:"ICCID"`
Msisdn string `json:"msisdn" dc:"MSISDN"`
Imsi string `json:"imsi" dc:"IMSI"`
Imei string `json:"imei" dc:"IMEI"`
UsedFlowMb float64 `json:"usedFlowMb" dc:"当月用量(MB)"`
RemainFlowMb float64 `json:"remainFlowMb" dc:"当月剩余用量(MB)"`
PackageTotalMb float64 `json:"packageTotalMb" dc:"套餐总流量(MB)"`
CardStatus int `json:"cardStatus" dc:"卡状态"`
NetModel int `json:"netModel" dc:"网络类型"`
Operators string `json:"operators" dc:"运营商"`
ActivateAt *gtime.Time `json:"activateAt" dc:"激活时间"`
OutStockTime *gtime.Time `json:"outStockTime" dc:"出库时间"`
ExpireAt *gtime.Time `json:"expireAt" dc:"到期时间"`
OutboundBatch string `json:"outboundBatch" dc:"出库批次"`
InboundBatch string `json:"inboundBatch" dc:"入库批次"`
PackageName string `json:"packageName" dc:"当前套餐名称"`
DeptName string `json:"deptName" dc:"所属企业"`
Remark string `json:"remark" dc:"备注"`
ExtraRemark string `json:"extraRemark" dc:"其他备注"`
// QueryResult / FailReason 固定在文件末尾两列,保证「部分成功」时失败原因可追溯到具体输入。
QueryResult string `json:"queryResult" dc:"查询结果"`
FailReason string `json:"failReason" dc:"失败原因"`
}
// SimCardUsageHistoryRow 月历史用量查询的导出行。
// 近 12 个月的用量按月份动态列展开,MonthValues 与请求里的月份顺序一致。
type SimCardUsageHistoryRow struct {
Iccid string `json:"iccid" dc:"ICCID"`
Msisdn string `json:"msisdn" dc:"MSISDN"`
Imsi string `json:"imsi" dc:"IMSI"`
OutStockTime *gtime.Time `json:"outStockTime" dc:"出库时间"`
ExpireAt *gtime.Time `json:"expireAt" dc:"到期时间"`
// MonthValues 由调用方按月份顺序拼成 "2026-09" 这样的键,导出时逐列取值。
// 键不存在表示「查询成功但该月没有流量记录」,导出为 "-"。
MonthValues map[string]float64 `json:"monthValues" dc:"近12个月用量(MB)"`
// UsageQueryFailed 该卡的流量数据整体查询失败(服务抖动),导出时月份列写「查询失败」,
// 与「无记录(-)」「零用量(0)」区分开,避免客户误解。
UsageQueryFailed bool `json:"usageQueryFailed" dc:"流量数据是否查询失败"`
QueryResult string `json:"queryResult" dc:"查询结果"`
FailReason string `json:"failReason" dc:"失败原因"`
}
// SimCardQueryDeptOption 所属公司下拉项。
type SimCardQueryDeptOption struct {
DeptId int64 `json:"deptId" dc:"部门ID"`
DeptName string `json:"deptName" dc:"公司名称"`
CardCount int64 `json:"cardCount" dc:"名下卡数量"`
ParentId int64 `json:"parentId" dc:"上级部门ID"`
}
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+12 -12
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
@@ -24,17 +24,17 @@ type SysDeptListParam struct {
}
type SysDeptListModel struct {
DeptId int64 `json:"deptId" orm:"dept_id" description:"部门id"`
TenantId string `json:"tenantId" orm:"tenant_id" description:"租户编号"`
DeptType int `json:"deptType" orm:"dept_type" description:"部门类型(0:部门 1:公司)"`
ParentId int64 `json:"parentId" orm:"parent_id" description:"父部门id"`
Ancestors string `json:"ancestors" orm:"ancestors" description:"祖级列表"`
DeptName string `json:"deptName" orm:"dept_name" description:"部门名称"`
DeptCategory string `json:"deptCategory" orm:"dept_category" description:"部门类别编码"`
OrderNum int `json:"orderNum" orm:"order_num" description:"显示顺序"`
Leader int64 `json:"leader" orm:"leader" description:"负责人"`
Phone string `json:"phone" orm:"phone" description:"联系电话"`
Email string `json:"email" orm:"email" description:"邮箱"`
DeptId int64 `json:"deptId" orm:"dept_id" description:"部门id"`
TenantId string `json:"tenantId" orm:"tenant_id" description:"租户编号"`
DeptType int `json:"deptType" orm:"dept_type" description:"部门类型(0:部门 1:公司)"`
ParentId int64 `json:"parentId" orm:"parent_id" description:"父部门id"`
Ancestors string `json:"ancestors" orm:"ancestors" description:"祖级列表"`
DeptName string `json:"deptName" orm:"dept_name" description:"部门名称"`
DeptCategory string `json:"deptCategory" orm:"dept_category" description:"部门类别编码"`
OrderNum int `json:"orderNum" orm:"order_num" description:"显示顺序"`
Leader int64 `json:"leader" orm:"leader" description:"负责人"`
Phone string `json:"phone" orm:"phone" description:"联系电话"`
Email string `json:"email" orm:"email" description:"邮箱"`
Status string `json:"status" orm:"status" description:"部门状态(0正常 1停用)"`
CreatedAt *gtime.Time `json:"createdAt" orm:"created_at" description:"创建时间"`
}
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+3 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
@@ -48,6 +48,8 @@ type SysRoleViewParam struct {
}
type SysRoleViewModel struct {
IsTemplateRole bool `json:"isTemplateRole" orm:"-" description:"是否为平台代理模板"`
IsDeptDefaultRole bool `json:"isDeptDefaultRole" orm:"-" description:"是否为所属机构默认角色"`
RoleId int64 `json:"roleId" orm:"role_id" description:"角色ID"`
TenantId string `json:"tenantId" orm:"tenant_id" description:"租户编号"`
DeptId int64 `json:"deptId" orm:"dept_id" description:"部门组织id"`
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+16 -16
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
@@ -68,21 +68,21 @@ type SysUserListModel struct {
}
type SysUserViewModel struct {
UserId int64 `json:"userId" orm:"user_id" description:"用户ID"`
TenantId string `json:"tenantId" orm:"tenant_id" description:"租户编号"`
DeptId int64 `json:"deptId" orm:"dept_id" description:"部门ID"`
UserName string `json:"userName" orm:"user_name" description:"用户账号"`
NickName string `json:"nickName" orm:"nick_name" description:"用户昵称"`
UserType string `json:"userType" orm:"user_type" description:"用户类型(sys_user系统用户)"`
Email string `json:"email" orm:"email" description:"用户邮箱"`
Phonenumber string `json:"phonenumber" orm:"phonenumber" description:"手机号码"`
Sex string `json:"sex" orm:"sex" description:"用户性别(0男 1女 2未知)"`
Avatar string `json:"avatar" orm:"avatar" description:"头像地址"`
Status string `json:"status" orm:"status" description:"帐号状态(0正常 1停用)"`
LoginIp string `json:"loginIp" orm:"login_ip" description:"最后登录IP"`
LoginDate *gtime.Time `json:"loginDate" orm:"login_date" description:"最后登录时间"`
MfaEnabled int64 `json:"mfaEnabled" orm:"mfa_enabled" description:"是否开启mfa验证"`
IsInitPassword int64 `json:"isInitPassword" orm:"is_init_password" description:"当前密码是否未由用户本人设置(1=初始或管理员临时密码)"`
UserId int64 `json:"userId" orm:"user_id" description:"用户ID"`
TenantId string `json:"tenantId" orm:"tenant_id" description:"租户编号"`
DeptId int64 `json:"deptId" orm:"dept_id" description:"部门ID"`
UserName string `json:"userName" orm:"user_name" description:"用户账号"`
NickName string `json:"nickName" orm:"nick_name" description:"用户昵称"`
UserType string `json:"userType" orm:"user_type" description:"用户类型(sys_user系统用户)"`
Email string `json:"email" orm:"email" description:"用户邮箱"`
Phonenumber string `json:"phonenumber" orm:"phonenumber" description:"手机号码"`
Sex string `json:"sex" orm:"sex" description:"用户性别(0男 1女 2未知)"`
Avatar string `json:"avatar" orm:"avatar" description:"头像地址"`
Status string `json:"status" orm:"status" description:"帐号状态(0正常 1停用)"`
LoginIp string `json:"loginIp" orm:"login_ip" description:"最后登录IP"`
LoginDate *gtime.Time `json:"loginDate" orm:"login_date" description:"最后登录时间"`
MfaEnabled int64 `json:"mfaEnabled" orm:"mfa_enabled" description:"是否开启mfa验证"`
IsInitPassword int64 `json:"isInitPassword" orm:"is_init_password" description:"当前密码是否未由用户本人设置(1=初始或管理员临时密码)"`
CreatedDept int64 `json:"createdDept" orm:"created_dept" description:"创建部门"`
CreatedBy int64 `json:"createdBy" orm:"created_by" description:"创建者"`
+1 -1
View File
@@ -1,7 +1,7 @@
// package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2025 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package model
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package iotin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -1,7 +1,7 @@
// Package iotin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package iot
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+38 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -103,6 +103,43 @@ type TMessageLogViewModel struct {
UpdatedBySumma *hook.MemberSumma `json:"updatedBySumma" dc:"更新者摘要信息"`
}
// TMessageLogUnreadListParam 获取当前登录用户未读消息通知
type TMessageLogUnreadListParam struct {
Limit int `json:"limit" d:"50" dc:"返回条数上限,默认50,最大200"`
}
func (in *TMessageLogUnreadListParam) Filter(ctx context.Context) (err error) {
return
}
// TMessageLogUnreadListModel 未读消息通知(右上角消息提醒数据源)
type TMessageLogUnreadListModel struct {
MessageLogId int64 `json:"messageLogId" orm:"message_log_id" dc:"主键ID"`
MessageType int `json:"messageType" orm:"message_type" dc:"消息类型 1系统通知 2活动通知 3订单通知 4账户通知"`
SendUserType int `json:"sendUserType" orm:"send_user_type" dc:"发送用户类型 1代理商 2终端用户"`
MessageTitle string `json:"messageTitle" orm:"message_title" dc:"消息标题"`
MessageContent string `json:"messageContent" orm:"message_content" dc:"消息内容"`
MessageLink string `json:"messageLink" orm:"message_link" dc:"跳转链接地址"`
SendTime *gtime.Time `json:"sendTime" orm:"send_time" dc:"发送时间"`
IsRead int `json:"isRead" orm:"is_read" dc:"是否已读 0未读 1已读"`
}
// TMessageLogReadParam 标记当前登录用户指定消息已读
type TMessageLogReadParam struct {
MessageLogId int64 `json:"messageLogId" v:"required#主键ID不能为空" dc:"主键ID"`
}
func (in *TMessageLogReadParam) Filter(ctx context.Context) (err error) {
return
}
// TMessageLogReadAllParam 标记当前登录用户全部消息已读
type TMessageLogReadAllParam struct{}
func (in *TMessageLogReadAllParam) Filter(ctx context.Context) (err error) {
return
}
// TMessageLogListParam 获取消息日志列表
type TMessageLogListParam struct {
request.PageInfo
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -1,5 +1,29 @@
package model
import (
"strings"
"github.com/gogf/gf/v2/errors/gerror"
)
const SimCardAllocateMaxInputRows = 20000
func (in *TSimCardAllocatePrepareParam) ValidateInput() error {
count := 0
for _, line := range strings.Split(in.Input, "\n") {
if strings.TrimSpace(line) != "" {
count++
if count > SimCardAllocateMaxInputRows {
return gerror.Newf("单次批量输入最多 %d 条,超出请使用 Excel 导入或分批提交", SimCardAllocateMaxInputRows)
}
}
}
if count == 0 {
return gerror.New("批量输入内容不能为空")
}
return nil
}
type TSimCardAllocateTargetListParam struct {
Keyword string `json:"keyword" dc:"目标客户名称、编码或ID"`
}
@@ -0,0 +1,26 @@
package model
import (
"strings"
"testing"
)
func TestAllocateInputLimit(t *testing.T) {
for _, test := range []struct {
name string
input string
wantError bool
}{
{"empty", " \r\n\t", true},
{"ignore blanks", "\r\n123\r\n\n456 789 012\n", false},
{"at limit", strings.Repeat("123\n", SimCardAllocateMaxInputRows), false},
{"above limit", strings.Repeat("123\n", SimCardAllocateMaxInputRows+1), true},
} {
t.Run(test.name, func(t *testing.T) {
param := &TSimCardAllocatePrepareParam{Input: test.input}
if err := param.ValidateInput(); (err != nil) != test.wantError {
t.Fatalf("ValidateInput() = %v, wantError = %v", err, test.wantError)
}
})
}
}
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+71 -65
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -184,6 +184,11 @@ type TSimCardInfoViewModel struct {
// TSimCardInfoListParam 获取卡信息表列表
type TSimCardInfoListParam struct {
request.PageInfo
// ExportColumnsJson 导出列(仅导出接口使用,JSON 字符串形式):前端传当前列表显示列
ExportColumnsJson string `json:"exportColumnsJson" dc:"导出列(JSON字符串)"`
// ExportColumns 导出列对象形式,兼容直接传数组的调用
ExportColumns []ExportColumn `json:"exportColumns" dc:"导出列"`
BossCardStatus *int `json:"bossCardStatus" dc:"运营商卡状态"`
TimeType *int `json:"timeType" dc:"时间类型"`
Time []*gtime.Time `json:"time" dc:"时间段"`
@@ -198,6 +203,7 @@ type TSimCardInfoListParam struct {
ChanKey *string `json:"chanKey" dc:"通道编号"`
CurrentPackageCode *string `json:"currentPackageCode" dc:"当前套餐编码"`
CardValue string `json:"cardValue" dc:"卡号"`
BatchInput *string `json:"batchInput" dc:"批量查询卡号(每行一个号码或 ICCID MSISDN IMSI)"`
Remark string `json:"remark" dc:"备注"`
Imei string `json:"imei" dc:"IMEI"`
DeptId int64 `json:"deptId" dc:"渠道客户ID"`
@@ -220,70 +226,70 @@ func (in *TSimCardInfoListParam) Filter(ctx context.Context) (err error) {
}
type TSimCardInfoListModel struct {
TrafficCutoffCrossMonthHold int `json:"trafficCutoffCrossMonthHold" dc:"cross-month traffic cutoff hold: 0 disabled, 1 enabled"`
Id int64 `json:"id" dc:"主键ID"`
Iccid string `json:"iccid" dc:"ICCID"`
Msisdn string `json:"msisdn" dc:"MSISDN/卡号"`
Imsi string `json:"imsi" dc:"IMSI"`
Imei string `json:"imei" dc:"IMEI"`
RegionCode string `json:"regionCode" dc:"归属地"`
DeptId int64 `json:"deptId" dc:"渠道客户ID"`
DeptName string `json:"deptName" dc:"渠道客户名称"`
CurrentPackageCode string `json:"currentPackageCode" dc:"当前套餐编号"`
PackageName string `json:"packageName" dc:"当前套餐名称"`
PackageStatus int `json:"packageStatus" dc:"套餐状态:0 无套餐,1待生效,2生效中,3已过期"`
AccessType int `json:"accessType" dc:"接入方式:ipv4、ipv6、ipv4_ipv6"`
BossCardStatus int `json:"bossCardStatus" dc:"运营商卡状态 枚举"`
CardType int `json:"cardType" dc:"卡类型 枚举"`
BossOpenAt *gtime.Time `json:"bossOpenAt" dc:"运营商开户日期"`
BossActivateAt *gtime.Time `json:"bossActivateAt" dc:"运营商激活日期"`
IsBossActivateEnabled int `json:"isBossActivateEnabled" dc:"是否按运营商激活减去赠送时长方:1是,0否"`
InboundBatchNo string `json:"inboundBatchNo" dc:"入库批次"`
OutboundBatchNo string `json:"outboundBatchNo" dc:"出库批次"`
AllocationBatchNo string `json:"allocationBatchNo" dc:"划拨批次"`
IsFlowPool int `json:"isFlowPool" dc:"是否为池卡:1是,0否"`
FlowPoolCode string `json:"flowPoolCode" dc:"流量池编号"`
OutStockTime *gtime.Time `json:"outStockTime" dc:"出库时间"`
FlowPkgBeginAt *gtime.Time `json:"flowPkgBeginAt" dc:"当前套餐生效时间"`
FlowPkgPresentAt *gtime.Time `json:"flowPkgPresentAt" dc:"套餐赠送结束时间"`
FlowPkgRealPresentAt *gtime.Time `json:"flowPkgRealPresentAt" dc:"实际赠送结束时间"`
FlowPkgEndAt *gtime.Time `json:"flowPkgEndAt" dc:"当前套餐预计到期时间"`
DataServiceStatus int `json:"dataServiceStatus" dc:"数据服务状态:1启用、0禁用"`
PackageTotalFlowMb float64 `json:"packageTotalFlowMb" dc:"套餐总流量MB"`
UsedFlowMb float64 `json:"usedFlowMb" dc:"已用流量MB"`
ReminFlowMb float64 `json:"reminFlowMb" dc:"剩余流量MB"`
TrafficCutoffStatus int `json:"trafficCutoffStatus" dc:"达量断网配置状态:0未配置,1已开启,2已关闭"`
TrafficCutoffThreshold float64 `json:"trafficCutoffThreshold" dc:"达量断网阈值"`
SmsServiceStatus int `json:"smsServiceStatus" dc:"短信服务状态:1启用、0禁用"`
PackageTotalSms int `json:"packageTotalSms" dc:"套餐短信总条数"`
UsedSms int `json:"usedSms" dc:"已用短信条数"`
VoiceServiceStatus int `json:"voiceServiceStatus" dc:"语音服务状态:1启用、0禁用"`
PackageTotalVoice int `json:"packageTotalVoice" dc:"套餐语音总分钟数"`
UsedVoice int `json:"usedVoice" dc:"已用语音分钟数"`
RoamServiceStatus int `json:"roamServiceStatus" dc:"国漫服务状态:1启用、0禁用"`
PackageTotalRoamFlowMb float64 `json:"packageTotalRoamFlowMb" dc:"套餐国际流量MB"`
UsedRoamFlowMb float64 `json:"usedRoamFlowMb" dc:"已用国际流量MB"`
StatusSyncTime *gtime.Time `json:"statusSyncTime" dc:"状态最后一次同步时间"`
FlowSyncTime *gtime.Time `json:"flowSyncTime" dc:"流量最后一次同步时间"`
SmsSyncTime *gtime.Time `json:"smsSyncTime" dc:"短信最后一次同步时间"`
VoiceSyncTime *gtime.Time `json:"voiceSyncTime" dc:"语音最后一次同步时间"`
RoamSyncTime *gtime.Time `json:"roamSyncTime" dc:"国漫最后一次同步时间"`
ExtraFeeEnabled int `json:"extraFeeEnabled" dc:"是否收取附加费:1是,0否"`
ExtraFeeMultiple float64 `json:"extraFeeMultiple" dc:"附加费用倍数"`
ExtraFee float64 `json:"extraFee" dc:"附加金额"`
ChanKey string `json:"chanKey" dc:"通道编号"`
ChanName string `json:"chanName" dc:"通道名称"`
ChanAlias string `json:"chanAlias" dc:"通道别名"`
Remark string `json:"remark" dc:"备注"`
NetModel int `json:"netModel" dc:"网络类型:4G、5G、NB-IoT"`
TenantId string `json:"tenantId" dc:"租户ID"`
CreatedDept int64 `json:"createdDept" dc:"创建部门"`
CreatedBy int64 `json:"createdBy" dc:"创建者"`
CreatedBySumma *hook.MemberSumma `json:"createdBySumma" dc:"创建者摘要信息"`
CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"`
UpdatedBy int64 `json:"updatedBy" dc:"更新者"`
UpdatedBySumma *hook.MemberSumma `json:"updatedBySumma" dc:"更新者摘要信息"`
UpdatedAt *gtime.Time `json:"updatedAt" dc:"更新时间"`
TrafficCutoffCrossMonthHold int `json:"trafficCutoffCrossMonthHold" dc:"cross-month traffic cutoff hold: 0 disabled, 1 enabled"`
Id int64 `json:"id" dc:"主键ID"`
Iccid string `json:"iccid" dc:"ICCID"`
Msisdn string `json:"msisdn" dc:"MSISDN/卡号"`
Imsi string `json:"imsi" dc:"IMSI"`
Imei string `json:"imei" dc:"IMEI"`
RegionCode string `json:"regionCode" dc:"归属地"`
DeptId int64 `json:"deptId" dc:"渠道客户ID"`
DeptName string `json:"deptName" dc:"渠道客户名称"`
CurrentPackageCode string `json:"currentPackageCode" dc:"当前套餐编号"`
PackageName string `json:"packageName" dc:"当前套餐名称"`
PackageStatus int `json:"packageStatus" dc:"套餐状态:0 无套餐,1待生效,2生效中,3已过期"`
AccessType int `json:"accessType" dc:"接入方式:ipv4、ipv6、ipv4_ipv6"`
BossCardStatus int `json:"bossCardStatus" dc:"运营商卡状态 枚举"`
CardType int `json:"cardType" dc:"卡类型 枚举"`
BossOpenAt *gtime.Time `json:"bossOpenAt" dc:"运营商开户日期"`
BossActivateAt *gtime.Time `json:"bossActivateAt" dc:"运营商激活日期"`
IsBossActivateEnabled int `json:"isBossActivateEnabled" dc:"是否按运营商激活减去赠送时长方:1是,0否"`
InboundBatchNo string `json:"inboundBatchNo" dc:"入库批次"`
OutboundBatchNo string `json:"outboundBatchNo" dc:"出库批次"`
AllocationBatchNo string `json:"allocationBatchNo" dc:"划拨批次"`
IsFlowPool int `json:"isFlowPool" dc:"是否为池卡:1是,0否"`
FlowPoolCode string `json:"flowPoolCode" dc:"流量池编号"`
OutStockTime *gtime.Time `json:"outStockTime" dc:"出库时间"`
FlowPkgBeginAt *gtime.Time `json:"flowPkgBeginAt" dc:"当前套餐生效时间"`
FlowPkgPresentAt *gtime.Time `json:"flowPkgPresentAt" dc:"套餐赠送结束时间"`
FlowPkgRealPresentAt *gtime.Time `json:"flowPkgRealPresentAt" dc:"实际赠送结束时间"`
FlowPkgEndAt *gtime.Time `json:"flowPkgEndAt" dc:"当前套餐预计到期时间"`
DataServiceStatus int `json:"dataServiceStatus" dc:"数据服务状态:1启用、0禁用"`
PackageTotalFlowMb float64 `json:"packageTotalFlowMb" dc:"套餐总流量MB"`
UsedFlowMb float64 `json:"usedFlowMb" dc:"已用流量MB"`
ReminFlowMb float64 `json:"reminFlowMb" dc:"剩余流量MB"`
TrafficCutoffStatus int `json:"trafficCutoffStatus" dc:"达量断网配置状态:0未配置,1已开启,2已关闭"`
TrafficCutoffThreshold float64 `json:"trafficCutoffThreshold" dc:"达量断网阈值"`
SmsServiceStatus int `json:"smsServiceStatus" dc:"短信服务状态:1启用、0禁用"`
PackageTotalSms int `json:"packageTotalSms" dc:"套餐短信总条数"`
UsedSms int `json:"usedSms" dc:"已用短信条数"`
VoiceServiceStatus int `json:"voiceServiceStatus" dc:"语音服务状态:1启用、0禁用"`
PackageTotalVoice int `json:"packageTotalVoice" dc:"套餐语音总分钟数"`
UsedVoice int `json:"usedVoice" dc:"已用语音分钟数"`
RoamServiceStatus int `json:"roamServiceStatus" dc:"国漫服务状态:1启用、0禁用"`
PackageTotalRoamFlowMb float64 `json:"packageTotalRoamFlowMb" dc:"套餐国际流量MB"`
UsedRoamFlowMb float64 `json:"usedRoamFlowMb" dc:"已用国际流量MB"`
StatusSyncTime *gtime.Time `json:"statusSyncTime" dc:"状态最后一次同步时间"`
FlowSyncTime *gtime.Time `json:"flowSyncTime" dc:"流量最后一次同步时间"`
SmsSyncTime *gtime.Time `json:"smsSyncTime" dc:"短信最后一次同步时间"`
VoiceSyncTime *gtime.Time `json:"voiceSyncTime" dc:"语音最后一次同步时间"`
RoamSyncTime *gtime.Time `json:"roamSyncTime" dc:"国漫最后一次同步时间"`
ExtraFeeEnabled int `json:"extraFeeEnabled" dc:"是否收取附加费:1是,0否"`
ExtraFeeMultiple float64 `json:"extraFeeMultiple" dc:"附加费用倍数"`
ExtraFee float64 `json:"extraFee" dc:"附加金额"`
ChanKey string `json:"chanKey" dc:"通道编号"`
ChanName string `json:"chanName" dc:"通道名称"`
ChanAlias string `json:"chanAlias" dc:"通道别名"`
Remark string `json:"remark" dc:"备注"`
NetModel int `json:"netModel" dc:"网络类型:4G、5G、NB-IoT"`
TenantId string `json:"tenantId" dc:"租户ID"`
CreatedDept int64 `json:"createdDept" dc:"创建部门"`
CreatedBy int64 `json:"createdBy" dc:"创建者"`
CreatedBySumma *hook.MemberSumma `json:"createdBySumma" dc:"创建者摘要信息"`
CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"`
UpdatedBy int64 `json:"updatedBy" dc:"更新者"`
UpdatedBySumma *hook.MemberSumma `json:"updatedBySumma" dc:"更新者摘要信息"`
UpdatedAt *gtime.Time `json:"updatedAt" dc:"更新时间"`
}
// TSimCardInfoExportModel 导出卡信息表
+2 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -124,6 +124,7 @@ type TSimCardStockListModel struct {
AgreementExpiryDate string `json:"agreementExpiryDate" dc:"协议到期时间"`
TenantId string `json:"tenantId" dc:"租户ID"`
CreatedDept int64 `json:"createdDept" dc:"创建部门"`
CreatedDeptName string `json:"createdDeptName" dc:"创建部门名称"`
CreatedBy int64 `json:"createdBy" dc:"创建者"`
CreatedBySumma *hook.MemberSumma `json:"createdBySumma" dc:"创建者摘要信息"`
CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"`
@@ -1,9 +1,9 @@
package model
type TSimCardTrafficCutoffOptions struct {
TrafficCutoffCrossMonthHold *int `json:"trafficCutoffCrossMonthHold" v:"in:0,1" dc:"cross-month traffic cutoff hold: 0 disabled, 1 enabled"`
TrafficCutoffStatus *int `json:"trafficCutoffStatus" v:"required#达量断网配置状态不能为空" dc:"达量断网配置状态:0未配置,1已开启,2已关闭"`
TrafficCutoffThreshold float64 `json:"trafficCutoffThreshold" v:"min:0#达量断网阈值不能小于0" dc:"达量断网阈值MB"`
TrafficCutoffCrossMonthHold *int `json:"trafficCutoffCrossMonthHold" v:"in:0,1" dc:"cross-month traffic cutoff hold: 0 disabled, 1 enabled"`
TrafficCutoffStatus *int `json:"trafficCutoffStatus" v:"required#达量断网配置状态不能为空" dc:"达量断网配置状态:0未配置,1已开启,2已关闭"`
TrafficCutoffThreshold float64 `json:"trafficCutoffThreshold" v:"min:0#达量断网阈值不能小于0" dc:"达量断网阈值MB"`
}
type TSimCardTrafficCutoffListParam struct {
@@ -12,24 +12,24 @@ type TSimCardTrafficCutoffListParam struct {
}
type TSimCardTrafficCutoffExportModel struct {
TrafficCutoffCrossMonthHold int `json:"trafficCutoffCrossMonthHold" dc:"cross-month traffic cutoff hold: 0 disabled, 1 enabled"`
Msisdn string `json:"msisdn" dc:"MSISDN/卡号"`
Iccid string `json:"iccid" dc:"ICCID"`
Imsi string `json:"imsi" dc:"IMSI"`
Imei string `json:"imei" dc:"IMEI"`
ChanName string `json:"chanName" dc:"通道"`
DeptName string `json:"deptName" dc:"所属公司"`
PackageName string `json:"packageName" dc:"当前套餐"`
TrafficCutoffStatus int `json:"trafficCutoffStatus" dc:"达量断网状态:1已开启,2已关闭"`
TrafficCutoffThreshold float64 `json:"trafficCutoffThreshold" dc:"达量断网阈值(MB)"`
TrafficCutoffCrossMonthHold int `json:"trafficCutoffCrossMonthHold" dc:"cross-month traffic cutoff hold: 0 disabled, 1 enabled"`
Msisdn string `json:"msisdn" dc:"MSISDN/卡号"`
Iccid string `json:"iccid" dc:"ICCID"`
Imsi string `json:"imsi" dc:"IMSI"`
Imei string `json:"imei" dc:"IMEI"`
ChanName string `json:"chanName" dc:"通道"`
DeptName string `json:"deptName" dc:"所属公司"`
PackageName string `json:"packageName" dc:"当前套餐"`
TrafficCutoffStatus int `json:"trafficCutoffStatus" dc:"达量断网状态:1已开启,2已关闭"`
TrafficCutoffThreshold float64 `json:"trafficCutoffThreshold" dc:"达量断网阈值(MB)"`
}
type TSimCardTrafficCutoffEditParam struct {
TrafficCutoffCrossMonthHold *int `json:"trafficCutoffCrossMonthHold" v:"in:0,1"`
Id int64 `json:"id" v:"required|min:1#卡片ID不能为空"`
Iccid string `json:"iccid" v:"required#ICCID不能为空"`
TrafficCutoffStatus *int `json:"trafficCutoffStatus" v:"required|in:1,2#达量断网状态无效"`
TrafficCutoffThreshold *float64 `json:"trafficCutoffThreshold" v:"required|min:0#达量断网阈值不能小于0"`
TrafficCutoffCrossMonthHold *int `json:"trafficCutoffCrossMonthHold" v:"in:0,1"`
Id int64 `json:"id" v:"required|min:1#卡片ID不能为空"`
Iccid string `json:"iccid" v:"required#ICCID不能为空"`
TrafficCutoffStatus *int `json:"trafficCutoffStatus" v:"required|in:1,2#达量断网状态无效"`
TrafficCutoffThreshold *float64 `json:"trafficCutoffThreshold" v:"required|min:0#达量断网阈值不能小于0"`
}
type TSimCardTrafficCutoffDeleteParam struct {
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -0,0 +1,67 @@
package model
import (
"context"
"testing"
)
func TestTSimChannelsTestParamFilterCompleteMode(t *testing.T) {
in := &TSimChannelsTestParam{
InputMode: TSimChannelsTestInputModeComplete,
Iccid: " 8986 ",
Imsi: " 4600 ",
Msisdn: " 1064 ",
}
if err := in.Filter(context.Background()); err != nil {
t.Fatalf("Filter returned error: %v", err)
}
if in.Iccid != "8986" || in.Imsi != "4600" || in.Msisdn != "1064" {
t.Fatalf("unexpected trimmed values: %#v", in)
}
}
func TestTSimChannelsTestParamFilterSingleMode(t *testing.T) {
in := &TSimChannelsTestParam{
InputMode: TSimChannelsTestInputModeSingle,
CardValueType: " IMSI ",
CardValue: " 4600 ",
}
if err := in.Filter(context.Background()); err != nil {
t.Fatalf("Filter returned error: %v", err)
}
if in.CardValueType != "imsi" || in.CardValue != "4600" {
t.Fatalf("unexpected normalized values: %#v", in)
}
}
func TestTSimChannelsTestParamFilterRejectsInvalidSingleMode(t *testing.T) {
in := &TSimChannelsTestParam{
InputMode: TSimChannelsTestInputModeSingle,
CardValueType: "imei",
CardValue: "123",
}
if err := in.Filter(context.Background()); err == nil {
t.Fatal("expected error for invalid single mode card value type")
}
}
func TestTSimChannelsTestParamFilterDirectSingleMode(t *testing.T) {
in := &TSimChannelsTestParam{
InputMode: TSimChannelsTestInputModeDirectSingle,
CardValueType: " MSISDN ",
CardValue: " 1064 ",
}
if err := in.Filter(context.Background()); err != nil {
t.Fatalf("Filter returned error: %v", err)
}
if in.CardValueType != "msisdn" || in.CardValue != "1064" {
t.Fatalf("unexpected normalized values: %#v", in)
}
}
func TestTSimChannelsTestParamFilterRejectsIncompleteDirectSingleMode(t *testing.T) {
in := &TSimChannelsTestParam{InputMode: TSimChannelsTestInputModeDirectSingle}
if err := in.Filter(context.Background()); err == nil {
t.Fatal("expected error for incomplete direct single mode")
}
}
@@ -0,0 +1,43 @@
package model
import (
"context"
"testing"
)
func TestCardValidationRemainsEnabled(t *testing.T) {
for _, items := range [][]string{nil, {"simStatus"}} {
in := &TSimChannelsTestParam{ChannelId: 42, InputMode: TSimChannelsTestInputModeDirectSingle, Items: items}
if err := in.Filter(context.Background()); err == nil {
t.Fatalf("card validation must remain enabled for %v", items)
}
}
}
func TestNormalizeTSimChannelTestItems(t *testing.T) {
t.Run("empty selects all items", func(t *testing.T) {
items, err := NormalizeTSimChannelTestItems(nil)
if err != nil {
t.Fatalf("NormalizeTSimChannelTestItems returned error: %v", err)
}
if items != nil {
t.Fatalf("expected nil items, got %#v", items)
}
})
t.Run("trims and deduplicates requested items", func(t *testing.T) {
items, err := NormalizeTSimChannelTestItems([]string{" simBasicInfo ", "simSession", "simBasicInfo"})
if err != nil {
t.Fatalf("NormalizeTSimChannelTestItems returned error: %v", err)
}
if len(items) != 2 || items[0] != "simBasicInfo" || items[1] != "simSession" {
t.Fatalf("unexpected normalized items: %#v", items)
}
})
t.Run("rejects unknown items", func(t *testing.T) {
if _, err := NormalizeTSimChannelTestItems([]string{"unknown"}); err == nil {
t.Fatal("expected an error for an unknown item")
}
})
}
+66 -66
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -186,73 +186,73 @@ func (in *TSimChannelsListParam) Filter(ctx context.Context) (err error) {
}
type TSimChannelsListModel struct {
StockCardCount int64 `json:"stockCardCount" dc:"库存卡数量"`
CardInfoCount int64 `json:"cardInfoCount" dc:"卡信息数量"`
CancellationCardCount int64 `json:"cancellationCardCount" dc:"销户卡数量"`
Id int64 `json:"id" dc:"ID"`
Operator int `json:"operator" dc:"运营商:1移动,2联通,3电信"`
TempKey string `json:"tempKey" dc:"模板标识"`
TempName string `json:"tempName" dc:"模板名称"`
ChanKey string `json:"chanKey" dc:"通道编号"`
ChanName string `json:"chanName" dc:"通道名称"`
ChanConfig string `json:"chanConfig" dc:"通道配置"`
ChanStatus int `json:"chanStatus" dc:"通道状态(0未启用,1启用)"`
ShareEnabled int `json:"shareEnabled" dc:"是否共享Token(0否,1是)"`
SyncEnabled int `json:"syncEnabled" dc:"是否轮询:0是(参与) 1否(不参与)"`
ChanAlias string `json:"chanAlias" dc:"通道别名"`
IsNormal *int `json:"isNormal" dc:"是否正常(0是,1否)"`
DockingStatus *int `json:"dockingStatus" dc:"对接信息"`
RegionCode string `json:"regionCode" dc:"通道行政区域代码(省市)"`
AppKey string `json:"appKey" dc:"应用标识"`
AppSecret string `json:"appSecret" dc:"应用密钥"`
AccessToken string `json:"accessToken" dc:"接口调用凭证"`
AccessTokenCreated *gtime.Time `json:"accessTokenCreated" dc:"凭证申请时间"`
AccessTokenExpire *gtime.Time `json:"accessTokenExpire" dc:"凭证过期时间"`
RefreshToken string `json:"refreshToken" dc:"刷新凭证"`
RefreshTokenCreated *gtime.Time `json:"refreshTokenCreated" dc:"刷新凭证申请时间"`
RefreshTokenExpire *gtime.Time `json:"refreshTokenExpire" dc:"刷新凭证过期时间"`
Remark string `json:"remark" dc:"备注"`
LoginUser string `json:"loginUser" dc:"登录账号"`
LoginPassword string `json:"loginPassword" dc:"登录密码"`
LoginUrl string `json:"loginUrl" dc:"登录地址"`
LoginState int `json:"loginState" dc:"登录状态(0未启用,1启用)"`
TenantId string `json:"tenantId" dc:"租户ID"`
CreatedDept int64 `json:"createdDept" dc:"创建部门"`
CreatedBy int64 `json:"createdBy" dc:"创建者"`
CreatedBySumma *hook.MemberSumma `json:"createdBySumma" dc:"创建者摘要信息"`
CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"`
UpdatedBy int64 `json:"updatedBy" dc:"更新者"`
UpdatedBySumma *hook.MemberSumma `json:"updatedBySumma" dc:"更新者摘要信息"`
UpdatedAt *gtime.Time `json:"updatedAt" dc:"更新时间"`
StockCardCount int64 `json:"stockCardCount" dc:"库存卡数量"`
CardInfoCount int64 `json:"cardInfoCount" dc:"卡信息数量"`
CancellationCardCount int64 `json:"cancellationCardCount" dc:"销户卡数量"`
Id int64 `json:"id" dc:"ID"`
Operator int `json:"operator" dc:"运营商:1移动,2联通,3电信"`
TempKey string `json:"tempKey" dc:"模板标识"`
TempName string `json:"tempName" dc:"模板名称"`
ChanKey string `json:"chanKey" dc:"通道编号"`
ChanName string `json:"chanName" dc:"通道名称"`
ChanConfig string `json:"chanConfig" dc:"通道配置"`
ChanStatus int `json:"chanStatus" dc:"通道状态(0未启用,1启用)"`
ShareEnabled int `json:"shareEnabled" dc:"是否共享Token(0否,1是)"`
SyncEnabled int `json:"syncEnabled" dc:"是否轮询:0是(参与) 1否(不参与)"`
ChanAlias string `json:"chanAlias" dc:"通道别名"`
IsNormal *int `json:"isNormal" dc:"是否正常(0是,1否)"`
DockingStatus *int `json:"dockingStatus" dc:"对接信息"`
RegionCode string `json:"regionCode" dc:"通道行政区域代码(省市)"`
AppKey string `json:"appKey" dc:"应用标识"`
AppSecret string `json:"appSecret" dc:"应用密钥"`
AccessToken string `json:"accessToken" dc:"接口调用凭证"`
AccessTokenCreated *gtime.Time `json:"accessTokenCreated" dc:"凭证申请时间"`
AccessTokenExpire *gtime.Time `json:"accessTokenExpire" dc:"凭证过期时间"`
RefreshToken string `json:"refreshToken" dc:"刷新凭证"`
RefreshTokenCreated *gtime.Time `json:"refreshTokenCreated" dc:"刷新凭证申请时间"`
RefreshTokenExpire *gtime.Time `json:"refreshTokenExpire" dc:"刷新凭证过期时间"`
Remark string `json:"remark" dc:"备注"`
LoginUser string `json:"loginUser" dc:"登录账号"`
LoginPassword string `json:"loginPassword" dc:"登录密码"`
LoginUrl string `json:"loginUrl" dc:"登录地址"`
LoginState int `json:"loginState" dc:"登录状态(0未启用,1启用)"`
TenantId string `json:"tenantId" dc:"租户ID"`
CreatedDept int64 `json:"createdDept" dc:"创建部门"`
CreatedBy int64 `json:"createdBy" dc:"创建者"`
CreatedBySumma *hook.MemberSumma `json:"createdBySumma" dc:"创建者摘要信息"`
CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"`
UpdatedBy int64 `json:"updatedBy" dc:"更新者"`
UpdatedBySumma *hook.MemberSumma `json:"updatedBySumma" dc:"更新者摘要信息"`
UpdatedAt *gtime.Time `json:"updatedAt" dc:"更新时间"`
}
// TSimChannelsExportModel 导出通道列表
type TSimChannelsExportModel struct {
StockCardCount int64 `json:"stockCardCount" dc:"库存卡数量"`
CardInfoCount int64 `json:"cardInfoCount" dc:"卡信息数量"`
CancellationCardCount int64 `json:"cancellationCardCount" dc:"销户卡数量"`
Id int64 `json:"id" dc:"ID"`
Operator int `json:"operator" dc:"运营商:1移动,2联通,3电信"`
TempKey string `json:"tempKey" dc:"模板标识"`
ChanKey string `json:"chanKey" dc:"通道编号"`
ChanName string `json:"chanName" dc:"通道名称"`
ChanStatus int `json:"chanStatus" dc:"通道状态(0未启用,1启用)"`
ShareEnabled int `json:"shareEnabled" dc:"是否共享Token(0否,1是)"`
ChanAlias string `json:"chanAlias" dc:"通道别名"`
RegionCode string `json:"regionCode" dc:"通道行政区域代码(省市)"`
AppKey string `json:"appKey" dc:"应用标识"`
AppSecret string `json:"appSecret" dc:"应用密钥"`
AccessTokenCreated *gtime.Time `json:"accessTokenCreated" dc:"凭证申请时间"`
AccessTokenExpire *gtime.Time `json:"accessTokenExpire" dc:"凭证过期时间"`
RefreshTokenCreated *gtime.Time `json:"refreshTokenCreated" dc:"刷新凭证申请时间"`
RefreshTokenExpire *gtime.Time `json:"refreshTokenExpire" dc:"刷新凭证过期时间"`
LoginUser string `json:"loginUser" dc:"登录账号"`
LoginPassword string `json:"loginPassword" dc:"登录密码"`
LoginState int `json:"loginState" dc:"登录状态(0未启用,1启用)"`
TenantId string `json:"tenantId" dc:"租户ID"`
CreatedDept int64 `json:"createdDept" dc:"创建部门"`
CreatedBy int64 `json:"createdBy" dc:"创建者"`
CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"`
UpdatedBy int64 `json:"updatedBy" dc:"更新者"`
UpdatedAt *gtime.Time `json:"updatedAt" dc:"更新时间"`
StockCardCount int64 `json:"stockCardCount" dc:"库存卡数量"`
CardInfoCount int64 `json:"cardInfoCount" dc:"卡信息数量"`
CancellationCardCount int64 `json:"cancellationCardCount" dc:"销户卡数量"`
Id int64 `json:"id" dc:"ID"`
Operator int `json:"operator" dc:"运营商:1移动,2联通,3电信"`
TempKey string `json:"tempKey" dc:"模板标识"`
ChanKey string `json:"chanKey" dc:"通道编号"`
ChanName string `json:"chanName" dc:"通道名称"`
ChanStatus int `json:"chanStatus" dc:"通道状态(0未启用,1启用)"`
ShareEnabled int `json:"shareEnabled" dc:"是否共享Token(0否,1是)"`
ChanAlias string `json:"chanAlias" dc:"通道别名"`
RegionCode string `json:"regionCode" dc:"通道行政区域代码(省市)"`
AppKey string `json:"appKey" dc:"应用标识"`
AppSecret string `json:"appSecret" dc:"应用密钥"`
AccessTokenCreated *gtime.Time `json:"accessTokenCreated" dc:"凭证申请时间"`
AccessTokenExpire *gtime.Time `json:"accessTokenExpire" dc:"凭证过期时间"`
RefreshTokenCreated *gtime.Time `json:"refreshTokenCreated" dc:"刷新凭证申请时间"`
RefreshTokenExpire *gtime.Time `json:"refreshTokenExpire" dc:"刷新凭证过期时间"`
LoginUser string `json:"loginUser" dc:"登录账号"`
LoginPassword string `json:"loginPassword" dc:"登录密码"`
LoginState int `json:"loginState" dc:"登录状态(0未启用,1启用)"`
TenantId string `json:"tenantId" dc:"租户ID"`
CreatedDept int64 `json:"createdDept" dc:"创建部门"`
CreatedBy int64 `json:"createdBy" dc:"创建者"`
CreatedAt *gtime.Time `json:"createdAt" dc:"创建时间"`
UpdatedBy int64 `json:"updatedBy" dc:"更新者"`
UpdatedAt *gtime.Time `json:"updatedAt" dc:"更新时间"`
}
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model
+1 -1
View File
@@ -1,7 +1,7 @@
// Package genin
// @Link https://github.com/xiujiecn/xiu-admin
// @Copyright Copyright (c) 2026 LiXiujie
// @Author Lxj <li@xiujie.cn>
// @Author Lxj <xxx@example.com>
// @License https://github.com/xiujiecn/xiu-admin/blob/master/LICENSE
// @AutoGenerate Version
package model