providerid = params_kw.get('providerid', '') org_id = params_kw.get('org_id', '') # Build filter conditions conditions = ["providerid IS NULL OR providerid = ''"] params = {} if providerid: conditions.append("providerid = ${pid}$") params['pid'] = providerid if org_id: conditions.append("org_id = ${oid}$") params['oid'] = org_id where_clause = " AND ".join(conditions) # 1. Count products to update async with DBPools().sqlorContext('sage') as sor: count_rows = await sor.sqlExe( f"SELECT COUNT(*) as cnt FROM product WHERE {where_clause}", params ) total = count_rows[0].cnt if count_rows else 0 if total == 0: return json.dumps({"status": "ok", "message": "没有需要回填的产品"}) # 2. Update providerid from llm table (product.resource_ref_id = llm.id) async with DBPools().sqlorContext('llmage') as sor: llms = await sor.sqlExe( "SELECT id, providerid FROM llm WHERE status = 'published'", {} ) llm_pid = {r.id: r.providerid for r in llms if r.providerid} # 3. Get products and update updated = 0 async with DBPools().sqlorContext('sage') as sor: rows = await sor.sqlExe( f"SELECT id, resource_ref_id, product_name FROM product WHERE {where_clause}", params ) for p in rows: pid = llm_pid.get(p.resource_ref_id, '') if pid: await sor.sqlExe( "UPDATE product SET providerid = ${pid}$ WHERE id = ${id}$", {'pid': pid, 'id': p.id} ) updated += 1 return json.dumps({ "status": "ok", "message": f"回填完成: 共{total}条空providerid, 成功回填{updated}条" }, ensure_ascii=False)