From d2ba256889023eadfaa27e514859e3c3a22419da Mon Sep 17 00:00:00 2001 From: haoslm <6083297@qq.com> Date: Tue, 21 Jul 2026 13:30:04 +0800 Subject: [PATCH] =?UTF-8?q?1=EF=BC=8C=E4=BF=AE=E5=A4=8D=E9=A9=BF=E6=9D=A5?= =?UTF-8?q?=E7=89=B9=E6=B2=A1=E6=9C=89=E6=95=B0=E6=8D=AE=EF=BC=8C=E5=8F=AA?= =?UTF-8?q?=E7=89=B9=E6=9D=A5=E7=94=B5=E6=9C=89=EF=BC=8C=E4=B8=8D=E7=94=9F?= =?UTF-8?q?=E6=88=90=E6=8A=A5=E8=A1=A8=E7=9A=84=E9=97=AE=E9=A2=98=E3=80=82?= =?UTF-8?q?=202=EF=BC=8C=E5=A2=9E=E5=8A=A0=E5=8E=86=E5=8F=B2=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=EF=BC=8C=E6=AF=8F=E9=A1=B5=E6=98=BE=E7=A4=BA=E5=A4=9A?= =?UTF-8?q?=E5=B0=91=E6=9D=A1=E7=9A=84=E5=8A=9F=E8=83=BD=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- lib/api/report_api.py | 7 +++- lib/report_generator.py | 21 ++++++---- public/static/js/history.js | 77 ++++++++++++++++++++++++++++--------- templates/index.html | 22 +++++++++-- 4 files changed, 96 insertions(+), 31 deletions(-) diff --git a/lib/api/report_api.py b/lib/api/report_api.py index 94d30e9..02ff00f 100644 --- a/lib/api/report_api.py +++ b/lib/api/report_api.py @@ -53,7 +53,8 @@ def get_report_history(): page_size = int(request.args.get('page_size', 20)) start_date = request.args.get('start_date') end_date = request.args.get('end_date') - log_info(f'[报表API] 获取历史记录,第{page}页,日期范围: {start_date or "开始"} ~ {end_date or "结束"}', 'api') + status = request.args.get('status') + log_info(f'[报表API] 获取历史记录,第{page}页,状态: {status or "全部"},日期范围: {start_date or "开始"} ~ {end_date or "结束"}', 'api') offset = (page - 1) * page_size @@ -69,6 +70,10 @@ def get_report_history(): where_clauses.append('DATE(end_time) <= %s') params.append(end_date) + if status is not None and status != '': + where_clauses.append('status = %s') + params.append(int(status)) + where_sql = ' AND '.join(where_clauses) if where_clauses else '1=1' # 查询总数 diff --git a/lib/report_generator.py b/lib/report_generator.py index d88dfd4..9fa7c30 100644 --- a/lib/report_generator.py +++ b/lib/report_generator.py @@ -370,6 +370,8 @@ def generate_daily_report(config_id, start_time=None, end_time=None): # 执行查询 orders = execute_query(sql, tuple(params)) + # 转换为列表,方便后续添加特来电数据 + orders = list(orders) if orders else [] log_info(f"[日报生成] 驿来特查询到 {len(orders)} 条订单", 'report') @@ -383,8 +385,8 @@ def generate_daily_report(config_id, start_time=None, end_time=None): log_info(f"[日报生成] 检测到补单记录,将在文件名中添加标记", 'report') # 检查是否需要合并特来电数据 - merge_telecom = config.get('merge_telecom', 0) - telecom_vehicle_no = config.get('telecom_vehicle_no', '') + merge_telecom = config.get('merge_telecom') or 0 + telecom_vehicle_no = config.get('telecom_vehicle_no') or '' if merge_telecom and config['split_type'] == 'company_id' and telecom_vehicle_no: # 解析车量自编号(支持逗号分隔的多个) @@ -392,6 +394,7 @@ def generate_daily_report(config_id, start_time=None, end_time=None): if vehicle_nos: log_info(f"[日报生成] 开始合并特来电数据,车量自编号: {vehicle_nos}", 'report') telecom_orders = query_telecom_orders(vehicle_nos, start_time_str, end_time_str) + log_info(f"[日报生成] 特来电查询到 {len(telecom_orders)} 条订单", 'report') if telecom_orders: # 将特来电数据添加到订单列表 orders.extend(telecom_orders) @@ -447,15 +450,19 @@ def generate_daily_report(config_id, start_time=None, end_time=None): # 计算求和(保留三位小数) sum_results = {} for field in sum_fields: - if field in orders[0]: + # 检查是否至少有一条订单包含该字段 + has_field = any(field in order for order in orders) + if has_field: total = sum(float(order.get(field, 0) or 0) for order in orders) sum_results[field] = round(total, 3) # 强制采集充电电量(charge_degree),即使不在求和字段配置中也要采集 - if 'charge_degree' not in sum_results and orders and 'charge_degree' in orders[0]: - total_charge_degree = sum(float(order.get('charge_degree', 0) or 0) for order in orders) - sum_results['charge_degree'] = round(total_charge_degree, 3) - log_info(f"[日报生成] 强制采集充电电量: {sum_results['charge_degree']} kWh", 'report') + if 'charge_degree' not in sum_results and orders: + has_charge_degree = any('charge_degree' in order for order in orders) + if has_charge_degree: + total_charge_degree = sum(float(order.get('charge_degree', 0) or 0) for order in orders) + sum_results['charge_degree'] = round(total_charge_degree, 3) + log_info(f"[日报生成] 强制采集充电电量: {sum_results['charge_degree']} kWh", 'report') # 构建ID到名称的映射 id_name_maps = build_id_to_name_map(orders, selected_fields) diff --git a/public/static/js/history.js b/public/static/js/history.js index 1015360..b95985a 100644 --- a/public/static/js/history.js +++ b/public/static/js/history.js @@ -1,3 +1,20 @@ +let historyStartDate = ''; +let historyEndDate = ''; +let historyStatus = ''; +let historyPageSize = 10; + +// 每页显示条数变化 +function onHistoryPageSizeChange() { + historyPageSize = parseInt(document.getElementById('history-page-size').value) || 10; + loadHistoryWithDate(1); +} + +// 状态筛选变化 +function onHistoryStatusChange() { + historyStatus = document.getElementById('history-status-filter').value; + loadHistoryWithDate(1); +} + // 批量下载历史记录 async function batchDownloadHistory() { const checkboxes = document.querySelectorAll('.history-checkbox:checked'); @@ -18,18 +35,19 @@ async function batchDownloadHistory() { function queryHistoryByDate() { const startDate = document.getElementById('history-start-date').value; const endDate = document.getElementById('history-end-date').value; - if (!startDate && !endDate) { - alert('请至少选择一个日期'); - return; - } - // 重新加载历史记录,带上日期参数 - loadHistoryWithDate(1, startDate, endDate); + historyStartDate = startDate; + historyEndDate = endDate; + loadHistoryWithDate(1); } -// 清除日期查询 -function clearDateQuery() { +// 清除筛选 +function clearHistoryFilter() { + document.getElementById('history-status-filter').value = ''; document.getElementById('history-start-date').value = ''; document.getElementById('history-end-date').value = ''; + historyStatus = ''; + historyStartDate = ''; + historyEndDate = ''; loadHistory(1); } @@ -161,7 +179,7 @@ function renderHistory(list) { } // 渲染分页控件 -function renderPagination(page, pageSize, total) { +function renderPagination(page, total, pageSize) { const container = document.getElementById('history-pagination'); if (!container) return; @@ -178,8 +196,21 @@ function renderPagination(page, pageSize, total) { html += ``; } - // 页码 - for (let i = 1; i <= totalPages; i++) { + // 页码(最多显示7个页码) + let startPage = Math.max(1, page - 3); + let endPage = Math.min(totalPages, startPage + 6); + if (endPage - startPage < 6) { + startPage = Math.max(1, endPage - 6); + } + + if (startPage > 1) { + html += ``; + if (startPage > 2) { + html += `...`; + } + } + + for (let i = startPage; i <= endPage; i++) { if (i === page) { html += ``; } else { @@ -187,6 +218,13 @@ function renderPagination(page, pageSize, total) { } } + if (endPage < totalPages) { + if (endPage < totalPages - 1) { + html += `...`; + } + html += ``; + } + // 下一页 if (page < totalPages) { html += ``; @@ -201,18 +239,19 @@ async function loadHistory(page = 1) { loadHistoryWithDate(page); } -async function loadHistoryWithDate(page, startDate, endDate) { +async function loadHistoryWithDate(page) { try { - let url = `/api/report/history?page=${page}&page_size=10`; - if (startDate) url += `&start_date=${startDate}`; - if (endDate) url += `&end_date=${endDate}`; + let url = `/api/report/history?page=${page}&page_size=${historyPageSize}`; + if (historyStatus) url += `&status=${historyStatus}`; + if (historyStartDate) url += `&start_date=${historyStartDate}`; + if (historyEndDate) url += `&end_date=${historyEndDate}`; const response = await fetch(url); const result = await response.json(); if (result.success) { renderHistory(result.data.list); - renderPagination(result.data.total, page); + renderPagination(result.data.page, result.data.total, result.data.page_size); } else { - alert('加载失败: ' + (result.error || '未知错误')); + alert('加载失败: ' + (result.error || result.message || '未知错误')); } } catch (error) { alert('加载失败: ' + error.message); @@ -243,7 +282,7 @@ async function deleteHistory(id) { const result = await response.json(); if (result.success) { alert('删除成功'); - loadHistory(); + loadHistoryWithDate(); } else { alert('删除失败: ' + result.message); } @@ -275,7 +314,7 @@ async function batchDeleteHistory() { const result = await response.json(); if (result.success) { alert(result.message); - loadHistory(); + loadHistoryWithDate(); } else { alert('删除失败: ' + result.message); } diff --git a/templates/index.html b/templates/index.html index 409a0d5..07f1638 100644 --- a/templates/index.html +++ b/templates/index.html @@ -91,13 +91,27 @@