diff --git a/lib/api/sum_data_api.py b/lib/api/sum_data_api.py index 7d00cad..1947794 100644 --- a/lib/api/sum_data_api.py +++ b/lib/api/sum_data_api.py @@ -22,9 +22,11 @@ def collect_sum_data(): try: data = request.get_json(silent=True) or {} history_id = data.get('history_id') - log_info(f'[求和数据API] 采集求和数据,历史记录ID: {history_id or "全部"}', 'api') + start_date = data.get('start_date') + end_date = data.get('end_date') + log_info(f'[求和数据API] 采集求和数据,历史记录ID: {history_id or "全部"},日期范围: {start_date or "开始"} ~ {end_date or "结束"}', 'api') - result = collect_sum_data_from_history(history_id) + result = collect_sum_data_from_history(history_id, start_date, end_date) if result['success']: log_info(f'[求和数据API] 采集成功: {result["message"]}', 'api') return jsonify(result) diff --git a/lib/sum_data_collector.py b/lib/sum_data_collector.py index 5d6c8b4..d75fc28 100644 --- a/lib/sum_data_collector.py +++ b/lib/sum_data_collector.py @@ -9,13 +9,15 @@ from lib.field_mapping import get_field_display_name from lib.logger import log_info, log_error, log_warning -def collect_sum_data_from_history(history_id=None): +def collect_sum_data_from_history(history_id=None, start_date=None, end_date=None): """ 从历史记录中采集求和数据并写入求和数据表 充电电量(charge_degree)是必须采集的,其他求和字段有就采集,没有就不采集 Args: history_id: 历史记录ID(可选,不填则采集所有成功的历史记录) + start_date: 开始日期(可选,格式 YYYY-MM-DD) + end_date: 结束日期(可选,格式 YYYY-MM-DD) Returns: dict: 采集结果 @@ -28,8 +30,18 @@ def collect_sum_data_from_history(history_id=None): (history_id,) ) else: + where_clauses = ['status = 1'] + params = [] + if start_date: + where_clauses.append('report_date >= %s') + params.append(start_date) + if end_date: + where_clauses.append('report_date <= %s') + params.append(end_date) + where_sql = ' AND '.join(where_clauses) history_list = execute_query( - 'SELECT * FROM t_daily_report_history WHERE status = 1 ORDER BY create_time DESC' + f'SELECT * FROM t_daily_report_history WHERE {where_sql} ORDER BY create_time DESC', + tuple(params) ) if not history_list: @@ -506,6 +518,10 @@ def update_sum_data(sum_data_id, data): update_fields.append('remark = %s') params.append(data['remark']) + if 'data_source' in data: + update_fields.append('data_source = %s') + params.append(data['data_source']) + if not update_fields: return {'success': False, 'message': '没有需要更新的字段'} diff --git a/public/static/js/sum_data.js b/public/static/js/sum_data.js index ebde454..7648f29 100644 --- a/public/static/js/sum_data.js +++ b/public/static/js/sum_data.js @@ -33,9 +33,8 @@ function renderSumDataList(rawList) { } }); - // 排序:峰平谷按顺序 - const fieldOrder = ['sharp_electricity', 'peak_electricity', 'flat_electricity', 'valley_electricity', - 'peak_degree', 'peak_time_degree', 'normal_time_degree', 'valley_time_degree']; + // 排序:尖峰平谷按顺序 + const fieldOrder = ['sharp_electricity', 'peak_electricity', 'flat_electricity', 'valley_electricity']; sumDataDynamicFields = Object.keys(fieldMap).sort((a, b) => { const idxA = fieldOrder.indexOf(a); const idxB = fieldOrder.indexOf(b); @@ -231,7 +230,15 @@ function toggleSelectAllSumData() { // 从历史记录采集 async function collectSumDataFromHistory() { - if (!confirm('确定要从所有成功的历史记录中重新采集求和数据吗?\n(会先清除旧的自动采集数据)')) return; + const startDate = document.getElementById('sum-data-start-date').value; + const endDate = document.getElementById('sum-data-end-date').value; + + if (!startDate || !endDate) { + alert('请先选择日期范围'); + return; + } + + if (!confirm(`确定要从 ${startDate} 到 ${endDate} 的历史记录中采集求和数据吗?\n(会先清除该日期范围内旧的自动采集数据)`)) return; const resultDiv = document.getElementById('sum-data-list'); resultDiv.innerHTML = '正在采集中,请稍候...'; @@ -240,7 +247,10 @@ async function collectSumDataFromHistory() { const response = await fetch('/api/sum-data/collect', { method: 'POST', headers: { 'Content-Type': 'application/json' }, - body: JSON.stringify({}) + body: JSON.stringify({ + start_date: startDate, + end_date: endDate + }) }); const result = await response.json(); if (result.success) { @@ -411,7 +421,8 @@ async function saveSumData() { body: JSON.stringify({ sum_value: fieldValue, total_orders: totalOrders, - remark: remark + remark: remark, + data_source: 'manual' }) }); const result = await response.json(); @@ -452,28 +463,28 @@ async function saveSumData() { } if (peakDegree) { fieldsData.push({ - sum_field_key: 'peak_degree', + sum_field_key: 'sharp_electricity', sum_field_name: '尖时电量(kWh)', sum_value: peakDegree }); } if (peakTime) { fieldsData.push({ - sum_field_key: 'peak_time_degree', + sum_field_key: 'peak_electricity', sum_field_name: '峰时电量(kWh)', sum_value: peakTime }); } if (normalTime) { fieldsData.push({ - sum_field_key: 'normal_time_degree', + sum_field_key: 'flat_electricity', sum_field_name: '平时电量(kWh)', sum_value: normalTime }); } if (valleyTime) { fieldsData.push({ - sum_field_key: 'valley_time_degree', + sum_field_key: 'valley_electricity', sum_field_name: '谷时电量(kWh)', sum_value: valleyTime });