## CI 修复 (P0/P1) P0 — 编译阻塞: - interfaces.go: postUseCase ISP 接口移除不用的 Create/Update/Delete P1 — 必须修复: - ST1000: 为 13 个包添加包注释 (common/config/model/service/...) - ST1005: redis_store.go 全部错误消息改为小写开头 - errcheck (19处): defer Close()→闭包忽略, notifier.Create→_=, r.Run→检查error - errorlint (9处): switch-on-error→errors.Is 链, ==→errors.Is - ST1020/ST1022: 导出符号注释以符号名开头 P2 — 安全评审: - gosec (12处): G203/G301/G304/G306 添加 nolint 注释并附理由 P3 — 清理: - unused: 移除 hasUnicode/energyStore/current/energyAdminUseCase - gofumpt + goimports 全量格式化 (35+ 文件)
142 lines
3.7 KiB
Go
142 lines
3.7 KiB
Go
package admin
|
|
|
|
import (
|
|
"errors"
|
|
"net/http"
|
|
"strconv"
|
|
|
|
"metazone.cc/mce/internal/common"
|
|
"metazone.cc/mce/internal/model"
|
|
|
|
"github.com/gin-gonic/gin"
|
|
)
|
|
|
|
// AdjustEnergy 调整用户域能
|
|
func (ac *AdminEnergyController) AdjustEnergy(c *gin.Context) {
|
|
operatorUID, ok := c.Get("uid")
|
|
if !ok {
|
|
common.Error(c, http.StatusUnauthorized, "请先登录")
|
|
return
|
|
}
|
|
|
|
var req struct {
|
|
UserIDs []uint `json:"user_ids" binding:"required,min=1"`
|
|
Amount int `json:"amount" binding:"required"`
|
|
Description string `json:"description" binding:"required,min=1,max=500"`
|
|
Mode string `json:"mode"`
|
|
}
|
|
if err := c.ShouldBindJSON(&req); err != nil {
|
|
common.Error(c, http.StatusBadRequest, "参数错误:需要 user_ids、amount 和 description")
|
|
return
|
|
}
|
|
|
|
// 默认模式为 admin_transfer
|
|
if req.Mode == "" {
|
|
req.Mode = model.FundTypeAdminTransfer
|
|
}
|
|
|
|
// system_operation 仅 owner 可用
|
|
if req.Mode == model.FundTypeSystemOperation {
|
|
role, _ := c.Get("role")
|
|
if !model.HasMinRole(role.(string), model.RoleOwner) {
|
|
common.Error(c, http.StatusForbidden, "仅站长可使用系统操作模式")
|
|
return
|
|
}
|
|
}
|
|
|
|
if err := ac.energySvc.AdminAdjust(operatorUID.(uint), req.UserIDs, req.Amount, req.Description, req.Mode); err != nil {
|
|
if errors.Is(err, common.ErrInsufficientFund) {
|
|
common.Error(c, http.StatusBadRequest, "公户余额不足,无法执行操作")
|
|
return
|
|
}
|
|
common.Error(c, http.StatusInternalServerError, "调整失败")
|
|
return
|
|
}
|
|
|
|
common.OkMessage(c, "域能调整成功")
|
|
}
|
|
|
|
// ListEnergyLogs 查询域能日志
|
|
func (ac *AdminEnergyController) ListEnergyLogs(c *gin.Context) {
|
|
energyType := c.Query("type")
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
|
|
|
logs, total, err := ac.energySvc.GetAdminEnergyLogs(energyType, page, pageSize)
|
|
if err != nil {
|
|
common.Error(c, http.StatusInternalServerError, "查询失败")
|
|
return
|
|
}
|
|
|
|
// 转换为展示友好的视图
|
|
type logView struct {
|
|
model.EnergyLog
|
|
EnergyDisplay float64 `json:"energy_display"`
|
|
TypeName string `json:"type_name"`
|
|
}
|
|
views := make([]logView, len(logs))
|
|
for i, l := range logs {
|
|
views[i] = logView{
|
|
EnergyLog: l,
|
|
EnergyDisplay: float64(l.Amount) / 10,
|
|
TypeName: model.EnergyLogDisplayNames[l.Type],
|
|
}
|
|
}
|
|
|
|
common.Ok(c, gin.H{
|
|
"items": views,
|
|
"total": total,
|
|
"page": page,
|
|
"page_size": pageSize,
|
|
"total_pages": common.PageCount(total, pageSize),
|
|
})
|
|
}
|
|
|
|
// GetFundBalance 获取公户余额
|
|
func (ac *AdminEnergyController) GetFundBalance(c *gin.Context) {
|
|
balance, err := ac.energySvc.GetFundBalance()
|
|
if err != nil {
|
|
common.Error(c, http.StatusInternalServerError, "查询失败")
|
|
return
|
|
}
|
|
common.Ok(c, gin.H{
|
|
"balance": balance,
|
|
"balance_display": float64(balance) / 10,
|
|
})
|
|
}
|
|
|
|
// ListFundLogs 查询公户流水
|
|
func (ac *AdminEnergyController) ListFundLogs(c *gin.Context) {
|
|
logType := c.Query("type")
|
|
page, _ := strconv.Atoi(c.DefaultQuery("page", "1"))
|
|
pageSize, _ := strconv.Atoi(c.DefaultQuery("page_size", "20"))
|
|
|
|
logs, total, err := ac.energySvc.GetFundLogs(logType, page, pageSize)
|
|
if err != nil {
|
|
common.Error(c, http.StatusInternalServerError, "查询失败")
|
|
return
|
|
}
|
|
|
|
type logView struct {
|
|
model.FundLog
|
|
AmountDisplay float64 `json:"amount_display"`
|
|
TypeName string `json:"type_name"`
|
|
}
|
|
views := make([]logView, len(logs))
|
|
for i, l := range logs {
|
|
views[i] = logView{
|
|
FundLog: l,
|
|
AmountDisplay: float64(l.Amount) / 10,
|
|
TypeName: model.FundLogDisplayNames[l.Type],
|
|
}
|
|
}
|
|
|
|
common.Ok(c, gin.H{
|
|
"items": views,
|
|
"total": total,
|
|
"page": page,
|
|
"page_size": pageSize,
|
|
"total_pages": common.PageCount(total, pageSize),
|
|
})
|
|
}
|