diff --git a/README.md b/README.md index edcaae3..3ca57a9 100644 --- a/README.md +++ b/README.md @@ -24,6 +24,8 @@ 设备 `status` 仅表示归属状态(在库/已分销),业务激活状态通过 `activation_status` 返回;设备需同时具备生效中主套餐和任意已实名绑定卡才视为已激活。 +后台设备列表 `GET /api/admin/devices` 支持按 `virtual_no`、`imei`、设备名称、归属状态、激活状态、店铺、套餐系列等条件筛选。 + ### 三种客户类型 | 客户类型 | 业务特点 | 典型场景 | 钱包归属 | diff --git a/docs/admin-openapi.yaml b/docs/admin-openapi.yaml index 487fcdc..5898408 100644 --- a/docs/admin-openapi.yaml +++ b/docs/admin-openapi.yaml @@ -13162,6 +13162,13 @@ paths: description: 虚拟号(模糊查询) maxLength: 100 type: string + - description: 设备IMEI(模糊查询) + in: query + name: imei + schema: + description: 设备IMEI(模糊查询) + maxLength: 20 + type: string - description: 设备名称(模糊查询) in: query name: device_name diff --git a/docs/device-imei-search/功能总结.md b/docs/device-imei-search/功能总结.md new file mode 100644 index 0000000..006b643 --- /dev/null +++ b/docs/device-imei-search/功能总结.md @@ -0,0 +1,16 @@ +# 设备列表 IMEI 搜索功能总结 + +## 功能说明 + +后台设备列表接口 `GET /api/admin/devices` 支持通过 `imei` 查询参数按设备 IMEI 模糊搜索设备。 + +## 影响范围 + +- 请求参数新增 `imei`,最大长度 20。 +- 查询链路从 Handler 解析参数后,经 Service 传递到 Store 层过滤条件。 +- OpenAPI 文档已同步新增 `imei` 查询参数。 + +## 验证方式 + +- 执行 `go run cmd/gendocs/main.go` 重新生成 OpenAPI 文档。 +- 执行 `go build ./...` 验证编译通过。 diff --git a/internal/model/dto/device_dto.go b/internal/model/dto/device_dto.go index 418d1bd..be11eec 100644 --- a/internal/model/dto/device_dto.go +++ b/internal/model/dto/device_dto.go @@ -6,6 +6,7 @@ type ListDeviceRequest struct { Page int `json:"page" query:"page" validate:"omitempty,min=1" minimum:"1" description:"页码"` PageSize int `json:"page_size" query:"page_size" validate:"omitempty,min=1,max=100" minimum:"1" maximum:"100" description:"每页数量"` VirtualNo string `json:"virtual_no" query:"virtual_no" validate:"omitempty,max=100" maxLength:"100" description:"虚拟号(模糊查询)"` + IMEI string `json:"imei" query:"imei" validate:"omitempty,max=20" maxLength:"20" description:"设备IMEI(模糊查询)"` DeviceName string `json:"device_name" query:"device_name" validate:"omitempty,max=255" maxLength:"255" description:"设备名称(模糊查询)"` Status *int `json:"status" query:"status" validate:"omitempty,min=1,max=2" minimum:"1" maximum:"2" description:"归属状态 (1:在库, 2:已分销)"` ActivationStatus *int `json:"activation_status" query:"activation_status" validate:"omitempty,min=0,max=1" minimum:"0" maximum:"1" description:"激活状态 (0:未激活, 1:已激活;需有生效中主套餐且任意绑定卡已实名)"` diff --git a/internal/service/device/service.go b/internal/service/device/service.go index bb28c28..b92393f 100644 --- a/internal/service/device/service.go +++ b/internal/service/device/service.go @@ -87,6 +87,9 @@ func (s *Service) List(ctx context.Context, req *dto.ListDeviceRequest) (*dto.Li if req.VirtualNo != "" { filters["virtual_no"] = req.VirtualNo } + if req.IMEI != "" { + filters["imei"] = req.IMEI + } if req.DeviceName != "" { filters["device_name"] = req.DeviceName } diff --git a/internal/store/postgres/device_store.go b/internal/store/postgres/device_store.go index 6be57bb..16bced1 100644 --- a/internal/store/postgres/device_store.go +++ b/internal/store/postgres/device_store.go @@ -131,6 +131,9 @@ func (s *DeviceStore) applyDeviceFilters(query *gorm.DB, filters map[string]any) if virtualNo, ok := filters["virtual_no"].(string); ok && virtualNo != "" { query = query.Where("virtual_no LIKE ?", "%"+virtualNo+"%") } + if imei, ok := filters["imei"].(string); ok && imei != "" { + query = query.Where("imei LIKE ?", "%"+imei+"%") + } if virtualNoStart, ok := filters["virtual_no_start"].(string); ok && virtualNoStart != "" { query = query.Where("virtual_no >= ?", virtualNoStart) }