搜索处理
This commit is contained in:
parent
1121f99316
commit
01b64ea54a
|
|
@ -1414,27 +1414,69 @@ const fetchSearchHints = async (keyword) => {
|
||||||
if (!keyword) return;
|
if (!keyword) return;
|
||||||
try {
|
try {
|
||||||
// 先解析当前输入的条件
|
// 先解析当前输入的条件
|
||||||
const conditions = parseConditions(currentInput.value);
|
parsedConditions.value = parseConditions(currentInput.value);
|
||||||
|
|
||||||
// 构建 fieldConditions
|
// 检测当前正在编辑的条件索引
|
||||||
const fieldConditions = conditions
|
const cursorIndex = findCursorConditionIndex();
|
||||||
.filter((condition) => condition.value)
|
const parts = currentInput.value.split(/[;;]/);
|
||||||
|
const activeIndex =
|
||||||
|
cursorIndex >= 0 && cursorIndex < parts.length
|
||||||
|
? cursorIndex
|
||||||
|
: parts.length - 1;
|
||||||
|
|
||||||
|
// 如果正在编辑中间的条件,需要重新排序:将正在编辑的条件移到最后一个位置
|
||||||
|
let conditionsToProcess = [...parsedConditions.value];
|
||||||
|
if (activeIndex >= 0 && activeIndex < conditionsToProcess.length - 1) {
|
||||||
|
const [editedCondition] = conditionsToProcess.splice(activeIndex, 1);
|
||||||
|
conditionsToProcess.push(editedCondition);
|
||||||
|
}
|
||||||
|
|
||||||
|
// 构建 fieldConditions,参考 buildFieldConditionsPayload 的处理方式
|
||||||
|
const fieldConditions = conditionsToProcess
|
||||||
|
.filter((condition) => {
|
||||||
|
// 保留有值的条件,或者有字段名但没有值的条件(如 "车型:")
|
||||||
|
return condition.value || (condition.fieldLabel && condition.field);
|
||||||
|
})
|
||||||
.map((condition) => {
|
.map((condition) => {
|
||||||
// 如果明确选择了字段(有 field 且 valid),使用 fieldName 和 fieldValue
|
// 1)字段 + 值:结构化查询
|
||||||
if (condition.field && condition.valid) {
|
if (condition.valid && condition.field && condition.value) {
|
||||||
return {
|
return {
|
||||||
fieldName: condition.field, // 使用 fieldKey
|
fieldName: condition.field,
|
||||||
fieldValue: condition.value, // 对应的 value
|
fieldValue: condition.value,
|
||||||
keyword: "",
|
keyword: "",
|
||||||
queryType: "FUZZY",
|
queryType: "FUZZY",
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
// 不确定输入的值是 label 还是 value,全部放 keyword
|
// 2)只有字段(如 "车型:"):fieldName 为字段 key,fieldValue 为空
|
||||||
|
if (condition.valid && condition.field && !condition.value) {
|
||||||
|
return {
|
||||||
|
fieldName: condition.field,
|
||||||
|
fieldValue: "",
|
||||||
|
keyword: "",
|
||||||
|
queryType: "FUZZY",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// 3)只有值(如直接选了某个值,没有字段)
|
||||||
|
if (!condition.field && condition.value && !condition.fieldLabel) {
|
||||||
|
return {
|
||||||
|
fieldName: "",
|
||||||
|
fieldValue: condition.value,
|
||||||
|
keyword: "",
|
||||||
|
queryType: "FUZZY",
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
// 4)其它情况(例如纯手输、无法识别字段),作为关键字查询
|
||||||
|
const keyword = condition.fieldLabel
|
||||||
|
? `${condition.fieldLabel}:${condition.value}`.replace(/:$/, "")
|
||||||
|
: condition.value;
|
||||||
|
|
||||||
return {
|
return {
|
||||||
fieldName: "",
|
fieldName: "",
|
||||||
fieldValue: "",
|
fieldValue: "",
|
||||||
keyword: condition.value,
|
keyword,
|
||||||
queryType: "FUZZY",
|
queryType: "FUZZY",
|
||||||
};
|
};
|
||||||
});
|
});
|
||||||
|
|
@ -1475,12 +1517,7 @@ const fetchSearchHints = async (keyword) => {
|
||||||
|
|
||||||
// 从返回的数据中提取字段信息用于"可能属于的字段"下拉框
|
// 从返回的数据中提取字段信息用于"可能属于的字段"下拉框
|
||||||
// 优先根据光标位置确定当前正在编辑的条件,再决定使用哪一段文本
|
// 优先根据光标位置确定当前正在编辑的条件,再决定使用哪一段文本
|
||||||
const parts = currentInput.value.split(/[;;]/);
|
// 注意:parts、cursorIndex、activeIndex 已在函数开始处声明,这里直接使用
|
||||||
const cursorIndex = findCursorConditionIndex();
|
|
||||||
const activeIndex =
|
|
||||||
cursorIndex >= 0 && cursorIndex < parts.length
|
|
||||||
? cursorIndex
|
|
||||||
: parts.length - 1;
|
|
||||||
const currentPart = parts[activeIndex]?.trim() || "";
|
const currentPart = parts[activeIndex]?.trim() || "";
|
||||||
const isEditingExistingField =
|
const isEditingExistingField =
|
||||||
cursorIndex >= 0 && cursorIndex < parts.length - 1;
|
cursorIndex >= 0 && cursorIndex < parts.length - 1;
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue