feat: 添加合并特来电平台数据功能
Coze-Commit-Type: user Coze-User-ID: 3722323274763196 Coze-Conversation-ID: 9894087
This commit is contained in:
21
app.py
21
app.py
@@ -65,6 +65,8 @@ def create_config():
|
|||||||
selected_fields = data.get('selected_fields', [])
|
selected_fields = data.get('selected_fields', [])
|
||||||
sum_fields = data.get('sum_fields', [])
|
sum_fields = data.get('sum_fields', [])
|
||||||
time_periods = data.get('time_periods', {})
|
time_periods = data.get('time_periods', {})
|
||||||
|
merge_telecom = 1 if data.get('merge_telecom') else 0
|
||||||
|
telecom_vehicle_no = data.get('telecom_vehicle_no', '')
|
||||||
|
|
||||||
if not config_name or not split_type or not split_value:
|
if not config_name or not split_type or not split_value:
|
||||||
return jsonify({'success': False, 'message': '缺少必填字段'}), 400
|
return jsonify({'success': False, 'message': '缺少必填字段'}), 400
|
||||||
@@ -82,8 +84,8 @@ def create_config():
|
|||||||
sql = """
|
sql = """
|
||||||
INSERT INTO t_daily_report_config
|
INSERT INTO t_daily_report_config
|
||||||
(id, config_name, split_type, split_value, split_name, selected_fields,
|
(id, config_name, split_type, split_value, split_name, selected_fields,
|
||||||
sum_fields, time_periods, is_active, sort_order, create_time, update_time)
|
sum_fields, time_periods, merge_telecom, telecom_vehicle_no, is_active, sort_order, create_time, update_time)
|
||||||
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, 1, %s, NOW(), NOW())
|
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, 1, %s, NOW(), NOW())
|
||||||
"""
|
"""
|
||||||
|
|
||||||
params = (
|
params = (
|
||||||
@@ -95,6 +97,8 @@ def create_config():
|
|||||||
json.dumps(selected_fields, ensure_ascii=False),
|
json.dumps(selected_fields, ensure_ascii=False),
|
||||||
json.dumps(sum_fields, ensure_ascii=False),
|
json.dumps(sum_fields, ensure_ascii=False),
|
||||||
json.dumps(time_periods, ensure_ascii=False),
|
json.dumps(time_periods, ensure_ascii=False),
|
||||||
|
merge_telecom,
|
||||||
|
telecom_vehicle_no,
|
||||||
sort_order
|
sort_order
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -121,11 +125,14 @@ def update_config(config_id):
|
|||||||
selected_fields = data.get('selected_fields', [])
|
selected_fields = data.get('selected_fields', [])
|
||||||
sum_fields = data.get('sum_fields', [])
|
sum_fields = data.get('sum_fields', [])
|
||||||
time_periods = data.get('time_periods', {})
|
time_periods = data.get('time_periods', {})
|
||||||
|
merge_telecom = 1 if data.get('merge_telecom') else 0
|
||||||
|
telecom_vehicle_no = data.get('telecom_vehicle_no', '')
|
||||||
|
|
||||||
sql = """
|
sql = """
|
||||||
UPDATE t_daily_report_config
|
UPDATE t_daily_report_config
|
||||||
SET config_name = %s, split_type = %s, split_value = %s, split_name = %s,
|
SET config_name = %s, split_type = %s, split_value = %s, split_name = %s,
|
||||||
selected_fields = %s, sum_fields = %s, time_periods = %s, update_time = NOW()
|
selected_fields = %s, sum_fields = %s, time_periods = %s,
|
||||||
|
merge_telecom = %s, telecom_vehicle_no = %s, update_time = NOW()
|
||||||
WHERE id = %s
|
WHERE id = %s
|
||||||
"""
|
"""
|
||||||
|
|
||||||
@@ -137,6 +144,8 @@ def update_config(config_id):
|
|||||||
json.dumps(selected_fields, ensure_ascii=False),
|
json.dumps(selected_fields, ensure_ascii=False),
|
||||||
json.dumps(sum_fields, ensure_ascii=False),
|
json.dumps(sum_fields, ensure_ascii=False),
|
||||||
json.dumps(time_periods, ensure_ascii=False),
|
json.dumps(time_periods, ensure_ascii=False),
|
||||||
|
merge_telecom,
|
||||||
|
telecom_vehicle_no,
|
||||||
config_id
|
config_id
|
||||||
)
|
)
|
||||||
|
|
||||||
@@ -179,8 +188,8 @@ def copy_config(config_id):
|
|||||||
# 插入新配置
|
# 插入新配置
|
||||||
execute_insert(
|
execute_insert(
|
||||||
'''INSERT INTO t_daily_report_config
|
'''INSERT INTO t_daily_report_config
|
||||||
(id, config_name, split_type, split_value, split_name, selected_fields, sum_fields, time_periods, is_active, sort_order, create_time, update_time)
|
(id, config_name, split_type, split_value, split_name, selected_fields, sum_fields, time_periods, merge_telecom, telecom_vehicle_no, is_active, sort_order, create_time, update_time)
|
||||||
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), NOW())''',
|
VALUES (%s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, %s, NOW(), NOW())''',
|
||||||
(
|
(
|
||||||
new_id,
|
new_id,
|
||||||
new_name,
|
new_name,
|
||||||
@@ -190,6 +199,8 @@ def copy_config(config_id):
|
|||||||
original['selected_fields'],
|
original['selected_fields'],
|
||||||
original.get('sum_fields', ''),
|
original.get('sum_fields', ''),
|
||||||
original.get('time_periods', ''),
|
original.get('time_periods', ''),
|
||||||
|
original.get('merge_telecom', 0),
|
||||||
|
original.get('telecom_vehicle_no', ''),
|
||||||
original['is_active'],
|
original['is_active'],
|
||||||
sort_order
|
sort_order
|
||||||
)
|
)
|
||||||
|
|||||||
@@ -166,6 +166,9 @@ FIELD_MAPPING = {
|
|||||||
'peak_electricity': '峰时电量(kWh)',
|
'peak_electricity': '峰时电量(kWh)',
|
||||||
'flat_electricity': '平时电量(kWh)',
|
'flat_electricity': '平时电量(kWh)',
|
||||||
'valley_electricity': '谷时电量(kWh)',
|
'valley_electricity': '谷时电量(kWh)',
|
||||||
|
|
||||||
|
# 数据来源
|
||||||
|
'data_source': '数据来源',
|
||||||
}
|
}
|
||||||
|
|
||||||
# 获取字段中文名称
|
# 获取字段中文名称
|
||||||
|
|||||||
@@ -23,6 +23,94 @@ ID_TO_NAME_MAPPING = {
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# 特来电表字段映射到报表字段
|
||||||
|
# t_hlht_tld 字段 → 报表字段
|
||||||
|
TELECOM_FIELD_MAPPING = {
|
||||||
|
'order_id': 'order_no', # 订单号
|
||||||
|
'station_id': 'station_id', # 场站ID
|
||||||
|
'station_name': 'station_name', # 场站名称
|
||||||
|
'charge_start_time': 'charge_begin_time', # 开始充电时间
|
||||||
|
'charge_end_time': 'charge_end_time', # 结束充电时间
|
||||||
|
'total_power': 'charge_degree', # 总电量
|
||||||
|
'start_soc': 'charge_begin_soc', # 开始SOC
|
||||||
|
'end_soc': 'charge_end_soc', # 结束SOC
|
||||||
|
'elec_money': 'charge_elecfee_amount', # 电费
|
||||||
|
'service_money': 'charge_service_amount', # 服务费
|
||||||
|
'total_money': 'total_money', # 总金额
|
||||||
|
'sharp_power': 'sharp_electricity', # 尖时段电量
|
||||||
|
'peak_power': 'peak_electricity', # 峰时段电量
|
||||||
|
'flat_power': 'flat_electricity', # 平时段电量
|
||||||
|
'valley_power': 'valley_electricity', # 谷时段电量
|
||||||
|
'vehicle_self_no': 'company_name', # 车量自编号 → 企业名称
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
def query_telecom_orders(vehicle_self_nos, start_time_str, end_time_str):
|
||||||
|
"""
|
||||||
|
查询特来电平台的订单数据
|
||||||
|
|
||||||
|
Args:
|
||||||
|
vehicle_self_nos: 车量自编号列表(对应企业名称)
|
||||||
|
start_time_str: 开始时间字符串
|
||||||
|
end_time_str: 结束时间字符串
|
||||||
|
|
||||||
|
Returns:
|
||||||
|
list: 转换后的订单数据,字段映射为报表字段
|
||||||
|
"""
|
||||||
|
if not vehicle_self_nos:
|
||||||
|
return []
|
||||||
|
|
||||||
|
# 构建查询条件
|
||||||
|
placeholders = ', '.join(['%s'] * len(vehicle_self_nos))
|
||||||
|
sql = f"""
|
||||||
|
SELECT
|
||||||
|
order_id,
|
||||||
|
station_id,
|
||||||
|
station_name,
|
||||||
|
charge_start_time,
|
||||||
|
charge_end_time,
|
||||||
|
total_power,
|
||||||
|
start_soc,
|
||||||
|
end_soc,
|
||||||
|
elec_money,
|
||||||
|
service_money,
|
||||||
|
total_money,
|
||||||
|
sharp_power,
|
||||||
|
peak_power,
|
||||||
|
flat_power,
|
||||||
|
valley_power,
|
||||||
|
vehicle_self_no
|
||||||
|
FROM t_hlht_tld
|
||||||
|
WHERE vehicle_self_no IN ({placeholders})
|
||||||
|
AND second_source != '驿来特'
|
||||||
|
AND charge_end_time >= %s
|
||||||
|
AND charge_end_time < %s
|
||||||
|
ORDER BY charge_end_time DESC
|
||||||
|
"""
|
||||||
|
|
||||||
|
params = tuple(vehicle_self_nos) + (start_time_str, end_time_str)
|
||||||
|
|
||||||
|
try:
|
||||||
|
results = execute_query(sql, params)
|
||||||
|
print(f"[特来电] 查询到 {len(results)} 条订单")
|
||||||
|
except Exception as e:
|
||||||
|
print(f"[特来电] 查询失败: {e}")
|
||||||
|
return []
|
||||||
|
|
||||||
|
# 转换字段名
|
||||||
|
converted_orders = []
|
||||||
|
for row in results:
|
||||||
|
converted = {}
|
||||||
|
for telecom_field, report_field in TELECOM_FIELD_MAPPING.items():
|
||||||
|
if telecom_field in row:
|
||||||
|
converted[report_field] = row[telecom_field]
|
||||||
|
# 添加数据来源标记
|
||||||
|
converted['data_source'] = '特来电'
|
||||||
|
converted_orders.append(converted)
|
||||||
|
|
||||||
|
return converted_orders
|
||||||
|
|
||||||
|
|
||||||
def build_id_to_name_map(orders, selected_fields):
|
def build_id_to_name_map(orders, selected_fields):
|
||||||
"""
|
"""
|
||||||
构建ID到名称的映射字典
|
构建ID到名称的映射字典
|
||||||
@@ -248,7 +336,26 @@ def generate_daily_report(config_id, start_time=None, end_time=None):
|
|||||||
# 执行查询
|
# 执行查询
|
||||||
orders = execute_query(sql, tuple(params))
|
orders = execute_query(sql, tuple(params))
|
||||||
|
|
||||||
print(f"[日报生成] 查询到 {len(orders)} 条订单")
|
print(f"[日报生成] 驿来特查询到 {len(orders)} 条订单")
|
||||||
|
|
||||||
|
# 添加数据来源标记
|
||||||
|
for order in orders:
|
||||||
|
order['data_source'] = '驿来特'
|
||||||
|
|
||||||
|
# 检查是否需要合并特来电数据
|
||||||
|
merge_telecom = config.get('merge_telecom', 0)
|
||||||
|
telecom_vehicle_no = config.get('telecom_vehicle_no', '')
|
||||||
|
|
||||||
|
if merge_telecom and config['split_type'] == 'company_id' and telecom_vehicle_no:
|
||||||
|
# 解析车量自编号(支持逗号分隔的多个)
|
||||||
|
vehicle_nos = [v.strip() for v in telecom_vehicle_no.split(',') if v.strip()]
|
||||||
|
if vehicle_nos:
|
||||||
|
print(f"[日报生成] 开始合并特来电数据,车量自编号: {vehicle_nos}")
|
||||||
|
telecom_orders = query_telecom_orders(vehicle_nos, start_time_str, end_time_str)
|
||||||
|
if telecom_orders:
|
||||||
|
# 将特来电数据添加到订单列表
|
||||||
|
orders.extend(telecom_orders)
|
||||||
|
print(f"[日报生成] 合并后总订单数: {len(orders)}")
|
||||||
|
|
||||||
if not orders:
|
if not orders:
|
||||||
# 即使没有数据,也保存一条失败记录
|
# 即使没有数据,也保存一条失败记录
|
||||||
|
|||||||
@@ -958,6 +958,19 @@
|
|||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
|
<!-- 合并特来电数据选项(仅按企业拆分时显示) -->
|
||||||
|
<div class="form-group" id="merge-telecom-group" style="display:none; margin-top: 16px; padding: 12px; background: var(--muted); border-radius: 8px;">
|
||||||
|
<label style="display: flex; align-items: center; gap: 8px; cursor: pointer; margin-bottom: 8px;">
|
||||||
|
<input type="checkbox" id="merge-telecom" onchange="toggleTelecomVehicleNo()" style="width: 16px; height: 16px;">
|
||||||
|
<span>合并特来电平台数据</span>
|
||||||
|
<small class="form-hint" style="margin: 0;">(需要输入车量自编号进行匹配)</small>
|
||||||
|
</label>
|
||||||
|
<div id="telecom-vehicle-no-group" style="display:none; margin-top: 8px;">
|
||||||
|
<label>特来电车量自编号 <span class="form-hint">(对应企业名称,多个用逗号分隔)</span></label>
|
||||||
|
<input type="text" id="telecom-vehicle-no" class="form-control" placeholder="输入车量自编号,多个用逗号分隔">
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
</div>
|
</div>
|
||||||
|
|
||||||
<!-- 时段设置 -->
|
<!-- 时段设置 -->
|
||||||
@@ -1112,6 +1125,15 @@
|
|||||||
document.getElementById('split-type').value = '';
|
document.getElementById('split-type').value = '';
|
||||||
document.getElementById('split-value').innerHTML = '<option value="">请先选择拆分方式</option>';
|
document.getElementById('split-value').innerHTML = '<option value="">请先选择拆分方式</option>';
|
||||||
|
|
||||||
|
// 重置合并特来电配置
|
||||||
|
const mergeTelecomCheckbox = document.getElementById('merge-telecom');
|
||||||
|
const telecomVehicleNoInput = document.getElementById('telecom-vehicle-no');
|
||||||
|
const mergeTelecomGroup = document.getElementById('merge-telecom-group');
|
||||||
|
if (mergeTelecomCheckbox) mergeTelecomCheckbox.checked = false;
|
||||||
|
if (telecomVehicleNoInput) telecomVehicleNoInput.value = '';
|
||||||
|
if (mergeTelecomGroup) mergeTelecomGroup.style.display = 'none';
|
||||||
|
toggleTelecomVehicleNo();
|
||||||
|
|
||||||
loadFields();
|
loadFields();
|
||||||
initTimePeriodEditor();
|
initTimePeriodEditor();
|
||||||
clearAllTimePeriods();
|
clearAllTimePeriods();
|
||||||
@@ -1289,6 +1311,15 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 切换特来电车量自编号输入框显示
|
||||||
|
function toggleTelecomVehicleNo() {
|
||||||
|
const mergeTelecom = document.getElementById('merge-telecom').checked;
|
||||||
|
const vehicleNoGroup = document.getElementById('telecom-vehicle-no-group');
|
||||||
|
if (vehicleNoGroup) {
|
||||||
|
vehicleNoGroup.style.display = mergeTelecom ? 'block' : 'none';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// 更新已选实体计数
|
// 更新已选实体计数
|
||||||
function updateSelectedCount() {
|
function updateSelectedCount() {
|
||||||
const select = document.getElementById('split-value');
|
const select = document.getElementById('split-value');
|
||||||
@@ -1456,6 +1487,16 @@
|
|||||||
const splitType = document.getElementById('split-type').value;
|
const splitType = document.getElementById('split-type').value;
|
||||||
const select = document.getElementById('split-value');
|
const select = document.getElementById('split-value');
|
||||||
|
|
||||||
|
// 显示/隐藏合并特来电选项(仅按企业拆分时显示)
|
||||||
|
const mergeTelecomGroup = document.getElementById('merge-telecom-group');
|
||||||
|
if (mergeTelecomGroup) {
|
||||||
|
mergeTelecomGroup.style.display = splitType === 'company_id' ? 'block' : 'none';
|
||||||
|
if (splitType !== 'company_id') {
|
||||||
|
document.getElementById('merge-telecom').checked = false;
|
||||||
|
toggleTelecomVehicleNo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
if (!splitType) {
|
if (!splitType) {
|
||||||
select.innerHTML = '<option value="">请先选择拆分方式</option>';
|
select.innerHTML = '<option value="">请先选择拆分方式</option>';
|
||||||
return;
|
return;
|
||||||
@@ -1566,6 +1607,10 @@
|
|||||||
|
|
||||||
// 获取时段配置
|
// 获取时段配置
|
||||||
const timePeriods = getTimePeriodConfig();
|
const timePeriods = getTimePeriodConfig();
|
||||||
|
|
||||||
|
// 获取合并特来电配置
|
||||||
|
const mergeTelecom = document.getElementById('merge-telecom')?.checked || false;
|
||||||
|
const telecomVehicleNo = document.getElementById('telecom-vehicle-no')?.value.trim() || '';
|
||||||
|
|
||||||
if (!configName || !splitType || !splitValue) {
|
if (!configName || !splitType || !splitValue) {
|
||||||
alert('请填写所有必填字段');
|
alert('请填写所有必填字段');
|
||||||
@@ -1576,6 +1621,16 @@
|
|||||||
alert('请至少选择一个字段');
|
alert('请至少选择一个字段');
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// 验证合并特来电配置
|
||||||
|
if (mergeTelecom && splitType !== 'company_id') {
|
||||||
|
alert('合并特来电数据仅支持按企业拆分');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (mergeTelecom && !telecomVehicleNo) {
|
||||||
|
alert('请输入特来电车量自编号');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const data = {
|
const data = {
|
||||||
config_name: configName,
|
config_name: configName,
|
||||||
@@ -1584,7 +1639,9 @@
|
|||||||
split_name: splitName,
|
split_name: splitName,
|
||||||
selected_fields: selectedFields,
|
selected_fields: selectedFields,
|
||||||
sum_fields: sumFields,
|
sum_fields: sumFields,
|
||||||
time_periods: timePeriods
|
time_periods: timePeriods,
|
||||||
|
merge_telecom: mergeTelecom,
|
||||||
|
telecom_vehicle_no: telecomVehicleNo
|
||||||
};
|
};
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -1647,6 +1704,17 @@
|
|||||||
initTimePeriodEditor();
|
initTimePeriodEditor();
|
||||||
setTimePeriodConfig(config.time_periods);
|
setTimePeriodConfig(config.time_periods);
|
||||||
|
|
||||||
|
// 加载合并特来电配置
|
||||||
|
const mergeTelecomCheckbox = document.getElementById('merge-telecom');
|
||||||
|
const telecomVehicleNoInput = document.getElementById('telecom-vehicle-no');
|
||||||
|
if (mergeTelecomCheckbox) {
|
||||||
|
mergeTelecomCheckbox.checked = config.merge_telecom === 1 || config.merge_telecom === true;
|
||||||
|
toggleTelecomVehicleNo();
|
||||||
|
}
|
||||||
|
if (telecomVehicleNoInput) {
|
||||||
|
telecomVehicleNoInput.value = config.telecom_vehicle_no || '';
|
||||||
|
}
|
||||||
|
|
||||||
document.getElementById('config-modal').classList.add('active');
|
document.getElementById('config-modal').classList.add('active');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Reference in New Issue
Block a user