This commit is contained in:
@@ -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
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user