58 lines
1.4 KiB
Go
58 lines
1.4 KiB
Go
package supportgroup
|
|
|
|
import (
|
|
"errors"
|
|
|
|
"hfb_sys/backend/internal/model"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
func PickSupportAdmin(tx *gorm.DB, groupCode string) (uint64, error) {
|
|
var row struct {
|
|
ID uint64
|
|
}
|
|
err := tx.Table("chat_support_groups AS g").
|
|
Select("au.id").
|
|
Joins("JOIN chat_support_group_members AS gm ON gm.group_id = g.id").
|
|
Joins("JOIN admin_users AS au ON au.id = gm.admin_user_id").
|
|
Where("g.code = ? AND g.status = ? AND au.status = ?", groupCode, "active", "active").
|
|
Order(`CASE au.support_status WHEN 'online' THEN 0 WHEN 'busy' THEN 1 ELSE 2 END,
|
|
(
|
|
SELECT COUNT(1)
|
|
FROM chat_participants AS cp
|
|
WHERE cp.participant_type = 'admin'
|
|
AND cp.role = 'support'
|
|
AND cp.participant_id = au.id
|
|
) ASC,
|
|
au.id ASC`).
|
|
Limit(1).
|
|
Scan(&row).Error
|
|
if err != nil {
|
|
return 0, err
|
|
}
|
|
if row.ID > 0 {
|
|
return row.ID, nil
|
|
}
|
|
return fallbackSupportAdmin(tx)
|
|
}
|
|
|
|
func fallbackSupportAdmin(tx *gorm.DB) (uint64, error) {
|
|
var admin model.AdminUser
|
|
err := tx.Table("admin_users AS au").
|
|
Select("au.*").
|
|
Joins("JOIN admin_user_roles AS aur ON aur.admin_user_id = au.id").
|
|
Joins("JOIN roles AS r ON r.id = aur.role_id").
|
|
Where("au.status = ? AND r.code = ?", "active", "cs").
|
|
Order("CASE au.support_status WHEN 'online' THEN 0 WHEN 'busy' THEN 1 ELSE 2 END, au.id ASC").
|
|
Limit(1).
|
|
First(&admin).Error
|
|
if err != nil {
|
|
if errors.Is(err, gorm.ErrRecordNotFound) {
|
|
return 0, nil
|
|
}
|
|
return 0, err
|
|
}
|
|
return admin.ID, nil
|
|
}
|