271 lines
8.8 KiB
Python
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 |