feat: 添加设备和订单汇总接口,支持获取当前用户的设备和订单统计信息,优化授权码管理和设备筛选功能

This commit is contained in:
wood911010 committed 2026-01-16 22:42:27 +08:00
1 parent e91775ea76
commit 973b549298
6 files changed
+665 -9

No files matched your search

+246
View File
@@ -25,6 +25,87 @@ const docTemplate = `{
"host": "{{.Host}}",
"basePath": "{{.BasePath}}",
"paths": {
"/api/cu/authorization-codes/product-activation-code": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "获取产品激活码:{授权码}\u0026{payload}(payload 为 RSA-PSS-SHA256 签名封装串)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"用户端授权码管理"
],
"summary": "获取产品激活码",
"parameters": [
{
"description": "获取产品激活码请求",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.ProductActivationCodeRequest"
}
}
],
"responses": {
"200": {
"description": "获取成功",
"schema": {
"allOf": [
{
"$ref": "#/definitions/models.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/models.ProductActivationCodeResponse"
}
}
}
]
}
},
"400": {
"description": "请求参数无效",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"401": {
"description": "未认证",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"403": {
"description": "授权码已被锁定",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"404": {
"description": "授权码不存在或已过期",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"500": {
"description": "服务器内部错误",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
}
}
}
},
"/api/cu/authorization-codes/{codeId}/share": {
"post": {
"security": [
@@ -161,6 +242,12 @@ const docTemplate = `{
"description": "按授权码ID筛选设备",
"name": "authorization_code_id",
"in": "query"
},
{
"type": "boolean",
"description": "是否在线筛选:true在线,false离线",
"name": "is_online",
"in": "query"
}
],
"responses": {
@@ -203,6 +290,58 @@ const docTemplate = `{
}
}
},
"/api/cu/devices/summary": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "获取当前登录用户的设备汇总统计信息(总数、在线数、离线数)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"客户设备管理"
],
"summary": "获取设备汇总统计",
"responses": {
"200": {
"description": "获取成功",
"schema": {
"allOf": [
{
"$ref": "#/definitions/models.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/models.DeviceSummaryResponse"
}
}
}
]
}
},
"401": {
"description": "未认证",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"500": {
"description": "服务器内部错误",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
}
}
}
},
"/api/cu/devices/{id}": {
"delete": {
"security": [
@@ -666,6 +805,58 @@ const docTemplate = `{
}
}
},
"/api/cu/orders/summary": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "获取当前登录用户的订单汇总统计信息(总数、待支付数、已支付数)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"客户订单管理"
],
"summary": "获取订单汇总统计",
"responses": {
"200": {
"description": "获取成功",
"schema": {
"allOf": [
{
"$ref": "#/definitions/models.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/models.OrderSummaryResponse"
}
}
}
]
}
},
"401": {
"description": "未认证",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"500": {
"description": "服务器内部错误",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
}
}
}
},
"/api/cu/orders/{order_id}": {
"get": {
"security": [
@@ -5375,6 +5566,23 @@ const docTemplate = `{
}
}
},
"models.DeviceSummaryResponse": {
"type": "object",
"properties": {
"offline_devices": {
"description": "离线设备数",
"type": "integer"
},
"online_devices": {
"description": "在线设备数",
"type": "integer"
},
"total_devices": {
"description": "设备总数",
"type": "integer"
}
}
},
"models.EnumItem": {
"type": "object",
"properties": {
@@ -5833,6 +6041,23 @@ const docTemplate = `{
}
}
},
"models.OrderSummaryResponse": {
"type": "object",
"properties": {
"paid_orders": {
"description": "已支付订单数",
"type": "integer"
},
"pending_orders": {
"description": "待支付订单数",
"type": "integer"
},
"total_orders": {
"description": "订单总数",
"type": "integer"
}
}
},
"models.PaymentBusinessOrder": {
"type": "object",
"properties": {
@@ -5946,6 +6171,27 @@ const docTemplate = `{
}
}
},
"models.ProductActivationCodeRequest": {
"type": "object",
"required": [
"authorization_code"
],
"properties": {
"authorization_code": {
"description": "授权码(旧规则格式)",
"type": "string"
}
}
},
"models.ProductActivationCodeResponse": {
"type": "object",
"properties": {
"product_activation_code": {
"description": "产品激活码:{授权码}\u0026{payload}",
"type": "string"
}
}
},
"models.RecentAuthorization": {
"type": "object",
"properties": {
+246
View File
@@ -21,6 +21,87 @@
},
"basePath": "/",
"paths": {
"/api/cu/authorization-codes/product-activation-code": {
"post": {
"security": [
{
"BearerAuth": []
}
],
"description": "获取产品激活码:{授权码}\u0026{payload}(payload 为 RSA-PSS-SHA256 签名封装串)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"用户端授权码管理"
],
"summary": "获取产品激活码",
"parameters": [
{
"description": "获取产品激活码请求",
"name": "request",
"in": "body",
"required": true,
"schema": {
"$ref": "#/definitions/models.ProductActivationCodeRequest"
}
}
],
"responses": {
"200": {
"description": "获取成功",
"schema": {
"allOf": [
{
"$ref": "#/definitions/models.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/models.ProductActivationCodeResponse"
}
}
}
]
}
},
"400": {
"description": "请求参数无效",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"401": {
"description": "未认证",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"403": {
"description": "授权码已被锁定",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"404": {
"description": "授权码不存在或已过期",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"500": {
"description": "服务器内部错误",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
}
}
}
},
"/api/cu/authorization-codes/{codeId}/share": {
"post": {
"security": [
@@ -157,6 +238,12 @@
"description": "按授权码ID筛选设备",
"name": "authorization_code_id",
"in": "query"
},
{
"type": "boolean",
"description": "是否在线筛选:true在线,false离线",
"name": "is_online",
"in": "query"
}
],
"responses": {
@@ -199,6 +286,58 @@
}
}
},
"/api/cu/devices/summary": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "获取当前登录用户的设备汇总统计信息(总数、在线数、离线数)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"客户设备管理"
],
"summary": "获取设备汇总统计",
"responses": {
"200": {
"description": "获取成功",
"schema": {
"allOf": [
{
"$ref": "#/definitions/models.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/models.DeviceSummaryResponse"
}
}
}
]
}
},
"401": {
"description": "未认证",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"500": {
"description": "服务器内部错误",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
}
}
}
},
"/api/cu/devices/{id}": {
"delete": {
"security": [
@@ -662,6 +801,58 @@
}
}
},
"/api/cu/orders/summary": {
"get": {
"security": [
{
"BearerAuth": []
}
],
"description": "获取当前登录用户的订单汇总统计信息(总数、待支付数、已支付数)",
"consumes": [
"application/json"
],
"produces": [
"application/json"
],
"tags": [
"客户订单管理"
],
"summary": "获取订单汇总统计",
"responses": {
"200": {
"description": "获取成功",
"schema": {
"allOf": [
{
"$ref": "#/definitions/models.APIResponse"
},
{
"type": "object",
"properties": {
"data": {
"$ref": "#/definitions/models.OrderSummaryResponse"
}
}
}
]
}
},
"401": {
"description": "未认证",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
},
"500": {
"description": "服务器内部错误",
"schema": {
"$ref": "#/definitions/models.ErrorResponse"
}
}
}
}
},
"/api/cu/orders/{order_id}": {
"get": {
"security": [
@@ -5371,6 +5562,23 @@
}
}
},
"models.DeviceSummaryResponse": {
"type": "object",
"properties": {
"offline_devices": {
"description": "离线设备数",
"type": "integer"
},
"online_devices": {
"description": "在线设备数",
"type": "integer"
},
"total_devices": {
"description": "设备总数",
"type": "integer"
}
}
},
"models.EnumItem": {
"type": "object",
"properties": {
@@ -5829,6 +6037,23 @@
}
}
},
"models.OrderSummaryResponse": {
"type": "object",
"properties": {
"paid_orders": {
"description": "已支付订单数",
"type": "integer"
},
"pending_orders": {
"description": "待支付订单数",
"type": "integer"
},
"total_orders": {
"description": "订单总数",
"type": "integer"
}
}
},
"models.PaymentBusinessOrder": {
"type": "object",
"properties": {
@@ -5942,6 +6167,27 @@
}
}
},
"models.ProductActivationCodeRequest": {
"type": "object",
"required": [
"authorization_code"
],
"properties": {
"authorization_code": {
"description": "授权码(旧规则格式)",
"type": "string"
}
}
},
"models.ProductActivationCodeResponse": {
"type": "object",
"properties": {
"product_activation_code": {
"description": "产品激活码:{授权码}\u0026{payload}",
"type": "string"
}
}
},
"models.RecentAuthorization": {
"type": "object",
"properties": {
+151
View File
@@ -1046,6 +1046,18 @@ definitions:
description: 总数量
type: integer
type: object
models.DeviceSummaryResponse:
properties:
offline_devices:
description: 离线设备数
type: integer
online_devices:
description: 在线设备数
type: integer
total_devices:
description: 设备总数
type: integer
type: object
models.EnumItem:
properties:
display:
@@ -1368,6 +1380,18 @@ definitions:
description: 响应消息
type: string
type: object
models.OrderSummaryResponse:
properties:
paid_orders:
description: 已支付订单数
type: integer
pending_orders:
description: 待支付订单数
type: integer
total_orders:
description: 订单总数
type: integer
type: object
models.PaymentBusinessOrder:
properties:
authorization_code:
@@ -1442,6 +1466,20 @@ definitions:
trade_no:
type: string
type: object
models.ProductActivationCodeRequest:
properties:
authorization_code:
description: 授权码(旧规则格式)
type: string
required:
- authorization_code
type: object
models.ProductActivationCodeResponse:
properties:
product_activation_code:
description: 产品激活码:{授权码}&{payload}
type: string
type: object
models.RecentAuthorization:
properties:
code:
@@ -1632,6 +1670,55 @@ paths:
summary: 用户分享授权码
tags:
- 用户端授权码管理
/api/cu/authorization-codes/product-activation-code:
post:
consumes:
- application/json
description: 获取产品激活码:{授权码}&{payload}(payload 为 RSA-PSS-SHA256 签名封装串)
parameters:
- description: 获取产品激活码请求
in: body
name: request
required: true
schema:
$ref: '#/definitions/models.ProductActivationCodeRequest'
produces:
- application/json
responses:
"200":
description: 获取成功
schema:
allOf:
- $ref: '#/definitions/models.APIResponse'
- properties:
data:
$ref: '#/definitions/models.ProductActivationCodeResponse'
type: object
"400":
description: 请求参数无效
schema:
$ref: '#/definitions/models.ErrorResponse'
"401":
description: 未认证
schema:
$ref: '#/definitions/models.ErrorResponse'
"403":
description: 授权码已被锁定
schema:
$ref: '#/definitions/models.ErrorResponse'
"404":
description: 授权码不存在或已过期
schema:
$ref: '#/definitions/models.ErrorResponse'
"500":
description: 服务器内部错误
schema:
$ref: '#/definitions/models.ErrorResponse'
security:
- BearerAuth: []
summary: 获取产品激活码
tags:
- 用户端授权码管理
/api/cu/devices:
get:
consumes:
@@ -1654,6 +1741,10 @@ paths:
in: query
name: authorization_code_id
type: string
- description: 是否在线筛选:true在线,false离线
in: query
name: is_online
type: boolean
produces:
- application/json
responses:
@@ -1726,6 +1817,36 @@ paths:
summary: 解绑设备
tags:
- 客户设备管理
/api/cu/devices/summary:
get:
consumes:
- application/json
description: 获取当前登录用户的设备汇总统计信息(总数、在线数、离线数)
produces:
- application/json
responses:
"200":
description: 获取成功
schema:
allOf:
- $ref: '#/definitions/models.APIResponse'
- properties:
data:
$ref: '#/definitions/models.DeviceSummaryResponse'
type: object
"401":
description: 未认证
schema:
$ref: '#/definitions/models.ErrorResponse'
"500":
description: 服务器内部错误
schema:
$ref: '#/definitions/models.ErrorResponse'
security:
- BearerAuth: []
summary: 获取设备汇总统计
tags:
- 客户设备管理
/api/cu/forgot-password:
post:
consumes:
@@ -2010,6 +2131,36 @@ paths:
summary: 计算订单价格
tags:
- 客户订单管理
/api/cu/orders/summary:
get:
consumes:
- application/json
description: 获取当前登录用户的订单汇总统计信息(总数、待支付数、已支付数)
produces:
- application/json
responses:
"200":
description: 获取成功
schema:
allOf:
- $ref: '#/definitions/models.APIResponse'
- properties:
data:
$ref: '#/definitions/models.OrderSummaryResponse'
type: object
"401":
description: 未认证
schema:
$ref: '#/definitions/models.ErrorResponse'
"500":
description: 服务器内部错误
schema:
$ref: '#/definitions/models.ErrorResponse'
security:
- BearerAuth: []
summary: 获取订单汇总统计
tags:
- 客户订单管理
/api/cu/packages:
get:
consumes:
@@ -33,6 +33,7 @@ func NewCuDeviceHandler(cuDeviceService service.CuDeviceService) *CuDeviceHandle
// @Param page_size query int false "每页数量,默认20,最大100"
// @Param device_name query string false "设备名称模糊搜索"
// @Param authorization_code_id query string false "按授权码ID筛选设备"
// @Param is_online query bool false "是否在线筛选:true在线,false离线"
// @Success 200 {object} models.APIResponse{data=models.DeviceListResponse} "获取成功"
// @Failure 400 {object} models.ErrorResponse "请求参数无效"
// @Failure 401 {object} models.ErrorResponse "未认证"
+1
View File
@@ -190,6 +190,7 @@ type DeviceListRequest struct {
PageSize int `form:"page_size" binding:"omitempty,min=1,max=100"` // 每页数量,默认20,最大100
DeviceName string `form:"device_name" binding:"omitempty,max=100"` // 设备名称模糊搜索(匹配device_info.name)
AuthorizationCodeID string `form:"authorization_code_id" binding:"omitempty,len=36"` // 按授权码ID筛选设备
IsOnline *bool `form:"is_online" binding:"omitempty"` // 是否在线筛选(true在线,false离线;不传不过滤)
}
// DeviceListItem 设备列表项结构(客户用户接口)
@@ -278,6 +278,16 @@ func (r *licenseRepository) GetCustomerDeviceList(ctx context.Context, customerI
Where("licenses.customer_id = ? AND licenses.status = ? AND licenses.deleted_at IS NULL",
customerID, "active")
// 获取心跳超时配置(秒)
cfg := config.GetConfig()
heartbeatTimeoutSeconds := cfg.License.HeartbeatTimeout
if heartbeatTimeoutSeconds <= 0 {
heartbeatTimeoutSeconds = 300 // 默认5分钟
}
now := time.Now()
onlineThreshold := now.Add(-time.Duration(heartbeatTimeoutSeconds) * time.Second)
// 按授权码ID筛选
if req.AuthorizationCodeID != "" {
query = query.Where("licenses.authorization_code_id = ?", req.AuthorizationCodeID)
@@ -288,6 +298,15 @@ func (r *licenseRepository) GetCustomerDeviceList(ctx context.Context, customerI
query = query.Where("JSON_EXTRACT(licenses.device_info, '$.name') LIKE ?", "%"+req.DeviceName+"%")
}
// 在线状态筛选
if req.IsOnline != nil {
if *req.IsOnline {
query = query.Where("licenses.last_heartbeat > ?", onlineThreshold)
} else {
query = query.Where("(licenses.last_heartbeat <= ? OR licenses.last_heartbeat IS NULL)", onlineThreshold)
}
}
// 获取总数
var total int64
if err := query.Count(&total).Error; err != nil {
@@ -317,14 +336,6 @@ func (r *licenseRepository) GetCustomerDeviceList(ctx context.Context, customerI
return nil, err
}
// 获取心跳超时配置(秒)
cfg := config.GetConfig()
heartbeatTimeoutSeconds := cfg.License.HeartbeatTimeout
if heartbeatTimeoutSeconds <= 0 {
heartbeatTimeoutSeconds = 300 // 默认5分钟
}
now := time.Now()
devices := make([]models.DeviceListItem, len(scanResults))
for i, result := range scanResults {
@@ -337,7 +348,7 @@ func (r *licenseRepository) GetCustomerDeviceList(ctx context.Context, customerI
// 计算在线状态(使用心跳超时配置)
isOnline := false
if result.LastHeartbeat != nil && result.LastHeartbeat.After(now.Add(-time.Duration(heartbeatTimeoutSeconds)*time.Second)) {
if result.LastHeartbeat != nil && result.LastHeartbeat.After(onlineThreshold) {
isOnline = true
}