update:导入导出功能增强,支持组织成员结构化导出导入
This commit is contained in:
@@ -1433,11 +1433,9 @@ class ImportExportService:
|
|||||||
"personality": char.personality,
|
"personality": char.personality,
|
||||||
"background": char.background,
|
"background": char.background,
|
||||||
"appearance": char.appearance,
|
"appearance": char.appearance,
|
||||||
"relationships": char.relationships,
|
|
||||||
"traits": traits,
|
"traits": traits,
|
||||||
"organization_type": char.organization_type,
|
"organization_type": char.organization_type,
|
||||||
"organization_purpose": char.organization_purpose,
|
"organization_purpose": char.organization_purpose,
|
||||||
"organization_members": char.organization_members,
|
|
||||||
"avatar_url": char.avatar_url,
|
"avatar_url": char.avatar_url,
|
||||||
"main_career_id": char.main_career_id,
|
"main_career_id": char.main_career_id,
|
||||||
"main_career_stage": char.main_career_stage,
|
"main_career_stage": char.main_career_stage,
|
||||||
@@ -1460,6 +1458,26 @@ class ImportExportService:
|
|||||||
"color": org.color
|
"color": org.color
|
||||||
})
|
})
|
||||||
|
|
||||||
|
# 从 OrganizationMember 表导出结构化成员数据
|
||||||
|
members_result = await db.execute(
|
||||||
|
select(OrganizationMember).where(OrganizationMember.organization_id == org.id)
|
||||||
|
)
|
||||||
|
members = members_result.scalars().all()
|
||||||
|
if members:
|
||||||
|
char_data["organization_members_data"] = [
|
||||||
|
{
|
||||||
|
"character_id": m.character_id,
|
||||||
|
"position": m.position,
|
||||||
|
"rank": m.rank,
|
||||||
|
"loyalty": m.loyalty,
|
||||||
|
"contribution": m.contribution,
|
||||||
|
"status": m.status,
|
||||||
|
"joined_at": m.joined_at,
|
||||||
|
"source": m.source
|
||||||
|
}
|
||||||
|
for m in members
|
||||||
|
]
|
||||||
|
|
||||||
exported_characters.append(char_data)
|
exported_characters.append(char_data)
|
||||||
|
|
||||||
export_data = {
|
export_data = {
|
||||||
@@ -1562,11 +1580,9 @@ class ImportExportService:
|
|||||||
personality=char_data.get("personality"),
|
personality=char_data.get("personality"),
|
||||||
background=char_data.get("background"),
|
background=char_data.get("background"),
|
||||||
appearance=char_data.get("appearance"),
|
appearance=char_data.get("appearance"),
|
||||||
relationships=char_data.get("relationships"),
|
|
||||||
traits=traits,
|
traits=traits,
|
||||||
organization_type=char_data.get("organization_type"),
|
organization_type=char_data.get("organization_type"),
|
||||||
organization_purpose=char_data.get("organization_purpose"),
|
organization_purpose=char_data.get("organization_purpose"),
|
||||||
organization_members=char_data.get("organization_members"),
|
|
||||||
avatar_url=char_data.get("avatar_url"),
|
avatar_url=char_data.get("avatar_url"),
|
||||||
main_career_id=None, # 职业ID需要验证后再设置
|
main_career_id=None, # 职业ID需要验证后再设置
|
||||||
main_career_stage=char_data.get("main_career_stage"),
|
main_career_stage=char_data.get("main_career_stage"),
|
||||||
@@ -1667,6 +1683,44 @@ class ImportExportService:
|
|||||||
)
|
)
|
||||||
db.add(organization)
|
db.add(organization)
|
||||||
await db.flush()
|
await db.flush()
|
||||||
|
|
||||||
|
# 导入组织成员数据(如果有)
|
||||||
|
members_data = char_data.get("organization_members_data", [])
|
||||||
|
if members_data and isinstance(members_data, list):
|
||||||
|
imported_member_count = 0
|
||||||
|
for m_data in members_data:
|
||||||
|
try:
|
||||||
|
member_char_id = m_data.get("character_id")
|
||||||
|
if not member_char_id:
|
||||||
|
continue
|
||||||
|
# 验证成员角色是否存在于目标项目
|
||||||
|
member_char_result = await db.execute(
|
||||||
|
select(Character).where(
|
||||||
|
Character.id == member_char_id,
|
||||||
|
Character.project_id == project_id
|
||||||
|
)
|
||||||
|
)
|
||||||
|
if member_char_result.scalar_one_or_none():
|
||||||
|
member = OrganizationMember(
|
||||||
|
organization_id=organization.id,
|
||||||
|
character_id=member_char_id,
|
||||||
|
position=m_data.get("position", "成员"),
|
||||||
|
rank=m_data.get("rank", 0),
|
||||||
|
loyalty=m_data.get("loyalty", 50),
|
||||||
|
contribution=m_data.get("contribution", 0),
|
||||||
|
status=m_data.get("status", "active"),
|
||||||
|
joined_at=m_data.get("joined_at"),
|
||||||
|
source=m_data.get("source", "imported")
|
||||||
|
)
|
||||||
|
db.add(member)
|
||||||
|
imported_member_count += 1
|
||||||
|
except Exception as me:
|
||||||
|
logger.warning(f"导入组织成员失败: {str(me)}")
|
||||||
|
|
||||||
|
if imported_member_count > 0:
|
||||||
|
organization.member_count = imported_member_count
|
||||||
|
logger.info(f"导入组织'{name}'的 {imported_member_count} 个成员")
|
||||||
|
|
||||||
imported_organizations.append(name)
|
imported_organizations.append(name)
|
||||||
else:
|
else:
|
||||||
imported_characters.append(name)
|
imported_characters.append(name)
|
||||||
|
|||||||
Reference in New Issue
Block a user