悠修复自定义实收金额和求和采集功能增强
This commit is contained in:
@@ -97,6 +97,18 @@ function showCreateModal() {
|
||||
const customServiceFeeNameInput = document.getElementById('custom-service-fee-name');
|
||||
if (customServiceFeeNameInput) customServiceFeeNameInput.value = '';
|
||||
|
||||
// 重置显示自定义服务费字段开关
|
||||
const showCustomServiceFeeInput = document.getElementById('show-custom-service-fee');
|
||||
if (showCustomServiceFeeInput) showCustomServiceFeeInput.checked = false;
|
||||
|
||||
// 重置显示实收总金额字段开关
|
||||
const showTotalAmountInput = document.getElementById('show-total-amount');
|
||||
if (showTotalAmountInput) showTotalAmountInput.checked = false;
|
||||
|
||||
// 重置实收总金额表头名称
|
||||
const totalAmountNameInput = document.getElementById('total-amount-name');
|
||||
if (totalAmountNameInput) totalAmountNameInput.value = '';
|
||||
|
||||
document.getElementById('config-modal').classList.add('active');
|
||||
}
|
||||
|
||||
@@ -126,7 +138,9 @@ const SUMMABLE_FIELD_KEYS = [
|
||||
'invoice_fee', 'activity_electric_fee', 'activity_service_fee', 'activity_total_fee',
|
||||
'total_money',
|
||||
// 分时段电量
|
||||
'sharp_electricity', 'peak_electricity', 'flat_electricity', 'valley_electricity'
|
||||
'sharp_electricity', 'peak_electricity', 'flat_electricity', 'valley_electricity',
|
||||
// 虚拟字段(自定义计算字段)
|
||||
'custom_service_fee', 'custom_total_amount'
|
||||
];
|
||||
|
||||
// 渲染字段列表
|
||||
@@ -299,6 +313,44 @@ function updateFieldIndexes() {
|
||||
});
|
||||
}
|
||||
|
||||
// 虚拟字段开关切换事件
|
||||
function onVirtualFieldToggle(cb) {
|
||||
const fieldKey = cb.id === 'show-custom-service-fee' ? 'custom_service_fee' : 'custom_total_amount';
|
||||
const isChecked = cb.checked;
|
||||
|
||||
// 获取当前字段顺序
|
||||
const currentOrder = getSelectedFieldsOrder();
|
||||
|
||||
let newOrder = [];
|
||||
if (isChecked) {
|
||||
// 勾选:添加字段到列表末尾
|
||||
if (!currentOrder.includes(fieldKey)) {
|
||||
newOrder = [...currentOrder, fieldKey];
|
||||
} else {
|
||||
newOrder = currentOrder;
|
||||
}
|
||||
} else {
|
||||
// 取消勾选:从列表中移除字段
|
||||
newOrder = currentOrder.filter(f => f !== fieldKey);
|
||||
}
|
||||
|
||||
// 获取当前求和字段选择状态
|
||||
const sumFieldsList = document.getElementById('sum-fields-list');
|
||||
const currentSumFields = sumFieldsList ? Array.from(sumFieldsList.querySelectorAll('input:checked')).map(c => c.value) : [];
|
||||
|
||||
// 更新字段顺序列表和求和字段列表
|
||||
refreshSelectedFieldsOrder(newOrder);
|
||||
refreshSumFieldsList(newOrder, currentSumFields);
|
||||
|
||||
// 如果勾选了字段,更新字段列表中的checkbox状态(保持一致)
|
||||
const fieldList = document.getElementById('field-list');
|
||||
const fieldCb = fieldList?.querySelector(`input[value="${fieldKey}"]`);
|
||||
if (fieldCb) {
|
||||
fieldCb.checked = isChecked;
|
||||
fieldCb.closest('.checkbox-item')?.classList.toggle('checked', isChecked);
|
||||
}
|
||||
}
|
||||
|
||||
// 获取当前字段顺序
|
||||
function getSelectedFieldsOrder() {
|
||||
const orderList = document.getElementById('selected-fields-order');
|
||||
@@ -548,7 +600,17 @@ async function saveConfig() {
|
||||
// 获取自定义服务费表头名称
|
||||
const customServiceFeeNameInput = document.getElementById('custom-service-fee-name');
|
||||
const customServiceFeeName = customServiceFeeNameInput?.value.trim() || null;
|
||||
|
||||
|
||||
// 获取显示自定义服务费字段开关
|
||||
const showCustomServiceFee = document.getElementById('show-custom-service-fee')?.checked || false;
|
||||
|
||||
// 获取显示实收总金额字段开关
|
||||
const showTotalAmount = document.getElementById('show-total-amount')?.checked || false;
|
||||
|
||||
// 获取实收总金额表头名称
|
||||
const totalAmountNameInput = document.getElementById('total-amount-name');
|
||||
const totalAmountName = totalAmountNameInput?.value.trim() || null;
|
||||
|
||||
if (!configName || !splitType || !splitValue) {
|
||||
alert('请填写所有必填字段');
|
||||
return;
|
||||
@@ -590,7 +652,10 @@ async function saveConfig() {
|
||||
field_custom_names: fieldCustomNamesData,
|
||||
show_monthly_total: showMonthlyTotal,
|
||||
custom_service_fee_price: customServiceFeePrice,
|
||||
custom_service_fee_name: customServiceFeeName
|
||||
custom_service_fee_name: customServiceFeeName,
|
||||
show_custom_service_fee: showCustomServiceFee,
|
||||
show_total_amount: showTotalAmount,
|
||||
total_amount_name: totalAmountName
|
||||
};
|
||||
|
||||
try {
|
||||
@@ -683,6 +748,24 @@ async function editConfig(configId) {
|
||||
customServiceFeeNameInput.value = config.custom_service_fee_name || '';
|
||||
}
|
||||
|
||||
// 加载显示自定义服务费字段开关
|
||||
const showCustomServiceFeeInput = document.getElementById('show-custom-service-fee');
|
||||
if (showCustomServiceFeeInput) {
|
||||
showCustomServiceFeeInput.checked = config.show_custom_service_fee === 1;
|
||||
}
|
||||
|
||||
// 加载显示实收总金额字段开关
|
||||
const showTotalAmountInput = document.getElementById('show-total-amount');
|
||||
if (showTotalAmountInput) {
|
||||
showTotalAmountInput.checked = config.show_total_amount === 1;
|
||||
}
|
||||
|
||||
// 加载实收总金额表头名称
|
||||
const totalAmountNameInput = document.getElementById('total-amount-name');
|
||||
if (totalAmountNameInput) {
|
||||
totalAmountNameInput.value = config.total_amount_name || '';
|
||||
}
|
||||
|
||||
document.getElementById('config-modal').classList.add('active');
|
||||
}
|
||||
}
|
||||
|
||||
@@ -24,12 +24,20 @@ function renderSumDataList(rawList) {
|
||||
return;
|
||||
}
|
||||
|
||||
// 收集所有动态求和字段(除了充电电量 charge_degree)
|
||||
// 获取全局配置的允许显示字段(charge_degree 始终显示)
|
||||
// 如果没有配置,则显示所有字段(向后兼容)
|
||||
const hasConfig = sumDataConfigFields && sumDataConfigFields.length > 0;
|
||||
const allowedFields = hasConfig ? new Set(sumDataConfigFields) : null;
|
||||
|
||||
// 收集所有动态求和字段(除了充电电量 charge_degree,且只收集允许显示的字段)
|
||||
const fieldMap = {};
|
||||
rawList.forEach(item => {
|
||||
const key = item.sum_field_key;
|
||||
if (key && key !== 'charge_degree' && !fieldMap[key]) {
|
||||
fieldMap[key] = item.sum_field_name || key;
|
||||
// 如果配置了允许字段,则只收集允许的字段;否则收集所有字段
|
||||
if (!hasConfig || allowedFields.has(key)) {
|
||||
fieldMap[key] = item.sum_field_name || key;
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
@@ -186,6 +194,17 @@ async function loadSumData(page = 1) {
|
||||
if (listTbody) {
|
||||
listTbody.innerHTML = '<tr><td colspan="12" class="loading">加载中...</td></tr>';
|
||||
}
|
||||
|
||||
// 先加载全局配置
|
||||
try {
|
||||
const configResponse = await fetch('/api/global-config/sum-data-fields?_t=' + Date.now());
|
||||
const configResult = await configResponse.json();
|
||||
if (configResult.success) {
|
||||
sumDataConfigFields = configResult.data || [];
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('加载全局配置失败:', error);
|
||||
}
|
||||
|
||||
const params = new URLSearchParams();
|
||||
params.append('page_size', '1000');
|
||||
@@ -649,3 +668,109 @@ async function exportSumData() {
|
||||
alert('导出失败: ' + error.message);
|
||||
}
|
||||
}
|
||||
|
||||
// 求和数据可配置的采集字段列表
|
||||
const SUM_DATA_AVAILABLE_FIELDS = [
|
||||
{ key: 'sharp_electricity', name: '尖时电量(kWh)' },
|
||||
{ key: 'peak_electricity', name: '峰时电量(kWh)' },
|
||||
{ key: 'flat_electricity', name: '平时电量(kWh)' },
|
||||
{ key: 'valley_electricity', name: '谷时电量(kWh)' },
|
||||
{ key: 'charge_elecfee_amount', name: '实收电费(元)' },
|
||||
{ key: 'charge_servicefee_amount', name: '实收服务费(元)' },
|
||||
{ key: 'charge_amount', name: '实收总金额(元)' },
|
||||
{ key: 'charge_frequency', name: '充电次数' },
|
||||
{ key: 'custom_service_fee', name: '自定义服务费(元)' },
|
||||
{ key: 'custom_total_amount', name: '自定义实收总金额(元)' }
|
||||
];
|
||||
|
||||
let sumDataConfigFields = [];
|
||||
|
||||
// 初始化全局配置
|
||||
async function initSumDataConfig() {
|
||||
try {
|
||||
const response = await fetch('/api/global-config/sum-data-fields?_t=' + Date.now());
|
||||
const result = await response.json();
|
||||
if (result.success) {
|
||||
sumDataConfigFields = result.data || [];
|
||||
}
|
||||
} catch (error) {
|
||||
console.log('初始化全局配置失败:', error);
|
||||
}
|
||||
}
|
||||
|
||||
// 页面加载时初始化
|
||||
document.addEventListener('DOMContentLoaded', initSumDataConfig);
|
||||
|
||||
// 显示求和数据全局配置模态框
|
||||
async function showSumDataConfigModal() {
|
||||
const modal = document.getElementById('sum-data-config-modal');
|
||||
const fieldsList = document.getElementById('sum-data-config-fields-list');
|
||||
fieldsList.innerHTML = '<div class="loading">加载中...</div>';
|
||||
|
||||
try {
|
||||
const response = await fetch('/api/global-config/sum-data-fields?_t=' + Date.now());
|
||||
const result = await response.json();
|
||||
if (result.success) {
|
||||
sumDataConfigFields = result.data || [];
|
||||
renderSumDataConfigFields(sumDataConfigFields);
|
||||
} else {
|
||||
fieldsList.innerHTML = '<div class="empty">加载失败</div>';
|
||||
}
|
||||
} catch (error) {
|
||||
fieldsList.innerHTML = '<div class="empty">加载失败: ' + error.message + '</div>';
|
||||
}
|
||||
|
||||
modal.classList.add('active');
|
||||
}
|
||||
|
||||
// 关闭求和数据全局配置模态框
|
||||
function closeSumDataConfigModal() {
|
||||
document.getElementById('sum-data-config-modal').classList.remove('active');
|
||||
}
|
||||
|
||||
// 渲染求和数据配置字段列表
|
||||
function renderSumDataConfigFields(selectedFields) {
|
||||
const fieldsList = document.getElementById('sum-data-config-fields-list');
|
||||
fieldsList.innerHTML = SUM_DATA_AVAILABLE_FIELDS.map(field => `
|
||||
<div class="checkbox-item ${selectedFields.includes(field.key) ? 'checked' : ''}" onclick="toggleSumDataConfigField(this)">
|
||||
<input type="checkbox" value="${field.key}"
|
||||
${selectedFields.includes(field.key) ? 'checked' : ''}>
|
||||
<label>${field.name} <span class="field-key-name">(${field.key})</span></label>
|
||||
</div>
|
||||
`).join('');
|
||||
}
|
||||
|
||||
// 切换求和数据配置字段选中状态
|
||||
function toggleSumDataConfigField(item) {
|
||||
const checkbox = item.querySelector('input[type="checkbox"]');
|
||||
checkbox.checked = !checkbox.checked;
|
||||
item.classList.toggle('checked', checkbox.checked);
|
||||
}
|
||||
|
||||
// 保存求和数据全局配置
|
||||
async function saveSumDataConfig() {
|
||||
const checkboxes = document.querySelectorAll('#sum-data-config-fields-list input[type="checkbox"]');
|
||||
const selectedFields = Array.from(checkboxes)
|
||||
.filter(cb => cb.checked)
|
||||
.map(cb => cb.value);
|
||||
|
||||
try {
|
||||
const response = await fetch('/api/global-config/sum-data-fields', {
|
||||
method: 'POST',
|
||||
headers: { 'Content-Type': 'application/json' },
|
||||
body: JSON.stringify({ sum_data_fields: selectedFields })
|
||||
});
|
||||
const result = await response.json();
|
||||
|
||||
if (result.success) {
|
||||
alert('配置保存成功');
|
||||
sumDataConfigFields = selectedFields;
|
||||
closeSumDataConfigModal();
|
||||
loadSumData(sumDataCurrentPage);
|
||||
} else {
|
||||
alert('保存失败: ' + (result.message || '未知错误'));
|
||||
}
|
||||
} catch (error) {
|
||||
alert('保存失败: ' + error.message);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user