package banner import ( "context" "sundynix-micro-go/app/file/rpc/fileservice" "sundynix-micro-go/app/plant/api/internal/svc" plantModel "sundynix-micro-go/app/plant/model" "github.com/zeromicro/go-zero/core/logx" ) type GetActiveBannerListLogic struct { logx.Logger ctx context.Context svcCtx *svc.ServiceContext } func NewGetActiveBannerListLogic(ctx context.Context, svcCtx *svc.ServiceContext) *GetActiveBannerListLogic { return &GetActiveBannerListLogic{Logger: logx.WithContext(ctx), ctx: ctx, svcCtx: svcCtx} } func (l *GetActiveBannerListLogic) GetActiveBannerList() (interface{}, error) { var list []plantModel.Banner l.svcCtx.DB.Model(&plantModel.Banner{}). Where("is_active = 1"). Order("sort asc, created_at desc"). Find(&list) // Collect image IDs for batch fetch var imageIds []string for _, item := range list { if item.ImageID != "" { imageIds = append(imageIds, item.ImageID) } } // Fetch image URLs from file service imageUrlMap := make(map[string]string) if len(imageIds) > 0 { resp, err := l.svcCtx.FileRpc.GetFilesByIds(l.ctx, &fileservice.GetFilesByIdsReq{Ids: imageIds}) if err != nil { logx.Errorf("Fetch banner image files failed: %v", err) } else if resp != nil { for _, f := range resp.Files { if f != nil && f.Url != "" { imageUrlMap[f.Id] = f.Url } } } } type BannerItem struct { Id string `json:"id"` Title string `json:"title"` ImageId string `json:"imageId"` ImageUrl string `json:"imageUrl"` Sort int `json:"sort"` IsActive int `json:"isActive"` TargetUrl string `json:"targetUrl"` CreatedAt string `json:"createdAt"` } var result []BannerItem for _, item := range list { imageUrl := "" if u, ok := imageUrlMap[item.ImageID]; ok { imageUrl = u } createdAt := "" if !item.CreatedAt.IsZero() { createdAt = item.CreatedAt.Format("2006-01-02 15:04:05") } result = append(result, BannerItem{ Id: item.ID, Title: item.Title, ImageId: item.ImageID, ImageUrl: imageUrl, Sort: item.Sort, IsActive: item.IsActive, TargetUrl: item.TargetURL, CreatedAt: createdAt, }) } return map[string]interface{}{ "list": result, }, nil }