Á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 |
-
|
|
|
|
|
|
|
|
|
|
| 115 |
except:
|
| 116 |
keywords = [profile.keywords] if profile.keywords else []
|
| 117 |
|
| 118 |
-
|
| 119 |
-
|
|
|
|
| 120 |
|
| 121 |
-
# Construir búsqueda por keywords
|
| 122 |
filters = []
|
| 123 |
for kw in keywords:
|
| 124 |
-
if len(kw) <
|
| 125 |
-
|
| 126 |
-
filters.append(TenderModel.
|
| 127 |
-
filters.append(TenderModel.
|
|
|
|
|
|
|
| 128 |
|
| 129 |
if not filters:
|
| 130 |
-
return db.query(TenderModel).order_by(TenderModel.closing_date.
|
| 131 |
|
| 132 |
-
|
|
|
|
| 133 |
|
| 134 |
-
#
|
| 135 |
-
if
|
| 136 |
-
|
|
|
|
|
|
|
|
|
|
| 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 |
-
{(
|
| 319 |
-
(
|
| 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}
|