修改过期时间,以及修改套餐已用量
Some checks failed
构建并部署到测试环境(无 SSH) / build-and-deploy (push) Has been cancelled

This commit is contained in:
Break
2026-06-12 10:41:24 +08:00
parent c437593a8c
commit 016e7bee79
8 changed files with 501 additions and 85 deletions

View File

@@ -3,6 +3,7 @@ package admin
import (
"strconv"
"strings"
"time"
"github.com/gofiber/fiber/v2"
@@ -162,6 +163,63 @@ func (h *AssetHandler) CurrentPackage(c *fiber.Ctx) error {
return response.Success(c, result)
}
// UpdatePackageExpiresAt 修改资产套餐过期时间
// PATCH /api/admin/assets/:identifier/packages/:package_usage_id/expires-at
func (h *AssetHandler) UpdatePackageExpiresAt(c *fiber.Ctx) error {
if err := ensureAssetPackageAdjuster(c); err != nil {
return err
}
asset, packageUsageID, err := h.resolveAssetPackageUsagePath(c)
if err != nil {
return err
}
var req dto.UpdateAssetPackageExpiresAtRequest
if err := c.BodyParser(&req); err != nil {
return errors.New(errors.CodeInvalidParam)
}
expiresAt, err := parseAssetPackageTime(req.ExpiresAt)
if err != nil {
return errors.New(errors.CodeInvalidParam, "过期时间格式无效")
}
result, err := h.assetService.UpdatePackageExpiresAt(c.UserContext(), asset.AssetType, asset.AssetID, assetIdentifierForAudit(asset), packageUsageID, expiresAt)
if err != nil {
return err
}
return response.Success(c, result)
}
// UpdatePackageUsage 修改资产套餐已用量
// PATCH /api/admin/assets/:identifier/packages/:package_usage_id/used-data
func (h *AssetHandler) UpdatePackageUsage(c *fiber.Ctx) error {
if err := ensureAssetPackageAdjuster(c); err != nil {
return err
}
asset, packageUsageID, err := h.resolveAssetPackageUsagePath(c)
if err != nil {
return err
}
var req dto.UpdateAssetPackageUsageRequest
if err := c.BodyParser(&req); err != nil {
return errors.New(errors.CodeInvalidParam)
}
if req.DataUsageMB == nil || *req.DataUsageMB < 0 {
return errors.New(errors.CodeInvalidParam)
}
result, err := h.assetService.UpdatePackageUsage(c.UserContext(), asset.AssetType, asset.AssetID, assetIdentifierForAudit(asset), packageUsageID, *req.DataUsageMB)
if err != nil {
return err
}
return response.Success(c, result)
}
// Stop 停机(设备批量停机,单卡停机)
// POST /api/admin/assets/:identifier/stop
func (h *AssetHandler) Stop(c *fiber.Ctx) error {
@@ -440,3 +498,57 @@ func resolveCallerAccountType(c *fiber.Ctx) string {
}
return "agent"
}
func (h *AssetHandler) resolveAssetPackageUsagePath(c *fiber.Ctx) (*dto.AssetResolveResponse, uint, error) {
asset, err := h.resolveByIdentifier(c)
if err != nil {
return nil, 0, err
}
packageUsageID, parseErr := strconv.ParseUint(c.Params("package_usage_id"), 10, 64)
if parseErr != nil || packageUsageID == 0 {
return nil, 0, errors.New(errors.CodeInvalidParam)
}
return asset, uint(packageUsageID), nil
}
func ensureAssetPackageAdjuster(c *fiber.Ctx) error {
if middleware.GetUserIDFromContext(c.UserContext()) != 2 {
return errors.New(errors.CodeForbidden, "无权限操作该资源或资源不存在")
}
return nil
}
func parseAssetPackageTime(value string) (time.Time, error) {
raw := strings.TrimSpace(value)
if raw == "" {
return time.Time{}, errors.New(errors.CodeInvalidParam)
}
layouts := []string{
time.RFC3339,
"2006-01-02 15:04:05",
"2006-01-02T15:04:05",
"2006-01-02",
}
for _, layout := range layouts {
if t, err := time.ParseInLocation(layout, raw, time.Local); err == nil {
return t, nil
}
}
return time.Time{}, errors.New(errors.CodeInvalidParam)
}
func assetIdentifierForAudit(asset *dto.AssetResolveResponse) string {
if asset == nil {
return ""
}
if asset.AssetType == "card" && strings.TrimSpace(asset.ICCID) != "" {
return asset.ICCID
}
if strings.TrimSpace(asset.VirtualNo) != "" {
return asset.VirtualNo
}
return asset.Identifier
}