Álvaro Valenzuela Valdes commited on
Commit
d372f15
·
1 Parent(s): ebf9220

fix: make recommendation engine robust and prioritize recommendations in dashboard

Browse files
backend/app/routers/tenders.py CHANGED
@@ -111,29 +111,39 @@ async def get_recommended_tenders(db: Session = Depends(get_db)):
111
  return db.query(TenderModel).order_by(TenderModel.closing_date.asc()).limit(5).all()
112
 
113
  try:
114
- keywords = json.loads(profile.keywords)
 
 
 
115
  except:
116
  keywords = [profile.keywords] if profile.keywords else []
117
 
118
- if not keywords:
119
- return db.query(TenderModel).order_by(TenderModel.closing_date.asc()).limit(5).all()
 
120
 
121
- # Construir búsqueda por keywords
122
  filters = []
123
  for kw in keywords:
124
- if len(kw) < 3: continue
125
- filters.append(TenderModel.name.ilike(f"%{kw}%"))
126
- filters.append(TenderModel.description.ilike(f"%{kw}%"))
127
- filters.append(TenderModel.sector.ilike(f"%{kw}%"))
 
 
128
 
129
  if not filters:
130
- return db.query(TenderModel).order_by(TenderModel.closing_date.asc()).limit(5).all()
131
 
132
- recommended = db.query(TenderModel).filter(or_(*filters)).order_by(TenderModel.closing_date.asc()).limit(10).all()
 
133
 
134
- # If not enough results, add some newest ones to fill
135
- if len(recommended) < 5:
136
- more = db.query(TenderModel).order_by(TenderModel.closing_date.asc()).limit(5 - len(recommended)).all()
 
 
 
137
  recommended.extend(more)
138
 
139
  return recommended
 
111
  return db.query(TenderModel).order_by(TenderModel.closing_date.asc()).limit(5).all()
112
 
113
  try:
114
+ if profile.keywords.startswith("["):
115
+ keywords = json.loads(profile.keywords)
116
+ else:
117
+ keywords = [kw.strip() for kw in profile.keywords.split(",") if kw.strip()]
118
  except:
119
  keywords = [profile.keywords] if profile.keywords else []
120
 
121
+ # Si no hay keywords útiles, devolver las 10 más recientes como sugerencia
122
+ if not keywords or (len(keywords) == 1 and not keywords[0]):
123
+ return db.query(TenderModel).order_by(TenderModel.closing_date.desc()).limit(10).all()
124
 
125
+ # Construir búsqueda por keywords (Case-insensitive LIKE)
126
  filters = []
127
  for kw in keywords:
128
+ if len(kw) < 2: continue
129
+ search_term = f"%{kw}%"
130
+ filters.append(TenderModel.name.ilike(search_term))
131
+ filters.append(TenderModel.description.ilike(search_term))
132
+ filters.append(TenderModel.buyer.ilike(search_term))
133
+ filters.append(TenderModel.sector.ilike(search_term))
134
 
135
  if not filters:
136
+ return db.query(TenderModel).order_by(TenderModel.closing_date.desc()).limit(10).all()
137
 
138
+ # Ejecutar búsqueda por relevancia
139
+ recommended = db.query(TenderModel).filter(or_(*filters)).order_by(TenderModel.closing_date.desc()).limit(15).all()
140
 
141
+ # Si no hay matches específicos, rellenar con las más recientes
142
+ if not recommended:
143
+ recommended = db.query(TenderModel).order_by(TenderModel.closing_date.desc()).limit(10).all()
144
+ elif len(recommended) < 5:
145
+ existing_ids = [r.id for r in recommended]
146
+ more = db.query(TenderModel).filter(TenderModel.id.not_in(existing_ids)).order_by(TenderModel.closing_date.desc()).limit(5).all()
147
  recommended.extend(more)
148
 
149
  return recommended
frontend/components/Dashboard.tsx CHANGED
@@ -315,8 +315,8 @@ export default function Dashboard({
315
  IA Recommendations for your Company
316
  </h3>
317
  <div className="space-y-3">
318
- {(tenders.length > 0 || recommendations.length > 0) ? (
319
- (tenders.length > 0 ? tenders : recommendations).slice(0, 6).map((t) => (
320
  // ... existing map logic ...
321
  <div
322
  key={t.code}
 
315
  IA Recommendations for your Company
316
  </h3>
317
  <div className="space-y-3">
318
+ {(recommendations.length > 0 || tenders.length > 0) ? (
319
+ (recommendations.length > 0 ? recommendations : tenders).slice(0, 6).map((t) => (
320
  // ... existing map logic ...
321
  <div
322
  key={t.code}