|
|
@@ -307,6 +307,68 @@ export class TeamAssignComponent implements OnInit {
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ async confirmDeleteMember() {
|
|
|
+ if (!this.editingTeam) return;
|
|
|
+
|
|
|
+ const ok = window.confirm('确定要删除该成员的项目分配吗?');
|
|
|
+ if (!ok) return;
|
|
|
+
|
|
|
+ try {
|
|
|
+ this.saving = true;
|
|
|
+
|
|
|
+ // 软删除 ProjectTeam
|
|
|
+ this.editingTeam.set('isDeleted', true);
|
|
|
+ const data = this.editingTeam.get('data') || {};
|
|
|
+ data.deletedAt = new Date();
|
|
|
+ data.deletedBy = this.currentUser?.id;
|
|
|
+ this.editingTeam.set('data', data);
|
|
|
+ await this.editingTeam.save();
|
|
|
+
|
|
|
+ // 从群聊移除(静默尝试)
|
|
|
+ const profile = this.editingTeam.get('profile');
|
|
|
+ const userId = profile?.get?.('userId');
|
|
|
+ if (userId) {
|
|
|
+ await this.removeMemberFromGroupChat(userId);
|
|
|
+ }
|
|
|
+
|
|
|
+ alert('成员已删除');
|
|
|
+
|
|
|
+ // 刷新列表并收起弹窗
|
|
|
+ await this.loadProjectTeams();
|
|
|
+ this.showAssignDialog = false;
|
|
|
+ this.assigningDesigner = null;
|
|
|
+ this.selectedSpaces = [];
|
|
|
+ this.editingTeam = null;
|
|
|
+ } catch (err) {
|
|
|
+ console.error('删除成员失败:', err);
|
|
|
+ alert('删除失败');
|
|
|
+ } finally {
|
|
|
+ this.saving = false;
|
|
|
+ this.cdr.markForCheck();
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
+ async removeMemberFromGroupChat(userId: string) {
|
|
|
+ if (!userId) return;
|
|
|
+
|
|
|
+ try {
|
|
|
+ const groupChat = (this as any).groupChat;
|
|
|
+ if (!groupChat) return;
|
|
|
+
|
|
|
+ const chatId = groupChat.get('chat_id');
|
|
|
+ if (!chatId) return;
|
|
|
+
|
|
|
+ if (typeof (window as any).ww !== 'undefined') {
|
|
|
+ await (window as any).ww.updateEnterpriseChat({
|
|
|
+ chatId: chatId,
|
|
|
+ userIdsToRemove: [userId]
|
|
|
+ });
|
|
|
+ }
|
|
|
+ } catch (err) {
|
|
|
+ console.warn('移除群成员失败或不支持:', err);
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
getMemberSpaces(team: FmodeObject): string {
|
|
|
const spaces = team.get('data')?.spaces || [];
|
|
|
return spaces.join('、') || '未分配';
|