优化后台高频查询性能
This commit is contained in:
@@ -233,11 +233,11 @@ func (r *Repository) listAdminConversations(ctx context.Context, principal Princ
|
||||
c.last_message_preview, c.last_message_at, c.created_at, c.updated_at,
|
||||
COALESCE(cp_me.role, 'admin') AS role,
|
||||
COALESCE(cas.remark, '') AS admin_remark,
|
||||
COALESCE(explicit_lo.id, listing_lo.id) AS latest_order_id,
|
||||
COALESCE(explicit_lo.order_no, listing_lo.order_no) AS latest_order_no,
|
||||
COALESCE(explicit_lo.status, listing_lo.status) AS latest_order_status,
|
||||
COALESCE(explicit_lo.handoff_status, listing_lo.handoff_status) AS latest_handoff_status,
|
||||
COALESCE(explicit_lo.refund_status, listing_lo.refund_status) AS latest_refund_status,
|
||||
COALESCE(explicit_lo.id, c.latest_order_id) AS latest_order_id,
|
||||
COALESCE(explicit_lo.order_no, c.latest_order_no) AS latest_order_no,
|
||||
COALESCE(explicit_lo.status, c.latest_order_status) AS latest_order_status,
|
||||
COALESCE(explicit_lo.handoff_status, c.latest_order_handoff_status) AS latest_handoff_status,
|
||||
COALESCE(explicit_lo.refund_status, c.latest_order_refund_status) AS latest_refund_status,
|
||||
lm.sender_type AS last_sender_type, lm.sender_id AS last_sender_id, lm.sender_role AS last_sender_role,
|
||||
CASE WHEN c.type = 'general_support' AND (` + adminNeedsReplyExpression() + `) THEN 1 ELSE 0 END AS needs_reply,
|
||||
(
|
||||
@@ -273,10 +273,17 @@ func (r *Repository) listAdminConversations(ctx context.Context, principal Princ
|
||||
}
|
||||
|
||||
func (r *Repository) AdminConversationCounts(ctx context.Context, principal Principal, filter string, stage string, keyword string) (*AdminConversationCountsDTO, error) {
|
||||
result, err := r.adminConversationCounts(ctx, principal, normalizeAdminChatFilter(filter), normalizeAdminChatStage(stage), strings.TrimSpace(keyword))
|
||||
filter = normalizeAdminChatFilter(filter)
|
||||
stage = normalizeAdminChatStage(stage)
|
||||
keyword = strings.TrimSpace(keyword)
|
||||
if cached := r.loadAdminChatCountsCache(ctx, principal, filter, stage, keyword); cached != nil {
|
||||
return cached, nil
|
||||
}
|
||||
result, err := r.adminConversationCounts(ctx, principal, filter, stage, keyword)
|
||||
if err != nil {
|
||||
return nil, err
|
||||
}
|
||||
r.storeAdminChatCountsCache(ctx, principal, filter, stage, keyword, result.DTO)
|
||||
return result.DTO, nil
|
||||
}
|
||||
|
||||
@@ -297,13 +304,12 @@ func (r *Repository) adminConversationBase(ctx context.Context, principal Princi
|
||||
Joins("LEFT JOIN chat_admin_conversation_states AS cas ON cas.conversation_id = c.id AND cas.admin_user_id = ?", principal.ID).
|
||||
Joins("LEFT JOIN chat_messages AS lm ON lm.id = c.last_message_id").
|
||||
Joins("LEFT JOIN rental_orders AS explicit_lo ON explicit_lo.id = c.order_id").
|
||||
Joins("LEFT JOIN (SELECT ro.* FROM rental_orders AS ro JOIN (SELECT listing_id, MAX(id) AS max_id FROM rental_orders GROUP BY listing_id) AS latest ON latest.max_id = ro.id) AS listing_lo ON listing_lo.listing_id = c.listing_id AND c.order_id IS NULL").
|
||||
Joins("LEFT JOIN rental_listings AS l ON l.id = COALESCE(explicit_lo.listing_id, listing_lo.listing_id, c.listing_id)")
|
||||
Joins("LEFT JOIN rental_listings AS l ON l.id = COALESCE(explicit_lo.listing_id, c.listing_id)")
|
||||
if keyword != "" {
|
||||
db = db.Joins("LEFT JOIN users AS renter ON renter.id = COALESCE(explicit_lo.renter_id, listing_lo.renter_id)").
|
||||
Joins("LEFT JOIN users AS owner ON owner.id = COALESCE(explicit_lo.owner_id, listing_lo.owner_id, l.owner_id)")
|
||||
db = db.Joins("LEFT JOIN users AS renter ON renter.id = explicit_lo.renter_id").
|
||||
Joins("LEFT JOIN users AS owner ON owner.id = COALESCE(explicit_lo.owner_id, l.owner_id)")
|
||||
like := "%" + keyword + "%"
|
||||
db = db.Where(`c.title LIKE ? OR c.last_message_preview LIKE ? OR COALESCE(explicit_lo.order_no, listing_lo.order_no) LIKE ? OR l.listing_no LIKE ?
|
||||
db = db.Where(`c.title LIKE ? OR c.last_message_preview LIKE ? OR COALESCE(explicit_lo.order_no, c.latest_order_no) LIKE ? OR l.listing_no LIKE ?
|
||||
OR renter.phone LIKE ? OR owner.phone LIKE ?
|
||||
OR EXISTS (
|
||||
SELECT 1 FROM chat_participants AS cp_kw
|
||||
@@ -410,9 +416,9 @@ func adminChatOwnershipCondition(filter string, principal Principal) (string, []
|
||||
}
|
||||
|
||||
func adminChatStageCondition(stage string, principal Principal) (string, []interface{}) {
|
||||
latestID := "COALESCE(explicit_lo.id, listing_lo.id)"
|
||||
latestStatus := "COALESCE(explicit_lo.status, listing_lo.status)"
|
||||
latestRefundStatus := "COALESCE(explicit_lo.refund_status, listing_lo.refund_status)"
|
||||
latestID := "COALESCE(explicit_lo.id, c.latest_order_id)"
|
||||
latestStatus := "COALESCE(explicit_lo.status, c.latest_order_status)"
|
||||
latestRefundStatus := "COALESCE(explicit_lo.refund_status, c.latest_order_refund_status)"
|
||||
switch stage {
|
||||
case adminChatStagePending:
|
||||
return "c.type = 'general_support' AND (" + adminNeedsReplyExpression() + ")", nil
|
||||
@@ -434,17 +440,7 @@ func adminChatStageCondition(stage string, principal Principal) (string, []inter
|
||||
}
|
||||
|
||||
func adminNeedsReplyExpression() string {
|
||||
return `COALESCE((
|
||||
SELECT MAX(cm_attention.id)
|
||||
FROM chat_messages AS cm_attention
|
||||
WHERE cm_attention.conversation_id = c.id
|
||||
AND (cm_attention.admin_attention_type <> '' OR cm_attention.sender_type = 'user')
|
||||
), 0) > COALESCE((
|
||||
SELECT MAX(cm_admin.id)
|
||||
FROM chat_messages AS cm_admin
|
||||
WHERE cm_admin.conversation_id = c.id
|
||||
AND cm_admin.sender_type = 'admin'
|
||||
), 0)`
|
||||
return "c.last_attention_message_id > c.last_admin_message_id"
|
||||
}
|
||||
|
||||
// ArchiveListingConversation 将商品关联的发布群标记为已归档(解散),并写入系统提示。
|
||||
|
||||
Reference in New Issue
Block a user