package handlers import ( "gorm.io/gen/field" "platform/pkg/u" "platform/web/auth" "platform/web/core" resource2 "platform/web/domains/resource" g "platform/web/globals" "platform/web/globals/orm" q "platform/web/queries" s "platform/web/services" "time" "github.com/gofiber/fiber/v2" ) type ListResourceShortReq struct { core.PageReq ResourceNo *string `json:"resource_no"` Active *bool `json:"active"` Type *int `json:"type"` CreateAfter *time.Time `json:"create_after"` CreateBefore *time.Time `json:"create_before"` ExpireAfter *time.Time `json:"expire_after"` ExpireBefore *time.Time `json:"expire_before"` } func ListResourceShort(c *fiber.Ctx) error { // 检查权限 authContext, err := auth.Protect(c, []auth.PayloadType{auth.PayloadUser}, []string{}) if err != nil { return err } // 解析请求参数 req := new(ListResourceShortReq) if err := c.BodyParser(req); err != nil { return err } // 查询套餐列表 do := q.Resource.Where( q.Resource.UserID.Eq(authContext.Payload.Id), q.Resource.Type.Eq(int32(resource2.TypeShort)), ) if req.ResourceNo != nil && *req.ResourceNo != "" { do.Where(q.Resource.ResourceNo.Eq(*req.ResourceNo)) } if req.Active != nil { do.Where(q.Resource.Active.Is(*req.Active)) } if req.Type != nil { do.Where(q.ResourceShort.As(q.Resource.Short.Name()).Type.Eq(int32(*req.Type))) } if req.CreateAfter != nil { do.Where(q.Resource.CreatedAt.Gte(orm.LocalDateTime(*req.CreateAfter))) } if req.CreateBefore != nil { do.Where(q.Resource.CreatedAt.Lte(orm.LocalDateTime(*req.CreateBefore))) } if req.ExpireAfter != nil { do.Where(q.ResourceShort.As(q.Resource.Short.Name()).Expire.Gte(orm.LocalDateTime(*req.ExpireAfter))) } if req.ExpireBefore != nil { do.Where(q.ResourceShort.As(q.Resource.Short.Name()).Expire.Lte(orm.LocalDateTime(*req.ExpireBefore))) } resource, err := q.Resource.Debug().Where(do). Joins(q.Resource.Short). Order(q.Resource.CreatedAt.Desc()). Offset(req.GetOffset()). Limit(req.GetLimit()). Find() if err != nil { return err } var total int64 if len(resource) < req.GetLimit() { total = int64(len(resource) + req.GetOffset()) } else { total, err = q.Resource. Where(do). Count() if err != nil { return err } } return c.JSON(core.PageResp{ Total: int(total), Page: req.GetPage(), Size: req.GetSize(), List: resource, }) } type ListResourceLongReq struct { core.PageReq ResourceNo *string `json:"resource_no"` Active *bool `json:"active"` Type *int `json:"type"` CreateAfter *time.Time `json:"create_after"` CreateBefore *time.Time `json:"create_before"` ExpireAfter *time.Time `json:"expire_after"` ExpireBefore *time.Time `json:"expire_before"` } func ListResourceLong(c *fiber.Ctx) error { // 检查权限 authContext, err := auth.Protect(c, []auth.PayloadType{auth.PayloadUser}, []string{}) if err != nil { return err } // 解析请求参数 req := new(ListResourceLongReq) if err := c.BodyParser(req); err != nil { return err } // 查询套餐列表 do := q.Resource.Where( q.Resource.UserID.Eq(authContext.Payload.Id), q.Resource.Type.Eq(int32(resource2.TypeLong)), ) if req.ResourceNo != nil && *req.ResourceNo != "" { do.Where(q.Resource.ResourceNo.Eq(*req.ResourceNo)) } if req.Active != nil { do.Where(q.Resource.Active.Is(*req.Active)) } if req.Type != nil { do.Where(q.ResourceLong.As(q.Resource.Long.Name()).Type.Eq(int32(*req.Type))) } if req.CreateAfter != nil { do.Where(q.Resource.CreatedAt.Gte(orm.LocalDateTime(*req.CreateAfter))) } if req.CreateBefore != nil { do.Where(q.Resource.CreatedAt.Lte(orm.LocalDateTime(*req.CreateBefore))) } if req.ExpireAfter != nil { do.Where(q.ResourceLong.As(q.Resource.Long.Name()).Expire.Gte(orm.LocalDateTime(*req.ExpireAfter))) } if req.ExpireBefore != nil { do.Where(q.ResourceLong.As(q.Resource.Long.Name()).Expire.Lte(orm.LocalDateTime(*req.ExpireBefore))) } resource, err := q.Resource.Debug().Where(do). Joins(q.Resource.Long). Order(q.Resource.CreatedAt.Desc()). Offset(req.GetOffset()). Limit(req.GetLimit()). Find() if err != nil { return err } var total int64 if len(resource) < req.GetLimit() { total = int64(len(resource) + req.GetOffset()) } else { total, err = q.Resource. Where(do). Count() if err != nil { return err } } return c.JSON(core.PageResp{ Total: int(total), Page: req.GetPage(), Size: req.GetSize(), List: resource, }) } type AllResourceReq struct { } func AllActiveResource(c *fiber.Ctx) error { // 检查权限 authCtx, err := auth.NewProtect(c).Payload(auth.PayloadUser).Do() if err != nil { return err } // 查询套餐列表 var now = time.Now() var short = q.ResourceShort.As(q.Resource.Short.Name()) var long = q.ResourceLong.As(q.Resource.Long.Name()) resources, err := q.Resource. Joins( q.Resource.Short, q.Resource.Long, ). Where( q.Resource.UserID.Eq(authCtx.Payload.Id), q.Resource.Active.Is(true), q.Resource.Where( q.Resource.Type.Eq(int32(resource2.TypeShort)), q.ResourceShort.As(q.Resource.Short.Name()).Where( short.Type.Eq(int32(resource2.ModeTime)), short.Expire.Gte(orm.LocalDateTime(now)), q.ResourceShort.As(q.Resource.Short.Name()). Where(short.DailyLast.Lt(orm.LocalDateTime(u.Today()))). Or(short.DailyLimit.GtCol(short.DailyUsed)), ).Or( short.Type.Eq(int32(resource2.ModeCount)), short.Quota.GtCol(short.Used), ), ).Or( q.Resource.Type.Eq(int32(resource2.TypeLong)), q.ResourceLong.As(q.Resource.Long.Name()).Where( long.Type.Eq(int32(resource2.ModeTime)), long.Expire.Gte(orm.LocalDateTime(now)), q.ResourceLong.As(q.Resource.Long.Name()). Where(long.DailyLast.Lt(orm.LocalDateTime(u.Today()))). Or(long.DailyLimit.GtCol(long.DailyUsed)), ).Or( long.Type.Eq(int32(resource2.ModeCount)), long.Quota.GtCol(long.Used), ), ), ). Order(q.Resource.CreatedAt.Desc()). Find() if err != nil { return err } return c.JSON(resources) } type StatisticPersonalResp struct { Short StatisticShort `json:"short"` Long StatisticLong `json:"long"` } type StatisticShort struct { ResourceCount int ResourceQuotaSum int ResourceDailyFreeSum int } type StatisticLong struct { ResourceCount int ResourceQuotaSum int ResourceDailyFreeSum int } func StatisticResourceFree(c *fiber.Ctx) error { // 检查权限 session, err := auth.NewProtect(c).Payload(auth.PayloadUser).Do() if err != nil { return err } // 统计套餐剩余数量 resources, err := q.Resource. Preload( q.Resource.Short, q.Resource.Long, ). Where( q.Resource.UserID.Eq(session.Payload.Id), q.Resource.Active.Is(true), ). Select(q.Resource.ID). Find() if err != nil { return err } var shortCount, shortQuotaSum, shortDailyFreeSum int var longCount, longQuotaSum, longDailyFreeSum int for _, resource := range resources { switch { // 短效包量 case resource2.Type(resource.Type) == resource2.TypeShort && resource2.Mode(resource.Short.Type) == resource2.ModeCount: if u.Z(resource.Short.Quota) > resource.Short.Used { shortCount++ shortQuotaSum += int(u.Z(resource.Short.Quota) - resource.Short.Used) } // 长效包量 case resource2.Type(resource.Type) == resource2.TypeLong && resource2.Mode(resource.Long.Type) == resource2.ModeCount: if u.Z(resource.Long.Quota) > resource.Long.Used { longCount++ longQuotaSum += int(u.Z(resource.Long.Quota) - resource.Long.Used) } // 短效包时 case resource2.Type(resource.Type) == resource2.TypeShort && resource2.Mode(resource.Short.Type) == resource2.ModeTime: if time.Time(*resource.Short.Expire).After(time.Now()) { if time.Time(*resource.Short.DailyLast) != u.Today() { shortCount++ shortDailyFreeSum += int(resource.Short.DailyLimit) } else if resource.Short.DailyLimit > resource.Short.DailyUsed { shortCount++ shortDailyFreeSum += int(resource.Short.DailyLimit - resource.Short.DailyUsed) } } // 长效包时 case resource2.Type(resource.Type) == resource2.TypeLong && resource2.Mode(resource.Long.Type) == resource2.ModeTime: if time.Time(*resource.Long.Expire).After(time.Now()) { if time.Time(*resource.Long.DailyLast) != u.Today() { longCount++ longDailyFreeSum += int(resource.Long.DailyLimit) } else if resource.Long.DailyLimit > resource.Long.DailyUsed { longCount++ longDailyFreeSum += int(resource.Long.DailyLimit - resource.Long.DailyUsed) } } } } return c.JSON(StatisticPersonalResp{ Short: StatisticShort{ ResourceCount: shortCount, ResourceQuotaSum: shortQuotaSum, ResourceDailyFreeSum: shortDailyFreeSum, }, Long: StatisticLong{ ResourceCount: longCount, ResourceQuotaSum: longQuotaSum, ResourceDailyFreeSum: longDailyFreeSum, }, }) } type StatisticResourceUsageReq struct { ResourceNo *string `json:"resource_no"` TimeAfter *time.Time `json:"time_after"` TimeBefore *time.Time `json:"time_before"` } type StatisticResourceUsageResp []struct { Date time.Time `json:"date"` Count int `json:"count"` } func StatisticResourceUsage(c *fiber.Ctx) error { // 检查权限 session, err := auth.NewProtect(c).Payload(auth.PayloadUser).Do() if err != nil { return err } // 解析请求参数 var req = new(StatisticResourceUsageReq) if err := g.Validator.Validate(c, req); err != nil { return err } // 统计套餐提取数量 do := q.LogsUserUsage.Where() if req.ResourceNo != nil && *req.ResourceNo != "" { var resourceID int32 err := q.Resource. Where( q.Resource.UserID.Eq(session.Payload.Id), q.Resource.ResourceNo.Eq(*req.ResourceNo), ). Select(q.Resource.ID). Scan(&resourceID) if err != nil { return err } do.Where(q.LogsUserUsage.ResourceID.Eq(resourceID)) } if req.TimeAfter != nil { do.Where(q.LogsUserUsage.Time.Gte(orm.LocalDateTime(*req.TimeAfter))) } if req.TimeBefore != nil { do.Where(q.LogsUserUsage.Time.Lte(orm.LocalDateTime(*req.TimeBefore))) } var data = new(StatisticResourceUsageResp) err = q.LogsUserUsage. Select( q.LogsUserUsage.Count_.Sum().As("count"), field.NewField("", "date_trunc('day', time)").As("date"), ). Where( q.LogsUserUsage.UserID.Eq(session.Payload.Id), do, ). Group( field.NewField("", "date_trunc('day', time)"), ). Order( field.NewField("", "date").Desc(), ). Scan(&data) if err != nil { return err } return c.JSON(data) } type CreateResourceReq struct { s.CreateResourceData } func CreateResource(c *fiber.Ctx) error { // 检查权限 authCtx, err := auth.NewProtect(c).Payload(auth.PayloadUser).Do() if err != nil { return err } // 解析请求参数 var req = new(CreateResourceReq) if err := g.Validator.Validate(c, req); err != nil { return err } // 创建套餐 err = s.Resource.CreateResource(authCtx.Payload.Id, time.Now(), &req.CreateResourceData) if err != nil { return err } return nil } type PrepareResourceReq struct { s.PrepareResourceData } type PrepareResourceResp struct { TradeNo string `json:"trade_no"` PayURL string `json:"pay_url"` } func PrepareCreateResource(c *fiber.Ctx) error { // 检查权限 authCtx, err := auth.NewProtect(c).Payload(auth.PayloadUser).Do() if err != nil { return err } // 解析请求参数 var req = new(PrepareResourceReq) if err := g.Validator.Validate(c, req); err != nil { return err } // 准备创建套餐 result, err := s.Resource.PrepareResource(authCtx.Payload.Id, time.Now(), &req.PrepareResourceData) if err != nil { return err } return c.JSON(PrepareResourceResp{ TradeNo: result.TradeNo, PayURL: result.PayURL, }) } type CompleteResourceReq struct { TradeNo string `json:"trade_no" validate:"required"` } func CompleteCreateResource(c *fiber.Ctx) error { // 检查权限 _, err := auth.NewProtect(c).Payload(auth.PayloadUser).Do() if err != nil { return err } // 解析请求参数 var req = new(CompleteResourceReq) if err := g.Validator.Validate(c, req); err != nil { return err } // 完成创建套餐 var now = time.Now() err = s.Resource.CompleteResource(req.TradeNo, now) if err != nil { return err } return nil } func ResourcePrice(c *fiber.Ctx) error { // 检查权限 _, err := auth.NewProtect(c).Payload(auth.PayloadInternalServer).Do() if err != nil { return err } // 解析请求参数 var req = new(s.PrepareResourceData) if err := g.Validator.Validate(c, req); err != nil { return err } data, err := req.ToData() if err != nil { return err } return c.JSON(fiber.Map{ "price": data.GetPrice().StringFixed(2), }) }