精准查询,参数排序,拖拽排序优化

This commit is contained in:
JenniferW 2025-12-03 15:47:28 +08:00
parent 9de8918cba
commit 742cb4ce18
1 changed files with 118 additions and 15 deletions

View File

@ -277,6 +277,8 @@
width="1200px"
top="40px"
:close-on-click-modal="false"
draggable
class="compare-dialog"
>
<!-- 仅看不同项按钮 -->
<div
@ -308,7 +310,7 @@
fixed="left"
/>
<el-table-column
v-for="item in sortedCompareList"
v-for="(item, index) in displayCompareList"
:key="item.partNumber"
:label="item.partNumber"
:prop="item.partNumber"
@ -318,11 +320,11 @@
>
<template #header="{ column }">
<div
style="
display: flex;
align-items: center;
justify-content: center;
"
class="compare-header-draggable"
draggable="true"
@dragstart="onHeaderDragStart(index)"
@dragover.prevent
@drop="onHeaderDrop(index)"
>
<span v-if="item.isLatest" class="new-tag">
<img
@ -343,7 +345,7 @@
{{ column.label }}
</span>
<span style="font-size: 12px; color: #666">{{
sortedCompareList.find(
displayCompareList.find(
(i) => i.partNumber === column.label
)?.partName || "-"
}}</span>
@ -518,16 +520,34 @@ const sortedCompareList = computed(() => {
//
const list = [...selectedCompareList.value];
//
//
// 1 5 00001
// 2
// 3
list.sort((a, b) => {
//
const aMatch = a.partNumber?.match(/-(\d{5})$/);
const bMatch = b.partNumber?.match(/-(\d{5})$/);
const aNum = aMatch ? parseInt(aMatch[1], 10) : 0;
const bNum = bMatch ? parseInt(bMatch[1], 10) : 0;
if (!aMatch && !bMatch) return 0;
if (!aMatch) return 1;
if (!bMatch) return -1;
return bNum - aNum;
const aSuffix = aMatch[1];
const bSuffix = bMatch[1];
const aFirst = parseInt(aSuffix.charAt(0), 10);
const bFirst = parseInt(bSuffix.charAt(0), 10);
// =>
if (!Number.isNaN(aFirst) && !Number.isNaN(bFirst) && aFirst !== bFirst) {
return aFirst - bFirst;
}
// =>
const aRest = parseInt(aSuffix.slice(1), 10);
const bRest = parseInt(bSuffix.slice(1), 10);
if (Number.isNaN(aRest) || Number.isNaN(bRest)) return 0;
return bRest - aRest;
});
//
@ -540,6 +560,56 @@ const sortedCompareList = computed(() => {
return list;
});
// sortedCompareList
const compareOrder = ref([]);
const displayCompareList = computed(() => {
const baseList = sortedCompareList.value;
if (!baseList.length) return [];
if (!compareOrder.value.length) {
return baseList;
}
const map = new Map(baseList.map((item) => [item.partNumber, item]));
const ordered = [];
compareOrder.value.forEach((partNumber) => {
if (map.has(partNumber)) {
ordered.push(map.get(partNumber));
map.delete(partNumber);
}
});
return ordered.concat(Array.from(map.values()));
});
// sortedCompareList
watch(
() => sortedCompareList.value.map((item) => item.partNumber),
(newOrder) => {
compareOrder.value = newOrder;
},
{ immediate: true }
);
//
const draggingColumnIndex = ref(null);
const onHeaderDragStart = (index) => {
draggingColumnIndex.value = index;
};
const onHeaderDrop = (targetIndex) => {
const from = draggingColumnIndex.value;
if (from === null || from === targetIndex) return;
const order = [...compareOrder.value];
const [moved] = order.splice(from, 1);
order.splice(targetIndex, 0, moved);
compareOrder.value = order;
draggingColumnIndex.value = null;
};
const compareTableData = ref([]);
const diffFieldKeys = ref(new Set());
@ -1337,6 +1407,21 @@ const getPreciseIndexSet = () => {
return preciseIndexSet;
};
// parsedConditions 使
const syncPreciseConditionsIndex = () => {
if (!preciseConditions.value.length) return;
preciseConditions.value = preciseConditions.value.map((cond) => {
const idx = parsedConditions.value.findIndex(
(item) => item.field === cond.field && item.value === cond.value
);
return {
...cond,
originalIndex: idx !== -1 ? idx : cond.originalIndex,
};
});
};
const buildFieldConditionsPayload = () => {
const preciseIndexSet = getPreciseIndexSet();
@ -1518,9 +1603,8 @@ const removePreciseCondition = (index) => {
const handleSearch = async () => {
//
parsedConditions.value = parseConditions(currentInput.value);
//
preciseConditions.value = [];
//
syncPreciseConditionsIndex();
selectedItems.value = new Map();
//
@ -1537,6 +1621,8 @@ const triggerRealTimeSearch = () => {
//
if (currentInput.value.trim()) {
parsedConditions.value = parseConditions(currentInput.value);
//
syncPreciseConditionsIndex();
scheduleSearchExecution(1);
scheduleDifferenceFetch();
}
@ -2481,6 +2567,23 @@ function handleConfirm() {
vertical-align: middle;
}
/* 参数对比弹窗支持拖拽和缩放 */
.compare-dialog {
::deep(.el-dialog) {
resize: both;
overflow: auto;
}
}
/* 对比表头可拖拽的鼠标样式 */
.compare-header-draggable {
display: flex;
align-items: center;
justify-content: center;
cursor: move;
padding: 4px 0;
}
/* 关键差异信息提示样式 */
.key-diff-hint {
margin: -15px 0 15px 0;