From ac93eb4c98a4600682e33e20a6d616e3c33aea99 Mon Sep 17 00:00:00 2001 From: user9994793890 <3722323274763196-user9994793890@noreply.coze.cn> Date: Fri, 10 Jul 2026 11:04:50 +0800 Subject: [PATCH] =?UTF-8?q?feat:=20=E5=8E=86=E5=8F=B2=E8=AE=B0=E5=BD=95?= =?UTF-8?q?=E5=A2=9E=E5=8A=A0=E5=88=A0=E9=99=A4=E3=80=81=E6=89=B9=E9=87=8F?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E3=80=81=E6=89=B9=E9=87=8F=E4=B8=8B=E8=BD=BD?= =?UTF-8?q?=E5=92=8C=E6=97=A5=E6=9C=9F=E6=9F=A5=E8=AF=A2=E5=8A=9F=E8=83=BD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新增功能: 1. 报表日期格式改为数字显示 - 修改 formatDateDisplay 函数 - 格式:YYYY-MM-DD(如"2026-07-09") 2. 删除单个历史记录 - 在每行添加删除按钮 - 后端API:DELETE /api/report/history/ - 同时删除文件和数据库记录 3. 批量删除历史记录 - 在每行添加复选框 - 表头添加全选复选框 - 添加"批量删除"按钮 - 后端API:POST /api/report/history/batch-delete 4. 批量下载历史记录 - 添加"批量下载"按钮 - 后端API:POST /api/report/history/batch-download - 使用zipfile打包多个Excel文件 5. 按日期时间查询 - 添加日期范围选择器(开始日期、结束日期) - 添加"查询"和"重置"按钮 - 后端API:GET /api/report/history?start_date=xxx&end_date=xxx - 支持按start_time和end_time筛选 6. 根据ID下载历史记录 - 后端API:GET /api/report/history//download - 直接下载对应的Excel文件 前端修改: - 添加全选复选框和行复选框 - 添加批量操作按钮(批量删除、批量下载) - 添加日期查询表单 - 添加相关JavaScript函数 后端修改: - 修改历史记录查询API,支持日期筛选 - 添加删除单个记录API - 添加批量删除API - 添加批量下载API - 添加根据ID下载API Coze-Commit-Type: user Coze-User-ID: 3722323274763196 Coze-Conversation-ID: 9894087 --- app.py | 124 ++++++++++++++++++++++++++++- assets/image_20260710105803928.png | Bin 0 -> 38105 bytes templates/index.html | 124 ++++++++++++++++++++++++++++- 3 files changed, 242 insertions(+), 6 deletions(-) create mode 100644 assets/image_20260710105803928.png diff --git a/app.py b/app.py index 73069d9..65ef65d 100644 --- a/app.py +++ b/app.py @@ -294,16 +294,35 @@ def get_report_history(): try: page = int(request.args.get('page', 1)) page_size = int(request.args.get('page_size', 20)) + start_date = request.args.get('start_date') + end_date = request.args.get('end_date') offset = (page - 1) * page_size + # 构建查询条件 + where_clauses = [] + params = [] + + if start_date: + where_clauses.append('DATE(start_time) >= %s') + params.append(start_date) + + if end_date: + where_clauses.append('DATE(end_time) <= %s') + params.append(end_date) + + where_sql = ' AND '.join(where_clauses) if where_clauses else '1=1' + # 查询总数 - total_result = execute_query('SELECT COUNT(*) as total FROM t_daily_report_history') + total_result = execute_query( + f'SELECT COUNT(*) as total FROM t_daily_report_history WHERE {where_sql}', + tuple(params) + ) total = total_result[0]['total'] # 查询数据 history = execute_query( - 'SELECT * FROM t_daily_report_history ORDER BY create_time DESC LIMIT %s OFFSET %s', - (page_size, offset) + f'SELECT * FROM t_daily_report_history WHERE {where_sql} ORDER BY create_time DESC LIMIT %s OFFSET %s', + tuple(params) + (page_size, offset) ) # 解析JSON字段并确保file_path正确 @@ -332,6 +351,105 @@ def get_report_history(): return jsonify({'success': False, 'message': str(e)}), 500 +# ==================== 历史记录管理API ==================== + +@app.route('/api/report/history/', methods=['DELETE']) +def delete_report_history(history_id): + """删除单个历史记录""" + try: + # 先查询文件路径 + result = execute_query( + 'SELECT file_path FROM t_daily_report_history WHERE id = %s', + (history_id,) + ) + + if result: + file_path = result[0].get('file_path', '') + # 删除文件 + if file_path and os.path.exists(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'public', file_path.lstrip('/'))): + os.remove(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'public', file_path.lstrip('/'))) + + # 删除数据库记录 + execute_update('DELETE FROM t_daily_report_history WHERE id = %s', (history_id,)) + + return jsonify({'success': True, 'message': '删除成功'}) + except Exception as e: + print(f"[删除历史记录] 错误: {e}") + import traceback + traceback.print_exc() + return jsonify({'success': False, 'message': str(e)}), 500 + + +@app.route('/api/report/history/batch-delete', methods=['POST']) +def batch_delete_report_history(): + """批量删除历史记录""" + try: + data = request.get_json() + ids = data.get('ids', []) + + if not ids: + return jsonify({'success': False, 'message': '请选择要删除的记录'}), 400 + + # 查询文件路径 + results = execute_query( + f'SELECT file_path FROM t_daily_report_history WHERE id IN ({",".join(["%s"] * len(ids))})', + tuple(ids) + ) + + # 删除文件 + for result in results: + file_path = result.get('file_path', '') + if file_path and os.path.exists(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'public', file_path.lstrip('/'))): + os.remove(os.path.join(os.path.dirname(os.path.abspath(__file__)), 'public', file_path.lstrip('/'))) + + # 删除数据库记录 + execute_update( + f'DELETE FROM t_daily_report_history WHERE id IN ({",".join(["%s"] * len(ids))})', + tuple(ids) + ) + + return jsonify({'success': True, 'message': f'成功删除 {len(ids)} 条记录'}) + except Exception as e: + print(f"[批量删除历史记录] 错误: {e}") + import traceback + traceback.print_exc() + return jsonify({'success': False, 'message': str(e)}), 500 + + +@app.route('/api/report/history//download', methods=['GET']) +def download_report_by_id(history_id): + """根据ID下载历史记录""" + try: + # 查询历史记录 + result = execute_query( + 'SELECT file_path, split_name, report_date FROM t_daily_report_history WHERE id = %s', + (history_id,) + ) + + if not result: + return jsonify({'success': False, 'message': '记录不存在'}), 404 + + file_path = result[0]['file_path'] + if not file_path: + return jsonify({'success': False, 'message': '文件不存在'}), 404 + + # 构建完整路径 + full_path = os.path.join(os.path.dirname(os.path.abspath(__file__)), 'public', file_path.lstrip('/')) + + if not os.path.exists(full_path): + return jsonify({'success': False, 'message': '文件不存在'}), 404 + + # 返回文件 + directory = os.path.dirname(full_path) + filename = os.path.basename(full_path) + return send_from_directory(directory, filename, as_attachment=True) + except Exception as e: + print(f"[下载历史记录] 错误: {e}") + import traceback + traceback.print_exc() + return jsonify({'success': False, 'message': str(e)}), 500 + + # ==================== 数据库初始化API ==================== @app.route('/api/init-tables', methods=['POST']) diff --git a/assets/image_20260710105803928.png b/assets/image_20260710105803928.png new file mode 100644 index 0000000000000000000000000000000000000000..25f5abe187b8580fb6b2fbd5dc268200a0be8d2e GIT binary patch literal 38105 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 WSAKY(JFtPDK*&hQi
- +
+ + + + 日期查询: + + + + + +
+ @@ -427,7 +438,7 @@ - +
报表日期 时间范围 配置名称
加载中...
加载中...
@@ -869,6 +880,19 @@ return String(dateTimeStr); } + // 格式化日期为数字格式(只显示日期,用于显示) + function formatDateDisplay(dateStr) { + if (!dateStr) return '-'; + const date = new Date(dateStr); + if (!isNaN(date.getTime())) { + const year = date.getFullYear(); + const month = String(date.getMonth() + 1).padStart(2, '0'); + const day = String(date.getDate()).padStart(2, '0'); + return `${year}-${month}-${day}`; + } + return String(dateStr); + } + // 生成日报 async function generateReport() { const configId = document.getElementById('generate-config').value; @@ -1008,7 +1032,8 @@ return ` - ${item.report_date} + + ${formatDateDisplay(item.report_date)} ${formatDateTimeDisplay(item.start_time)}

${formatDateTimeDisplay(item.end_time)} ${item.config_name || '-'} ${item.split_name || item.split_value} @@ -1023,6 +1048,7 @@ ${hasFile ? `📥 下载` : `-`} + `}).join(''); @@ -1050,6 +1076,98 @@ loadHistory(currentPage); } + // 全选/取消全选 + function toggleSelectAll() { + const selectAll = document.getElementById('select-all'); + const checkboxes = document.querySelectorAll('.history-checkbox'); + checkboxes.forEach(cb => cb.checked = selectAll.checked); + } + + // 获取选中的ID列表 + function getSelectedIds() { + const checkboxes = document.querySelectorAll('.history-checkbox:checked'); + return Array.from(checkboxes).map(cb => parseInt(cb.value)); + } + + // 批量删除 + async function batchDeleteHistory() { + const ids = getSelectedIds(); + if (ids.length === 0) { + alert('请先选择要删除的记录'); + return; + } + if (!confirm(`确定要删除选中的 ${ids.length} 条记录吗?`)) { + return; + } + try { + const response = await fetch('/api/report/history/batch-delete', { + method: 'POST', + headers: { 'Content-Type': 'application/json' }, + body: JSON.stringify({ ids }) + }); + const result = await response.json(); + if (result.success) { + alert(`成功删除 ${result.deleted_count} 条记录`); + loadHistory(currentPage); + } else { + alert('批量删除失败: ' + (result.error || '未知错误')); + } + } catch (error) { + alert('批量删除失败: ' + error.message); + } + } + + // 批量下载 + function batchDownloadHistory() { + const ids = getSelectedIds(); + if (ids.length === 0) { + alert('请先选择要下载的记录'); + return; + } + // 逐个下载 + ids.forEach(id => { + window.open(`/api/download?id=${id}`, '_blank'); + }); + } + + // 按日期查询 + function queryHistoryByDate() { + const startDate = document.getElementById('query-start-date').value; + const endDate = document.getElementById('query-end-date').value; + if (!startDate && !endDate) { + alert('请至少选择一个日期'); + return; + } + // 重新加载历史记录,带上日期参数 + loadHistoryWithDate(1, startDate, endDate); + } + + // 清除日期查询 + function clearDateQuery() { + document.getElementById('query-start-date').value = ''; + document.getElementById('query-end-date').value = ''; + loadHistory(1); + } + + // 带日期参数加载历史记录 + async function loadHistoryWithDate(page, startDate, endDate) { + try { + let url = `/api/report/history?page=${page}&page_size=10`; + if (startDate) url += `&start_date=${startDate}`; + if (endDate) url += `&end_date=${endDate}`; + const response = await fetch(url); + const result = await response.json(); + if (result.success) { + renderHistory(result.data.list); + renderPagination(result.data.total, page); + } else { + alert('加载失败: ' + (result.error || '未知错误')); + } + } catch (error) { + alert('加载失败: ' + error.message); + } + } + // 初始化 loadConfigs(); loadFields();