fix: solved problem in msql query

master
adriano 2025-09-25 09:30:11 -03:00
parent 7e75d15a27
commit 4dcdcbb743
1 changed files with 75 additions and 62 deletions

View File

@ -20,7 +20,6 @@ class TranscriptionReportService:
self.company_id = str(company_id)
self.start_date = start_date
self.end_date = end_date
self.end_date = end_date
self.mongo_client = current_app.mongo_client
self.mongo_results = []
self.unique_ids= []
@ -178,83 +177,97 @@ class TranscriptionReportService:
}
def _fetch_mysql_data(self, hit_report: Optional[bool] = False)-> List[Dict[str, Any]]:
def _fetch_mysql_data(self, hit_report: Optional[bool] = False) -> List[Dict[str, Any]]:
# Carrega tabela de produtos (usada depois em client_price_row)
collection = self.mongo_client["billing-api"]["api_products"]
products = list(collection.find({}))
sql = f"""SELECT
# IDs vindos do Mongo (sessionId). Se vazio, nada a consultar.
ids = [str(uid) for uid in self.unique_ids]
if not ids:
return []
# Monta IN(...) seguro contra quote simples e compatível com 1 ou N itens
def _sql_quote(v: str) -> str:
return "'" + v.replace("'", "''") + "'"
in_clause = "(" + ",".join(_sql_quote(v) for v in ids) + ")"
sql = f"""
SELECT
uniqueid,
src,
dst,
MIN(calldate) AS start_call,
MAX(calldate) AS end_call,
SUM(CASE
WHEN dstchannel LIKE 'PJSIP/%' AND lastapp = 'Queue'
THEN billsec
SUM(
CASE
WHEN dstchannel LIKE 'PJSIP/%' AND lastapp = 'Queue' THEN billsec
ELSE 0
END) AS total_billsec
FROM
tab_cdr
WHERE
uniqueid IN {tuple(self.unique_ids)}
GROUP BY
uniqueid, src, dst;"""
rows = execute_query(self.company_id, sql)
END
) AS total_billsec
FROM tab_cdr
WHERE uniqueid IN {in_clause}
GROUP BY uniqueid, src, dst;
"""
rows = execute_query(self.company_id, sql)
if hit_report:
for row in rows:
row["companyId"] = self.company_id
if rowMongo := next((m for m in self.mongo_results if m["_id"] == row["uniqueid"] ), None):
row["custo_hit"] = f"{float(rowMongo["totalCost"])}"
rowMongo = next((m for m in self.mongo_results if m["_id"] == row["uniqueid"]), None)
if rowMongo:
row["custo_hit"] = str(float(rowMongo["totalCost"]))
token_output = rowMongo.get('usageByType', {}).get('output', {})
token_input = rowMongo.get('usageByType', {}).get('input',{})
usage_by_type = rowMongo.get("usageByType", {})
token_output = usage_by_type.get("output", {})
token_input = usage_by_type.get("input", {})
row["qtd_token_input"] = token_input.get('usage', 0)
row["qtd_token_output"] = token_output.get('usage', 0)
row["total_cost_token"] = float(token_input.get('usageCost',0) + token_output.get('usageCost', 0))
row["llm_provider"] = token_output.get('provider','unknown')
stt = rowMongo.get('usageByType', {}).get('stt',{})
row["qtd_token_input"] = token_input.get("usage", 0)
row["qtd_token_output"] = token_output.get("usage", 0)
row["total_cost_token"] = float(token_input.get("usageCost", 0) + token_output.get("usageCost", 0))
row["llm_provider"] = token_output.get("provider", "unknown")
stt = usage_by_type.get("stt", {})
if not stt:
stt = rowMongo.get('usageByType', {}).get('input-audio',{})
stt = usage_by_type.get("input-audio", {})
# seconds
token_by_second = 1920 / 60 # Cobrança de token por minuto do modelo gemini flash 2.5 input de audio
usageSeconds = round(stt.get('usage', 0) / token_by_second)
token_by_second = 1920 / 60 # tokens por segundo usando modelo gemini 2.5 flash input audio
usageSeconds = round(stt.get("usage", 0) / token_by_second)
row["stt_model"] = stt.get('product', 'unknown')
row["stt_provider"] = stt.get('provider', 'unknown')
model_name = stt.get("product", "unknown")
if "-input-audio" in model_name:
# Ajuste para situações como gemini-2.5-flash-input-audio para modificar para gemini-2.5-flash
model_name = model_name.replace("-input-audio", "")
row["stt_model"] = model_name
row["stt_provider"] = stt.get("provider", "unknown")
row["stt_cost"] = rowMongo["totalCost"]
row["stt_usage"] = usageSeconds
else:
row["stt_model"] = stt.get('product', 'unknown')
row["stt_provider"] = stt.get('provider', 'unknown')
row["stt_cost"] = stt.get('usageCost', 0)
row["stt_usage"] = stt.get('usage', 0)
row["stt_model"] = stt.get("product", "unknown")
row["stt_provider"] = stt.get("provider", "unknown")
row["stt_cost"] = stt.get("usageCost", 0)
row["stt_usage"] = stt.get("usage", 0)
row["total_min"] = f"{(int(row['total_billsec']) / 60):.2f}"
self.client_price_row(products, row)
self.formate_properties(row)
else:
for row in rows:
row["total_min"] = f"{(int(row['total_billsec']) / 60):.2f}"
self.client_price_row(products, row)
self.formate_properties(row)
return rows
def formate_properties(self, row):
for key in row:
if isinstance(row[key], datetime):