فهرست منبع

调整药品详情返回

liuchengsen 1 ماه پیش
والد
کامیت
cccf46584c
2فایلهای تغییر یافته به همراه38 افزوده شده و 15 حذف شده
  1. 6 1
      backend-java/src/main/java/com/pharmacopoeia/controller/ChatController.java
  2. 32 14
      static/index.html

+ 6 - 1
backend-java/src/main/java/com/pharmacopoeia/controller/ChatController.java

@@ -555,8 +555,13 @@ public class ChatController {
     }
 
     private List<Map<String, Object>> buildSources(List<Map<String, Object>> docs) {
+        Set<String> seen = new HashSet<>();
         return docs.stream()
-                .limit(3)  // 最多 3 条
+                .filter(d -> {
+                    String key = d.getOrDefault("name", "") + "|" + d.getOrDefault("section", "");
+                    return seen.add(key);
+                })
+                .limit(8)  // 去重后最多 8 条,覆盖更多栏目
                 .map(d -> {
                     String content = (String) d.getOrDefault("content", "");
                     String drugName = (String) d.getOrDefault("name", "");

+ 32 - 14
static/index.html

@@ -326,30 +326,48 @@ function doSend(text,media){
 
 function buildSourceTags(){
   if(!sourcesData||!sourcesData.length)return'';
-  var seen=new Set(),tags='',drugName='';
+  // 按药名分组
+  var groups={},order=[];
   for(var i=0;i<sourcesData.length;i++){
-    var s=sourcesData[i],key=(s.section||'')+'|'+(s.name||'');
-    if(seen.has(key)||!s.section||s.section==='正文')continue;
-    seen.add(key);
-    if(!drugName) drugName=s.name||'';
-    var excerpt=(s.excerpt||'').replace(/【.+?】/g,'').replace(/来源:.*$/gm,'').trim();
-    var showExcerpt=excerpt.length>400?excerpt.substring(0,400)+'...':excerpt;
-    tags+='<span class="source-tag" onclick="var p=this.parentNode;this.classList.toggle(\'open\')">'+esc(s.section)+'<div class="src-excerpt"><strong>'+esc(drugName)+' · '+esc(s.source||'')+'</strong><br><br>'+esc(showExcerpt)+'</div></span>';
+    var s=sourcesData[i];
+    if(!s.section||s.section==='正文')continue;
+    var name=s.name||'未知药品';
+    if(!groups[name]){groups[name]={sections:[],seen:new Set(),source:s.source||''};order.push(name);}
+    var key=s.section;
+    if(!groups[name].seen.has(key)){
+      groups[name].seen.add(key);
+      var excerpt=(s.excerpt||'').replace(/【.+?】/g,'').replace(/来源:.*$/gm,'').trim();
+      var showExcerpt=excerpt.length>400?excerpt.substring(0,400)+'...':excerpt;
+      groups[name].sections.push({section:key,excerpt:showExcerpt,source:s.source||''});
+    }
+  }
+  if(!order.length)return'';
+  var h='<div class="source-tags">';
+  for(var g=0;g<order.length;g++){
+    var dn=order[g],grp=groups[dn],cnt=grp.sections.length;
+    h+='<div style="margin-bottom:10px">';
+    h+='<div class="src-title">📖 '+esc(dn)+' · '+esc(grp.source)+' ('+cnt+'个栏目)';
+    h+=' <a href="javascript:void(0)" onclick="switchTab(\'drugs\');loadDrugDetailBySrc(\''+escAttr(dn)+'\')" style="font-size:11px;color:#002FA7">查看详情 →</a></div>';
+    for(var s=0;s<grp.sections.length;s++){
+      var sec=grp.sections[s];
+      h+='<span class="source-tag" onclick="var p=this.parentNode;this.classList.toggle(\'open\')">'+esc(sec.section)+'<div class="src-excerpt"><strong>'+esc(dn)+' · '+esc(sec.source)+'</strong><br><br>'+esc(sec.excerpt)+'</div></span>';
+    }
+    h+='</div>';
   }
-  if(!tags)return'';
-  var h='<div class="source-tags"><div class="src-title">📖 药典原文参考 · '+esc(drugName)+' ('+seen.size+'个栏目,点击展开)</div>'+tags;
-  h+='<div style="margin-top:6px"><a href="javascript:void(0)" onclick="switchTab(\'drugs\');loadDrugDetailBySrc(\''+escAttr(drugName)+'\')" style="font-size:12px;color:#002FA7">🔍 查看完整药品详情 →</a></div>';
   h+='</div>';
   return h;
 }
 
-// 根据药名查找 drug_id 并打开详情
 window.loadDrugDetailBySrc=async function(drugName){
   if(!TOKEN) await getToken();
   try{
-    var r=await fetch(API_BASE+'/api/v1/drug/search?keyword='+encodeURIComponent(drugName)+'&page_size=1',{headers:authHeaders()});
+    var r=await fetch(API_BASE+'/api/v1/drug/search?keyword='+encodeURIComponent(drugName)+'&page_size=5',{headers:authHeaders()});
     var d=await r.json();var items=d.items||d.data||[];
-    if(items.length>0){loadDrugDetail(items[0].drug_id)}else{alert('未找到药品: '+drugName)}
+    // 精确匹配优先
+    var exact=items.filter(function(x){return x.name===drugName});
+    if(exact.length>0){loadDrugDetail(exact[0].drug_id)}
+    else if(items.length>0){loadDrugDetail(items[0].drug_id)}
+    else{alert('未找到药品: '+drugName)}
   }catch(e){}
 };