yanghao 2 дней назад
Родитель
Сommit
76295a1c72
1 измененных файлов с 23 добавлено и 5 удалено
  1. 23 5
      src/views/expert/list/index.vue

+ 23 - 5
src/views/expert/list/index.vue

@@ -173,7 +173,7 @@
                   :animation="180"
                   ghost-class="member-ghost"
                   :group="{ name: `experts-${row.teamName}-${index}`, pull: false, put: false }"
-                  @end="handleExpertDragEnd(row, index, cell.members)"
+                  @end="handleExpertDragEnd($event, row, index, cell.members)"
                 >
                   <template #item="{ element: member }">
                     <button type="button" class="member-link" @click="handleMemberClick(member)">
@@ -1035,10 +1035,28 @@ const tableData = computed<TableRow[]>(() => {
   })
 })
 
-const handleExpertDragEnd = (row: TableRow, cellIndex: number, members: ExpertItem[]) => {
-  expertOrderMap.value[`${row.teamName}-${rankOptions.value[cellIndex]?.value}`] = members.map(
-    (member) => member.id
-  )
+const handleExpertDragEnd = (
+  event: { oldIndex?: number; newIndex?: number },
+  row: TableRow,
+  cellIndex: number,
+  members: ExpertItem[]
+) => {
+  const oldIndex = event.oldIndex
+  const newIndex = event.newIndex
+  if (oldIndex === undefined || newIndex === undefined || oldIndex === newIndex) return
+
+  // SortableJS 已经先完成了插入式移动,这里还原原顺序后只交换两个专家。
+  const originalMembers = [...members]
+  const [draggedMember] = originalMembers.splice(newIndex, 1)
+  originalMembers.splice(oldIndex, 0, draggedMember)
+  ;[originalMembers[oldIndex], originalMembers[newIndex]] = [
+    originalMembers[newIndex],
+    originalMembers[oldIndex]
+  ]
+
+  members.splice(0, members.length, ...originalMembers)
+  expertOrderMap.value[`${row.teamName}-${rankOptions.value[cellIndex]?.value}`] =
+    originalMembers.map((member) => member.id)
 }
 
 const filteredTableData = computed(() => {