RAGflow/management/server/services/teams/service.py

271 lines
8.8 KiB
Python

import mysql.connector
from datetime import datetime
from utils import generate_uuid
from database import db_config
def get_teams_with_pagination(current_page, page_size, name=''):
"""查询团队信息,支持分页和条件筛选"""
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
# 构建WHERE子句和参数
where_clauses = []
params = []
if name:
where_clauses.append("t.name LIKE %s")
params.append(f"%{name}%")
# 组合WHERE子句
where_sql = " AND ".join(where_clauses) if where_clauses else "1=1"
# 查询总记录数
count_sql = f"SELECT COUNT(*) as total FROM tenant t WHERE {where_sql}"
cursor.execute(count_sql, params)
total = cursor.fetchone()['total']
# 计算分页偏移量
offset = (current_page - 1) * page_size
# 执行分页查询,包含负责人信息和成员数量
query = f"""
SELECT
t.id,
t.name,
t.create_date,
t.update_date,
t.status,
(SELECT u.nickname FROM user_tenant ut JOIN user u ON ut.user_id = u.id
WHERE ut.tenant_id = t.id AND ut.role = 'owner' LIMIT 1) as owner_name,
(SELECT COUNT(*) FROM user_tenant ut WHERE ut.tenant_id = t.id AND ut.status = 1) as member_count
FROM
tenant t
WHERE
{where_sql}
ORDER BY
t.create_date DESC
LIMIT %s OFFSET %s
"""
cursor.execute(query, params + [page_size, offset])
results = cursor.fetchall()
# 关闭连接
cursor.close()
conn.close()
# 格式化结果
formatted_teams = []
for team in results:
owner_name = team["owner_name"] if team["owner_name"] else "未指定"
formatted_teams.append({
"id": team["id"],
"name": f"{owner_name}的团队",
"ownerName": owner_name,
"memberCount": team["member_count"],
"createTime": team["create_date"].strftime("%Y-%m-%d %H:%M:%S") if team["create_date"] else "",
"updateTime": team["update_date"].strftime("%Y-%m-%d %H:%M:%S") if team["update_date"] else "",
"status": team["status"]
})
return formatted_teams, total
except mysql.connector.Error as err:
print(f"数据库错误: {err}")
return [], 0
def get_team_by_id(team_id):
"""根据ID获取团队详情"""
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
query = """
SELECT id, name, create_date, update_date, status, credit
FROM tenant
WHERE id = %s
"""
cursor.execute(query, (team_id,))
team = cursor.fetchone()
cursor.close()
conn.close()
if team:
return {
"id": team["id"],
"name": team["name"],
"createTime": team["create_date"].strftime("%Y-%m-%d %H:%M:%S") if team["create_date"] else "",
"updateTime": team["update_date"].strftime("%Y-%m-%d %H:%M:%S") if team["update_date"] else "",
"status": team["status"],
"credit": team["credit"]
}
return None
except mysql.connector.Error as err:
print(f"数据库错误: {err}")
return None
def delete_team(team_id):
"""删除指定ID的团队"""
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
# 删除团队成员关联
member_query = "DELETE FROM user_tenant WHERE tenant_id = %s"
cursor.execute(member_query, (team_id,))
# 删除团队
team_query = "DELETE FROM tenant WHERE id = %s"
cursor.execute(team_query, (team_id,))
affected_rows = cursor.rowcount
conn.commit()
cursor.close()
conn.close()
return affected_rows > 0
except mysql.connector.Error as err:
print(f"删除团队错误: {err}")
return False
def get_team_members(team_id):
"""获取团队成员列表"""
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor(dictionary=True)
query = """
SELECT ut.user_id, u.nickname, u.email, ut.role, ut.create_date
FROM user_tenant ut
JOIN user u ON ut.user_id = u.id
WHERE ut.tenant_id = %s AND ut.status = 1
ORDER BY ut.create_date DESC
"""
cursor.execute(query, (team_id,))
results = cursor.fetchall()
cursor.close()
conn.close()
# 格式化结果
formatted_members = []
for member in results:
# 将 role 转换为前端需要的格式
role = "管理员" if member["role"] == "owner" else "普通成员"
formatted_members.append({
"userId": member["user_id"],
"username": member["nickname"],
"role": member["role"], # 保持原始角色值 "owner" 或 "normal"
"joinTime": member["create_date"].strftime("%Y-%m-%d %H:%M:%S") if member["create_date"] else ""
})
return formatted_members
except mysql.connector.Error as err:
print(f"获取团队成员错误: {err}")
return []
def add_team_member(team_id, user_id, role="member"):
"""添加团队成员"""
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
# 检查用户是否已经是团队成员
check_query = """
SELECT id FROM user_tenant
WHERE tenant_id = %s AND user_id = %s
"""
cursor.execute(check_query, (team_id, user_id))
existing = cursor.fetchone()
if existing:
# 如果已经是成员,更新角色
update_query = """
UPDATE user_tenant SET role = %s, status = 1
WHERE tenant_id = %s AND user_id = %s
"""
cursor.execute(update_query, (role, team_id, user_id))
else:
# 如果不是成员,添加新记录
current_datetime = datetime.now()
create_time = int(current_datetime.timestamp() * 1000)
current_date = current_datetime.strftime("%Y-%m-%d %H:%M:%S")
insert_query = """
INSERT INTO user_tenant (
id, create_time, create_date, update_time, update_date, user_id,
tenant_id, role, invited_by, status
) VALUES (
%s, %s, %s, %s, %s, %s,
%s, %s, %s, %s
)
"""
# 假设邀请者是系统管理员
invited_by = "system"
user_tenant_data = (
generate_uuid(), create_time, current_date, create_time, current_date, user_id,
team_id, role, invited_by, 1
)
cursor.execute(insert_query, user_tenant_data)
conn.commit()
cursor.close()
conn.close()
return True
except mysql.connector.Error as err:
print(f"添加团队成员错误: {err}")
return False
def remove_team_member(team_id, user_id):
"""移除团队成员"""
try:
conn = mysql.connector.connect(**db_config)
cursor = conn.cursor()
# 检查是否是团队的唯一所有者
check_owner_query = """
SELECT COUNT(*) as owner_count FROM user_tenant
WHERE tenant_id = %s AND role = 'owner'
"""
cursor.execute(check_owner_query, (team_id,))
owner_count = cursor.fetchone()[0]
# 检查当前用户是否是所有者
check_user_role_query = """
SELECT role FROM user_tenant
WHERE tenant_id = %s AND user_id = %s
"""
cursor.execute(check_user_role_query, (team_id, user_id))
user_role = cursor.fetchone()
# 如果是唯一所有者,不允许移除
if owner_count == 1 and user_role and user_role[0] == 'owner':
return False
# 移除成员
delete_query = """
DELETE FROM user_tenant
WHERE tenant_id = %s AND user_id = %s
"""
cursor.execute(delete_query, (team_id, user_id))
affected_rows = cursor.rowcount
conn.commit()
cursor.close()
conn.close()
return affected_rows > 0
except mysql.connector.Error as err:
print(f"移除团队成员错误: {err}")
return False