feat(dashboard): The dashboard supports displaying real-time data

This commit is contained in:
wangjiahao
2026-02-28 16:02:08 +08:00
parent 9dccaf12d1
commit 82de276aad
4 changed files with 37 additions and 13 deletions
+17 -7
View File
@@ -1,5 +1,5 @@
import datetime
from typing import List, Optional, Union
from typing import List, Optional, Union, Dict, Any
import orjson
import sqlparse
@@ -18,7 +18,7 @@ from apps.system.crud.assistant import AssistantOutDs, AssistantOutDsFactory
from apps.system.schemas.system_schema import AssistantOutDsSchema
from common.core.deps import CurrentAssistant, SessionDep, CurrentUser, Trans
from common.utils.data_format import DataFormat
from common.utils.utils import extract_nested_json
from common.utils.utils import extract_nested_json, SQLBotLogUtil
def get_chat_record_by_id(session: SessionDep, record_id: int):
@@ -243,14 +243,24 @@ def get_chart_data_with_user_live(session: SessionDep, current_user: CurrentUser
return get_chart_data_ds(session,row.datasource, row.sql)
def get_chart_data_ds(session: SessionDep,ds_id,sql):
json_result: Dict[str, Any] = {'status': 'success','data':[],'message':''}
try:
datasource = get_ds(session,ds_id)
result = exec_sql(ds=datasource,sql=sql, origin_column=False)
_data = DataFormat.convert_large_numbers_in_object_array(result.get('data'))
return _data
except Exception:
if datasource is None:
json_result['status'] = 'failed'
json_result['message'] = 'Datasource not found'
return json_result
else:
result = exec_sql(ds=datasource,sql=sql, origin_column=False)
_data = DataFormat.convert_large_numbers_in_object_array(result.get('data'))
json_result['data'] = _data
return json_result
except Exception as e:
SQLBotLogUtil.error(f"Function failed: {e}")
json_result['status'] = 'failed'
json_result['message'] = f"{e}"
pass
return []
return json_result
def get_chat_chart_data(session: SessionDep, chat_record_id: int):
stmt = select(ChatRecord.data).where(and_(ChatRecord.id == chat_record_id))
@@ -49,11 +49,12 @@ def load_resource(session: SessionDep, dashboard: QueryDashboard):
result_dict = dict(result)
canvas_view_obj = orjson.loads(result_dict['canvas_view_info'])
for item in canvas_view_obj.values(): # 直接遍历值
# 检查必要字段是否存在
for item in canvas_view_obj.values():
if all(key in item for key in ['datasource', 'sql']) and item['datasource'] is not None:
item['data']['data'] = get_chart_data_ds(session, item['datasource'], item['sql'])
data_result = get_chart_data_ds(session, item['datasource'], item['sql'])
item['data']['data'] = data_result['data']
item['status'] = data_result['status']
item['message'] = data_result['message']
result_dict['canvas_view_info'] = orjson.dumps(canvas_view_obj)
return result_dict
@@ -32,7 +32,6 @@ defineProps({
}
:deep(.ed-empty__description) {
margin-top: 8px;
color: var(--N600, #646a73);
text-align: center;
font-size: 14px;
@@ -156,8 +156,11 @@ defineExpose({
</div>
</div>
<div class="chart-show-area">
<div v-if="viewInfo.status === 'failed'" class="error-info">
{{ viewInfo.message }}
</div>
<ChartComponent
v-if="viewInfo.id"
v-else-if="viewInfo.id"
:id="outerId || viewInfo.id"
ref="chartRef"
:type="chartType"
@@ -383,4 +386,15 @@ defineExpose({
}
}
}
.error-info {
width: 100%;
height: 100%;
display: flex;
flex-direction: column;
justify-content: center;
align-items: center;
font-size: 12px;
color: var(--N600, #646a73);
}
</style>