From 603e89e20465d6736a774594f46b7f9c16383c84 Mon Sep 17 00:00:00 2001 From: richjohnrambo Date: Tue, 22 Sep 2026 23:52:08 +0800 Subject: [PATCH] fix: query tenant entry tables without prefix --- server/internal/logic/sys/im_public_upload.go | 29 +++-- .../logic/sys/im_tenant_application.go | 104 ++++++++++-------- .../logic/sys/im_tenant_entry_feedback.go | 88 +++++++-------- 3 files changed, 113 insertions(+), 108 deletions(-) diff --git a/server/internal/logic/sys/im_public_upload.go b/server/internal/logic/sys/im_public_upload.go index e87c75a..6f574e6 100644 --- a/server/internal/logic/sys/im_public_upload.go +++ b/server/internal/logic/sys/im_public_upload.go @@ -22,24 +22,21 @@ func loadImPublicUploads(ctx context.Context, fileIds []string) (files []*sysin. if len(fileIds) == 0 { return []*sysin.ImPublicUploadModel{}, nil } - if err = g.DB().Model("im_public_uploads").Safe().Ctx(ctx). - Fields( - "id", - "file_id", - "purpose", - "mime_type", - "size", - "etag", - "location", - "expires_at", - "created_at", - "uploaded_at", - ). - WhereIn("file_id", fileIds). - OrderAsc("id"). - Scan(&files); err != nil { + placeholders := make([]string, 0, len(fileIds)) + args := make([]any, 0, len(fileIds)) + for _, fileId := range fileIds { + placeholders = append(placeholders, "?") + args = append(args, fileId) + } + query := `SELECT id,file_id,purpose,mime_type,size,etag,location,expires_at,created_at,uploaded_at + FROM im_public_uploads WHERE file_id IN (` + strings.Join(placeholders, ",") + `) ORDER BY id ASC` + rows, err := g.DB().GetAll(ctx, query, args...) + if err != nil { return nil, gerror.Wrap(err, "获取公共上传文件信息失败,请稍后重试!") } + if err = rows.Structs(&files); err != nil { + return nil, gerror.Wrap(err, "解析公共上传文件信息失败,请稍后重试!") + } drive := "" if conf, confErr := service.SysConfig().GetUpload(ctx); confErr == nil && conf != nil { diff --git a/server/internal/logic/sys/im_tenant_application.go b/server/internal/logic/sys/im_tenant_application.go index a9d87f9..aaa55a7 100644 --- a/server/internal/logic/sys/im_tenant_application.go +++ b/server/internal/logic/sys/im_tenant_application.go @@ -9,8 +9,8 @@ import ( "context" "hotgo/internal/model/input/sysin" "hotgo/internal/service" + "strings" - "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" ) @@ -31,56 +31,61 @@ func (s *sSysImTenantApplication) List(ctx context.Context, in *sysin.ImTenantAp return } - mod := s.listModel(ctx) - mod = s.applyWhere(mod, in) - mod = mod.Page(in.Page, in.PerPage).OrderDesc("created_at").OrderDesc("id") + where, args := s.buildWhere(in) + totalValue, err := g.DB().GetValue(ctx, "SELECT COUNT(*) FROM im_tenant_applications "+where, args...) + if err != nil { + return nil, 0, gerror.Wrap(err, "获取企业注册申请总数失败,请稍后重试!") + } + totalCount = totalValue.Int() - if err = mod.ScanAndCount(&list, &totalCount, false); err != nil { + page, perPage := normalizePage(in.Page, in.PerPage) + query := `SELECT id,application_id,credit_code,enterprise_email,license_file_id,tenant_code_hint, + status,estimated_review_hour,submitted_at,created_at,updated_at + FROM im_tenant_applications ` + where + ` ORDER BY created_at DESC,id DESC LIMIT ? OFFSET ?` + queryArgs := append(append([]any{}, args...), perPage, (page-1)*perPage) + rows, err := g.DB().GetAll(ctx, query, queryArgs...) + if err != nil { return nil, 0, gerror.Wrap(err, "获取企业注册申请列表失败,请稍后重试!") } + if err = rows.Structs(&list); err != nil { + return nil, 0, gerror.Wrap(err, "解析企业注册申请列表失败,请稍后重试!") + } return } -func (s *sSysImTenantApplication) listModel(ctx context.Context) *gdb.Model { - return g.DB().Model("im_tenant_applications").Safe().Ctx(ctx).Fields( - "id", - "application_id", - "credit_code", - "enterprise_email", - "license_file_id", - "tenant_code_hint", - "status", - "estimated_review_hour", - "submitted_at", - "created_at", - "updated_at", - ) -} - -func (s *sSysImTenantApplication) applyWhere(mod *gdb.Model, in *sysin.ImTenantApplicationListInp) *gdb.Model { +func (s *sSysImTenantApplication) buildWhere(in *sysin.ImTenantApplicationListInp) (string, []any) { + parts := []string{"1=1"} + args := []any{} if in.ApplicationId != "" { - mod = mod.WhereLike("application_id", "%"+in.ApplicationId+"%") + parts = append(parts, "application_id LIKE ?") + args = append(args, "%"+in.ApplicationId+"%") } if in.CreditCode != "" { - mod = mod.WhereLike("credit_code", "%"+in.CreditCode+"%") + parts = append(parts, "credit_code LIKE ?") + args = append(args, "%"+in.CreditCode+"%") } if in.EnterpriseEmail != "" { - mod = mod.WhereLike("enterprise_email", "%"+in.EnterpriseEmail+"%") + parts = append(parts, "enterprise_email LIKE ?") + args = append(args, "%"+in.EnterpriseEmail+"%") } if in.TenantCodeHint != "" { - mod = mod.WhereLike("tenant_code_hint", "%"+in.TenantCodeHint+"%") + parts = append(parts, "tenant_code_hint LIKE ?") + args = append(args, "%"+in.TenantCodeHint+"%") } if in.Status != "" { - mod = mod.Where("status", in.Status) + parts = append(parts, "status=?") + args = append(args, in.Status) } if in.Keyword != "" { like := "%" + in.Keyword + "%" - mod = mod.Where("(application_id LIKE ? OR credit_code LIKE ? OR enterprise_email LIKE ? OR tenant_code_hint LIKE ?)", like, like, like, like) + parts = append(parts, "(application_id LIKE ? OR credit_code LIKE ? OR enterprise_email LIKE ? OR tenant_code_hint LIKE ?)") + args = append(args, like, like, like, like) } if len(in.CreatedAt) == 2 { - mod = mod.WhereBetween("created_at", in.CreatedAt[0], in.CreatedAt[1]) + parts = append(parts, "created_at BETWEEN ? AND ?") + args = append(args, in.CreatedAt[0], in.CreatedAt[1]) } - return mod + return "WHERE " + strings.Join(parts, " AND "), args } // View 获取企业注册申请指定信息 @@ -89,29 +94,32 @@ func (s *sSysImTenantApplication) View(ctx context.Context, in *sysin.ImTenantAp return } - if err = g.DB().Model("im_tenant_applications").Safe().Ctx(ctx). - Fields( - "id", - "application_id", - "credit_code", - "enterprise_email", - "license_file_id", - "tenant_code_hint", - "CAST(client_context AS CHAR) client_context", - "idempotency_key", - "status", - "estimated_review_hour", - "submitted_at", - "created_at", - "updated_at", - ). - Where("id", in.Id). - Scan(&res); err != nil { + query := `SELECT id,application_id,credit_code,enterprise_email,license_file_id,tenant_code_hint, + CAST(client_context AS CHAR) client_context,idempotency_key,status,estimated_review_hour, + submitted_at,created_at,updated_at FROM im_tenant_applications WHERE id=? LIMIT 1` + row, err := g.DB().GetOne(ctx, query, in.Id) + if err != nil { return nil, gerror.Wrap(err, "获取企业注册申请信息失败,请稍后重试!") } + if row.IsEmpty() { + return nil, nil + } + if err = row.Struct(&res); err != nil { + return nil, gerror.Wrap(err, "解析企业注册申请信息失败,请稍后重试!") + } if res == nil { return } res.LicenseFile, err = firstImPublicUpload(ctx, res.LicenseFileId) return } + +func normalizePage(page, perPage int) (int, int) { + if page <= 0 { + page = 1 + } + if perPage <= 0 { + perPage = 20 + } + return page, perPage +} diff --git a/server/internal/logic/sys/im_tenant_entry_feedback.go b/server/internal/logic/sys/im_tenant_entry_feedback.go index ec01c39..a65d710 100644 --- a/server/internal/logic/sys/im_tenant_entry_feedback.go +++ b/server/internal/logic/sys/im_tenant_entry_feedback.go @@ -9,8 +9,8 @@ import ( "context" "hotgo/internal/model/input/sysin" "hotgo/internal/service" + "strings" - "github.com/gogf/gf/v2/database/gdb" "github.com/gogf/gf/v2/errors/gerror" "github.com/gogf/gf/v2/frame/g" ) @@ -31,51 +31,56 @@ func (s *sSysImTenantEntryFeedback) List(ctx context.Context, in *sysin.ImTenant return } - mod := s.listModel(ctx) - mod = s.applyWhere(mod, in) - mod = mod.Page(in.Page, in.PerPage).OrderDesc("created_at").OrderDesc("id") + where, args := s.buildWhere(in) + totalValue, err := g.DB().GetValue(ctx, "SELECT COUNT(*) FROM im_tenant_entry_feedbacks "+where, args...) + if err != nil { + return nil, 0, gerror.Wrap(err, "获取企业入口反馈总数失败,请稍后重试!") + } + totalCount = totalValue.Int() - if err = mod.ScanAndCount(&list, &totalCount, false); err != nil { + page, perPage := normalizePage(in.Page, in.PerPage) + query := `SELECT id,feedback_id,description,contact,tenant_code_hint,status,submitted_at,created_at,updated_at + FROM im_tenant_entry_feedbacks ` + where + ` ORDER BY created_at DESC,id DESC LIMIT ? OFFSET ?` + queryArgs := append(append([]any{}, args...), perPage, (page-1)*perPage) + rows, err := g.DB().GetAll(ctx, query, queryArgs...) + if err != nil { return nil, 0, gerror.Wrap(err, "获取企业入口反馈列表失败,请稍后重试!") } + if err = rows.Structs(&list); err != nil { + return nil, 0, gerror.Wrap(err, "解析企业入口反馈列表失败,请稍后重试!") + } return } -func (s *sSysImTenantEntryFeedback) listModel(ctx context.Context) *gdb.Model { - return g.DB().Model("im_tenant_entry_feedbacks").Safe().Ctx(ctx).Fields( - "id", - "feedback_id", - "description", - "contact", - "tenant_code_hint", - "status", - "submitted_at", - "created_at", - "updated_at", - ) -} - -func (s *sSysImTenantEntryFeedback) applyWhere(mod *gdb.Model, in *sysin.ImTenantEntryFeedbackListInp) *gdb.Model { +func (s *sSysImTenantEntryFeedback) buildWhere(in *sysin.ImTenantEntryFeedbackListInp) (string, []any) { + parts := []string{"1=1"} + args := []any{} if in.FeedbackId != "" { - mod = mod.WhereLike("feedback_id", "%"+in.FeedbackId+"%") + parts = append(parts, "feedback_id LIKE ?") + args = append(args, "%"+in.FeedbackId+"%") } if in.Contact != "" { - mod = mod.WhereLike("contact", "%"+in.Contact+"%") + parts = append(parts, "contact LIKE ?") + args = append(args, "%"+in.Contact+"%") } if in.TenantCodeHint != "" { - mod = mod.WhereLike("tenant_code_hint", "%"+in.TenantCodeHint+"%") + parts = append(parts, "tenant_code_hint LIKE ?") + args = append(args, "%"+in.TenantCodeHint+"%") } if in.Status != "" { - mod = mod.Where("status", in.Status) + parts = append(parts, "status=?") + args = append(args, in.Status) } if in.Keyword != "" { like := "%" + in.Keyword + "%" - mod = mod.Where("(feedback_id LIKE ? OR description LIKE ? OR contact LIKE ? OR tenant_code_hint LIKE ?)", like, like, like, like) + parts = append(parts, "(feedback_id LIKE ? OR description LIKE ? OR contact LIKE ? OR tenant_code_hint LIKE ?)") + args = append(args, like, like, like, like) } if len(in.CreatedAt) == 2 { - mod = mod.WhereBetween("created_at", in.CreatedAt[0], in.CreatedAt[1]) + parts = append(parts, "created_at BETWEEN ? AND ?") + args = append(args, in.CreatedAt[0], in.CreatedAt[1]) } - return mod + return "WHERE " + strings.Join(parts, " AND "), args } // View 获取企业入口反馈指定信息 @@ -84,25 +89,20 @@ func (s *sSysImTenantEntryFeedback) View(ctx context.Context, in *sysin.ImTenant return } - if err = g.DB().Model("im_tenant_entry_feedbacks").Safe().Ctx(ctx). - Fields( - "id", - "feedback_id", - "description", - "contact", - "tenant_code_hint", - "CAST(screenshot_file_ids AS CHAR) screenshot_file_ids", - "CAST(client_context AS CHAR) client_context", - "idempotency_key", - "status", - "submitted_at", - "created_at", - "updated_at", - ). - Where("id", in.Id). - Scan(&res); err != nil { + query := `SELECT id,feedback_id,description,contact,tenant_code_hint, + CAST(screenshot_file_ids AS CHAR) screenshot_file_ids,CAST(client_context AS CHAR) client_context, + idempotency_key,status,submitted_at,created_at,updated_at + FROM im_tenant_entry_feedbacks WHERE id=? LIMIT 1` + row, err := g.DB().GetOne(ctx, query, in.Id) + if err != nil { return nil, gerror.Wrap(err, "获取企业入口反馈信息失败,请稍后重试!") } + if row.IsEmpty() { + return nil, nil + } + if err = row.Struct(&res); err != nil { + return nil, gerror.Wrap(err, "解析企业入口反馈信息失败,请稍后重试!") + } if res == nil { return }