diff --git a/backend/internal/modules/chat/listing_group.go b/backend/internal/modules/chat/listing_group.go index 2040f97..7e40ead 100644 --- a/backend/internal/modules/chat/listing_group.go +++ b/backend/internal/modules/chat/listing_group.go @@ -303,8 +303,40 @@ func checkQrCodeStockAndAlert(tx *gorm.DB, conversation *model.ChatConversation) // 如果低于阈值,发送预警给所有客服 if count <= threshold { - // TODO: 发送站内信给所有 cs 角色客服 - // 需要 notification 模块支持 + // 查询所有 cs 角色的客服 + var csAdmins []model.AdminUser + if err := tx.Table("admin_users"). + Joins("JOIN admin_user_roles ON admin_users.id = admin_user_roles.admin_user_id"). + Joins("JOIN roles ON admin_user_roles.role_id = roles.id"). + Where("roles.code = ? AND admin_users.status = ?", "cs", "active"). + Select("admin_users.id"). + Find(&csAdmins).Error; err != nil { + return err + } + + // 构造预警消息 + alertContent := fmt.Sprintf("企业微信群二维码库存不足(剩余 %d 张),请及时补充", count) + + // 发送站内信给所有客服 + var entries []interface{} + for _, admin := range csAdmins { + entries = append(entries, map[string]interface{}{ + "admin_user_id": admin.ID, + "type": "system", + "title": "二维码库存预警", + "content": alertContent, + "is_read": false, + "created_at": time.Now(), + "updated_at": time.Now(), + }) + } + + if len(entries) > 0 { + // 批量插入通知 + if err := tx.Table("admin_notifications").Create(entries).Error; err != nil { + return err + } + } } return nil