From 82ce930416994c2119416caed713e976f8d7aede Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Fri, 5 Jun 2026 17:58:11 +0800 Subject: [PATCH 1/2] update --- b/cntoai/process_user_billing.dspy | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/b/cntoai/process_user_billing.dspy b/b/cntoai/process_user_billing.dspy index 2dc2e17..dc8c87a 100644 --- a/b/cntoai/process_user_billing.dspy +++ b/b/cntoai/process_user_billing.dspy @@ -260,6 +260,13 @@ async def process_user_billing(ns={}): 'status': 'error', 'msg': 'llmid必传' } + model_name = ns.get('model') + if not model_name: + debug(f"{userid} process_user_billing model必传") + return { + 'status': 'error', + 'msg': 'model必传' + } try: amount = round(float(amount), 12) @@ -275,6 +282,9 @@ async def process_user_billing(ns={}): async with db.sqlorContext('kboss') as sor: try: product_li = await sor.R('product', {'providerpid': llmid, 'del_flg': '0'}) + if not product_li: + product_li = await sor.R('product', {'product_code': model_name, 'del_flg': '0'}) + if not product_li: debug(f"{userid} process_user_billing 未找到对应产品,请确认") return { From 8e6cd7051ad04b5dde9a5e3eec73da0addf0cbf7 Mon Sep 17 00:00:00 2001 From: ping <1017253325@qq.com> Date: Mon, 8 Jun 2026 11:20:00 +0800 Subject: [PATCH 2/2] update --- b/cntoai/model_usage_admin_report.dspy | 4 ++-- b/cntoai/model_usage_user_report.dspy | 4 ++-- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/b/cntoai/model_usage_admin_report.dspy b/b/cntoai/model_usage_admin_report.dspy index 6b235db..cdd1f91 100644 --- a/b/cntoai/model_usage_admin_report.dspy +++ b/b/cntoai/model_usage_admin_report.dspy @@ -178,7 +178,7 @@ async def _query_model_usage_rows(sor, conditions, limit=None, offset=None): sql = """ SELECT id, userid, llmid, original_price, orderid, bill_status, usage_content, created_at FROM model_usage - WHERE %s + WHERE %s AND bill_status = '0' ORDER BY created_at DESC """ % where_clause if limit is not None: @@ -188,7 +188,7 @@ async def _query_model_usage_rows(sor, conditions, limit=None, offset=None): async def _count_model_usage(sor, conditions): where_clause = ' AND '.join(conditions) if conditions else '1 = 1' - sql = 'SELECT COUNT(*) AS total_count FROM model_usage WHERE %s' % where_clause + sql = 'SELECT COUNT(*) AS total_count FROM model_usage WHERE %s AND bill_status = "0"' % where_clause return (await sor.sqlExe(sql, {}))[0]['total_count'] diff --git a/b/cntoai/model_usage_user_report.dspy b/b/cntoai/model_usage_user_report.dspy index 256d66d..ce827ba 100644 --- a/b/cntoai/model_usage_user_report.dspy +++ b/b/cntoai/model_usage_user_report.dspy @@ -95,7 +95,7 @@ def _normalize_usage_row(row, bill_amount_map=None): 'prompt_tokens': int(usage.get('prompt_tokens') or 0), 'completion_tokens': int(usage.get('completion_tokens') or 0), 'total_tokens': int(usage.get('total_tokens') or 0), - 'amount': round(amount, 4), + 'amount': round(amount, 2), 'bill_status': row.get('bill_status'), 'orderid': orderid, 'usage_time': row.get('created_at'), @@ -155,7 +155,7 @@ async def _query_model_usage_rows(sor, conditions, limit=None, offset=None): sql = """ SELECT id, userid, llmid, original_price, orderid, bill_status, usage_content, created_at FROM model_usage - WHERE %s + WHERE %s AND bill_status = '0' ORDER BY created_at DESC """ % where_clause if limit is not None: