fix: 标签属于组织非知识库 — tag_options按org_id过滤,search.ui页面加载即显示,search_result kb_id=all时不限

This commit is contained in:
ymq 2026-08-07 17:52:31 +08:00
parent 172b302641
commit 9c86291bbf
3 changed files with 14 additions and 15 deletions

View File

@ -36,8 +36,12 @@
"id": "tag_filter",
"options": {"spacing": "4px", "alignItems": "center", "wrap": true, "padding": "2px 0"},
"subwidgets": [
{"widgettype": "Text", "options": {"text": "选择知识库后加载标签", "cfontsize": 11, "color": "#ccc"}}
{"widgettype": "Text", "options": {"text": "加载中...", "cfontsize": 11, "color": "#ccc"}}
]
},
{
"widgettype": "Html",
"options": {"html": "<script>(function(){setTimeout(function(){var tf=document.querySelector('#tag_filter');if(!tf)return;fetch('/rag/knowledge_bases_list/tag_options.dspy?_webbricks_=1').then(function(r){return r.json()}).then(function(tags){tf.innerHTML='';if(!tags||tags.length===0){tf.innerHTML='<span style=font-size:11px;color:#ccc>暂无标签</span>';return};tags.forEach(function(t){var chip=document.createElement('span');chip.setAttribute('data-tid',t.value);chip.setAttribute('data-sel','0');chip.style.cssText='display:inline-block;padding:3px 10px;border-radius:12px;font-size:11px;cursor:pointer;margin:2px 4px;border:1px solid #ddd;background:#f5f5f5;color:#666;transition:all .2s';chip.textContent='#'+t.text;chip.onclick=function(){var el=this;var on=el.getAttribute('data-sel')==='1';el.setAttribute('data-sel',on?'0':'1');el.style.background=on?'#f5f5f5':'#e3f2fd';el.style.color=on?'#666':'#1565c0';el.style.borderColor=on?'#ddd':'#90caf9';};tf.appendChild(chip)})}).catch(function(){tf.innerHTML='<span style=font-size:11px;color:#e74c3c>加载标签失败</span>'})},100)})()</script>"}
}
]
},
@ -57,12 +61,6 @@
}
],
"binds": [
{
"wid": "kb_selector",
"event": "change",
"actiontype": "script",
"script": "var kb_id=this.resultValue()||'all';var tf=document.querySelector('#tag_filter');if(!tf)return;if(kb_id==='all'){tf.innerHTML='<span style=font-size:11px;color:#ccc>选择具体知识库后加载标签</span>';return};fetch('/rag/knowledge_bases_list/tag_options.dspy?_webbricks_=1&kb_id='+encodeURIComponent(kb_id)).then(function(r){return r.json()}).then(function(tags){tf.innerHTML='';if(!tags||tags.length===0){tf.innerHTML='<span style=font-size:11px;color:#ccc>该知识库暂无标签</span>';return};tags.forEach(function(t){var chip=document.createElement('span');chip.setAttribute('data-tid',t.value);chip.setAttribute('data-sel','0');chip.style.cssText='display:inline-block;padding:3px 10px;border-radius:12px;font-size:11px;cursor:pointer;margin:2px 4px;border:1px solid #ddd;background:#f5f5f5;color:#666;transition:all .2s';chip.textContent='#'+t.text;chip.onclick=function(){var el=this;var on=el.getAttribute('data-sel')==='1';el.setAttribute('data-sel',on?'0':'1');el.style.background=on?'#f5f5f5':'#e3f2fd';el.style.color=on?'#666':'#1565c0';el.style.borderColor=on?'#ddd':'#90caf9';};tf.appendChild(chip)})}).catch(function(){tf.innerHTML='<span style=font-size:11px;color:#e74c3c>加载标签失败</span>'})"
},
{
"wid": "search_bar",
"event": "search",

View File

@ -52,12 +52,16 @@ if tag_ids_str:
try:
async with get_sor_context(env, 'rag') as sor:
placeholders = []
nsq = {"kb_id": kb_id}
nsq = {}
kb_filter = ""
if kb_id and kb_id != "all":
kb_filter = "kb_id=${kb_id}$ AND "
nsq["kb_id"] = kb_id
for i, tid in enumerate(wanted_tags):
placeholders.append("${tid_" + str(i) + "}$")
nsq["tid_" + str(i)] = tid
sql = ("SELECT media_id FROM media_tags "
"WHERE kb_id=${kb_id}$ AND media_type='document' AND tag_id IN (" + ",".join(placeholders) + ") "
"WHERE " + kb_filter + "media_type='document' AND tag_id IN (" + ",".join(placeholders) + ") "
"GROUP BY media_id HAVING COUNT(DISTINCT tag_id)=" + str(len(wanted_tags)))
recs = await sor.sqlExe(sql, nsq)
tag_doc_ids = set(r.media_id for r in recs)

View File

@ -1,12 +1,9 @@
import json
ns = params_kw.copy()
kb_id = ns.get('kb_id', '')
if not kb_id or kb_id == 'all':
return json.dumps([], ensure_ascii=False)
env = request._run_ns
userorgid = await env.get_userorgid()
async with get_sor_context(env, 'rag') as sor:
recs = await sor.sqlExe(
"SELECT id, name, color FROM tags WHERE kb_id=${kb_id}$ ORDER BY created_at",
{"kb_id": kb_id})
"SELECT id, name, color FROM tags WHERE org_id=${org_id}$ ORDER BY created_at",
{"org_id": userorgid})
items = [{"value": r.id, "text": r.name, "color": r.color or '#3b82f6'} for r in recs]
return json.dumps(items, ensure_ascii=False)