版本变更V3.31添加识图功能
This commit is contained in:
@ -80,73 +80,81 @@ def image_search():
|
||||
SELECT id, name, spec_model, image_url,
|
||||
(1 - (vec <=> :query_vector)) AS similarity
|
||||
FROM (
|
||||
SELECT id,
|
||||
COALESCE(name, '') AS name,
|
||||
COALESCE(spec, '') AS spec_model,
|
||||
COALESCE(product_image, '') AS image_url,
|
||||
img_embedding AS vec
|
||||
-- 1. 基础物料表
|
||||
SELECT id, name, spec_model, product_image AS image_url, img_embedding AS vec
|
||||
FROM material_base
|
||||
WHERE img_embedding IS NOT NULL
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT id,
|
||||
'采购入库' AS name,
|
||||
'到货照片' AS spec_model,
|
||||
COALESCE(arrival_photo, '') AS image_url,
|
||||
arrival_image_embedding AS vec
|
||||
FROM stock_buy
|
||||
WHERE arrival_image_embedding IS NOT NULL
|
||||
-- 2. 采购入库表 (通过 base_id 关联拿真实物料)
|
||||
SELECT mb.id, mb.name, mb.spec_model, sb.arrival_photo AS image_url, sb.arrival_image_embedding AS vec
|
||||
FROM stock_buy sb
|
||||
JOIN material_base mb ON sb.base_id = mb.id
|
||||
WHERE sb.arrival_image_embedding IS NOT NULL
|
||||
|
||||
UNION ALL
|
||||
|
||||
SELECT id,
|
||||
'采购入库' AS name,
|
||||
'质检报告' AS spec_model,
|
||||
COALESCE(qc_report, '') AS image_url,
|
||||
qc_report_image_embedding AS vec
|
||||
FROM stock_buy
|
||||
WHERE qc_report_image_embedding IS NOT NULL
|
||||
-- 3. 半成品入库表
|
||||
SELECT mb.id, mb.name, mb.spec_model, ss.arrival_photo AS image_url, ss.arrival_image_embedding AS vec
|
||||
FROM stock_semi ss
|
||||
JOIN material_base mb ON ss.base_id = mb.id
|
||||
WHERE ss.arrival_image_embedding IS NOT NULL
|
||||
|
||||
UNION ALL
|
||||
|
||||
-- 4. 成品入库表
|
||||
SELECT mb.id, mb.name, mb.spec_model, sp.product_photo AS image_url, sp.arrival_image_embedding AS vec
|
||||
FROM stock_product sp
|
||||
JOIN material_base mb ON sp.base_id = mb.id
|
||||
WHERE sp.arrival_image_embedding IS NOT NULL
|
||||
) AS combined
|
||||
ORDER BY vec <=> :query_vector
|
||||
LIMIT 10
|
||||
ORDER BY vec <=> :query_vector LIMIT 10
|
||||
""")
|
||||
|
||||
result = db.session.execute(sql, {"query_vector": query_vector_str})
|
||||
rows = result.fetchall()
|
||||
# 执行查询
|
||||
records = db.session.execute(sql, {"query_vector": query_vector_str}).fetchall()
|
||||
|
||||
results = []
|
||||
for row in rows:
|
||||
item_id = row[0]
|
||||
item_name = row[1] or ""
|
||||
spec_model = row[2] or ""
|
||||
raw_image = row[3]
|
||||
seen_product_ids = set() # 【新增】用来记录已经添加过的物料 ID
|
||||
|
||||
# 解析图片 URL 列表,取第一张
|
||||
image_url = ""
|
||||
if raw_image:
|
||||
try:
|
||||
image_list = json.loads(raw_image)
|
||||
if image_list and len(image_list) > 0:
|
||||
image_url = image_list[0]
|
||||
except Exception:
|
||||
# 纯字符串直接使用
|
||||
image_url = str(raw_image)
|
||||
for row in records:
|
||||
# 【新增】如果这个物料已经在这个列表里了,直接跳过它
|
||||
if row.id in seen_product_ids:
|
||||
continue
|
||||
|
||||
# 记录这个物料 ID,保证下次不会再重复添加
|
||||
seen_product_ids.add(row.id)
|
||||
|
||||
# 1. 提取原始 URL
|
||||
raw_url = row.image_url
|
||||
clean_url = ""
|
||||
|
||||
if raw_url:
|
||||
if raw_url.startswith('[') and raw_url.endswith(']'):
|
||||
import json
|
||||
try:
|
||||
url_list = json.loads(raw_url)
|
||||
clean_url = url_list[0] if url_list else ""
|
||||
except:
|
||||
clean_url = raw_url
|
||||
else:
|
||||
clean_url = raw_url
|
||||
|
||||
# 2. 组装返回结果
|
||||
results.append({
|
||||
"id": item_id,
|
||||
"name": item_name,
|
||||
"spec_model": spec_model,
|
||||
"image_url": image_url,
|
||||
"similarity": round(float(row[4]), 4)
|
||||
"product_id": row.id,
|
||||
"product_name": row.name,
|
||||
"spec_model": row.spec_model,
|
||||
"image_url": clean_url,
|
||||
"similarity": round(float(row.similarity), 4)
|
||||
})
|
||||
|
||||
print(f"✅ [ImageSearch] 跨表检索完成,命中 {len(results)} 条结果")
|
||||
return jsonify({
|
||||
"code": 200,
|
||||
"msg": "检索成功",
|
||||
"data": results
|
||||
})
|
||||
# 【新增】只要凑够了 10 个完全不同的物料,就立刻结束循环
|
||||
if len(results) >= 10:
|
||||
break
|
||||
|
||||
return jsonify({"code": 200, "data": results})
|
||||
|
||||
except Exception as e:
|
||||
print(f"❌ [ImageSearch] 数据库检索失败: {e}")
|
||||
|
||||
Reference in New Issue
Block a user