from flask import Flask, render_template, request, jsonify
import json
app = Flask(__name__)
with open('source_data.txt', 'r', encoding='utf-8') as file:
content = file.read()
SOURCE_DATA = eval(content)
with open('service_rate.txt', 'r', encoding='utf-8') as file:
content = file.read()
SERVICE_RATE = eval(content)
def calculation_data(source_data=SOURCE_DATA, service_rate=SERVICE_RATE):
"""
Cost audit settlement list and service expense calculation logic
:param source_data: 源输入数据,各工程结算方式的费用
:param service_rate: 报价费率
:return:
"""
res = []
for datas in source_data:
result = []
count_val = 0
for index, data in enumerate(datas):
times_result = []
times_count_val = 0
service_expense = 0
sorted_data = sorted(data.items(), key=lambda item: item[1])
for sort_data in sorted_data:
res_dict = {}
key, val = sort_data[0], sort_data[1]
if count_val + val <= 1000:
factor = service_rate.get('x <= 1000').get(key) * 0.001
service_expense += val * factor
res_dict.update({
'key': key,
'level': "第一档",
'expenses': val,
'service_expenses': val * factor
})
times_result.append(res_dict)
elif 1000 < count_val + val <= 5000:
factor = service_rate.get('1000 < x <= 5000').get(key) * 0.001
if count_val < 1000:
less_factor = service_rate.get('x <= 1000').get(key) * 0.001
less_val = (1000 - count_val)
service_expense += less_val * less_factor + (val - less_val) * factor
res_dict.update({
'key': key,
'level': "第一档",
'expenses': less_val,
'service_expenses': less_val * less_factor
})
times_result.append(res_dict)
new_dict = {
'key': key,
'level': "第二档",
'expenses': val - less_val,
'service_expenses': (val - less_val) * factor
}
times_result.append(new_dict)
else:
service_expense += val * factor
res_dict.update({
'key': key,
'level': "第二档",
'expenses': val,
'service_expenses': val * factor
})
times_result.append(res_dict)
elif 5000 < count_val + val <= 10000:
factor = service_rate.get('5000 < x <= 10000').get(key) * 0.001
if count_val < 5000:
less_factor = service_rate.get('1000 < x <= 5000').get(key) * 0.001
less_val = (5000 - count_val)
service_expense += less_val * less_factor + (val - less_val) * factor
res_dict.update({
'key': key,
'level': "第二档",
'expenses': less_val,
'service_expenses': less_val * less_factor
})
times_result.append(res_dict)
new_dict = {
'key': key,
'level': "第三档",
'expenses': val - less_val,
'service_expenses': (val - less_val) * factor
}
times_result.append(new_dict)
else:
service_expense += val * factor
res_dict.update({
'key': key,
'level': "第三档",
'expenses': val,
'service_expenses': val * factor
})
times_result.append(res_dict)
elif 10000 < count_val + val:
factor = service_rate.get('10000 < x').get(key) * 0.001
if count_val < 10000:
less_factor = service_rate.get('5000 < x <= 10000').get(key) * 0.001
less_val = (10000 - count_val)
service_expense += less_val * less_factor + (val - less_val) * factor
res_dict.update({
'key': key,
'level': "第三档",
'expenses': less_val,
'service_expenses': less_val * less_factor
})
times_result.append(res_dict)
new_dict = {
'key': key,
'level': "第四档",
'expenses': val - less_val,
'service_expenses': (val - less_val) * factor
}
times_result.append(new_dict)
else:
service_expense += val * factor
res_dict.update({
'key': key,
'level': "第四档",
'expenses': val,
'service_expenses': val * factor
})
times_result.append(res_dict)
count_val += val
times_count_val += val
times_result.append({
'订单次数': str(index + 1),
'送审总费用': times_count_val,
'基础服务小计': service_expense
})
result.append(times_result)
res.append(result)
return res
@app.route('/')
def hello_world():
return render_template('index.html')
@app.route('/calculate', methods=['POST'])
def calculate():
input_response_body = request.json.get('rawData')
input_response_body = eval(input_response_body)
result = calculation_data(source_data=input_response_body)
return jsonify(result)
if __name__ == '__main__':
app.run()
{
'x <= 1000': {
'建筑工程分包结算审计,固定总价': 1.00,
'建筑工程分包结算审计,综合单价': 2.50,
'安装工程分包结算审计,固定总价': 1.00,
'安装工程分包结算审计,综合单价': 2.50,
},
'1000 < x <= 5000': {
'建筑工程分包结算审计,固定总价': 0.50,
'建筑工程分包结算审计,综合单价': 1.50,
'安装工程分包结算审计,固定总价': 0.50,
'安装工程分包结算审计,综合单价': 1.00,
},
'5000 < x <= 10000': {
'建筑工程分包结算审计,固定总价': 0.50,
'建筑工程分包结算审计,综合单价': 1.00,
'安装工程分包结算审计,固定总价': 0.50,
'安装工程分包结算审计,综合单价': 0.80,
},
'10000 < x': {
'建筑工程分包结算审计,固定总价': 0.40,
'建筑工程分包结算审计,综合单价': 0.50,
'安装工程分包结算审计,固定总价': 0.30,
'安装工程分包结算审计,综合单价': 0.40,
},
}
[
{'建筑工程分包结算审计,综合单价': 931.234, '建筑工程分包结算审计,固定总价': 0, '安装工程分包结算审计,综合单价': 3114.3021, '安装工程分包结算审计,固定总价': 429.34976},
{'建筑工程分包结算审计,综合单价': 201.234, '建筑工程分包结算审计,固定总价': 832, '安装工程分包结算审计,综合单价': 4369.3021, '安装工程分包结算审计,固定总价': 5249.34976},
{'建筑工程分包结算审计,综合单价': 0, '建筑工程分包结算审计,固定总价': 1248.36, '安装工程分包结算审计,综合单价': 321.568, '安装工程分包结算审计,固定总价': 874.12},
{'建筑工程分包结算审计,综合单价': 3581.26, '建筑工程分包结算审计,固定总价': 2548.36, '安装工程分包结算审计,综合单价': 3369.568, '安装工程分包结算审计,固定总价': 9574.12},
]
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>服务费率计算</title>
<style>
body {
font-family: Arial, sans-serif;
margin: 0;
padding: 0;
background-color: #f8f8f8;
}
.container {
max-width: 800px;
margin: 50px auto;
padding: 20px;
background-color: #fff;
border-radius: 5px;
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
}
h1 {
text-align: center;
color: #333;
}
textarea {
width: 100%;
min-height: 200px;
font-size: 16px;
border: 1px solid #ccc;
padding: 10px;
box-sizing: border-box;
margin-bottom: 20px;
resize: vertical;
}
button {
padding: 10px 20px;
background-color: #007bff;
color: #fff;
border: none;
border-radius: 5px;
cursor: pointer;
}
button:hover {
background-color: #0056b3;
}
#result {
margin-top: 20px;
}
.project-item {
margin-bottom: 10px;
padding: 10px;
background-color: #f9f9f9;
border-left: 4px solid #007bff;
cursor: pointer;
}
.order-item {
margin-bottom: 10px;
padding: 12px;
background-color: #f9f9f9;
{#border-left: 4px solid #0056b3;#}
display: none;
}
.result-details {
padding-left: 20px;
display: none;
}
.result-details p {
margin: 5px 0;
line-height: 1.5;
}
</style>
</head>
<body>
<div class="container">
<h1>服务费率计算</h1>
<form id="calculate-form">
<textarea id="raw-data" placeholder="请输入原始数据" rows="10"></textarea>
<button type="button" onclick="calculate()">计算</button>
</form>
<div id="result"></div>
</div>
<script>
function calculate() {
const rawData = document.getElementById('raw-data').value;
const xhr = new XMLHttpRequest();
xhr.open('POST', '/calculate', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.onreadystatechange = function () {
if (xhr.readyState === 4 && xhr.status === 200) {
const resultDiv = document.getElementById('result');
resultDiv.innerHTML = '';
const resultData = JSON.parse(xhr.responseText);
resultData.forEach((project, index) => {
const projectDiv = document.createElement('div');
projectDiv.classList.add('project-item');
projectDiv.innerText = `工程${index + 1}`;
project.forEach(order => {
const orderItem = document.createElement('div');
orderItem.classList.add('order-item');
orderItem.innerText = `订单次数: ${order[order.length - 1]['订单次数']} - 基础服务小计: ${order[order.length - 1]['基础服务小计']}`;
const detailsDiv = document.createElement('div');
detailsDiv.classList.add('result-details');
order.forEach(item => {
if (item.hasOwnProperty('key')) {
const detailItem = document.createElement('p');
detailItem.innerText = `${item['level']}\n${item['key']}\n送审/审减(万元):${item['expenses']}\n服务费用: ${item['service_expenses']}`;
detailsDiv.appendChild(detailItem);
}
});
orderItem.appendChild(detailsDiv);
orderItem.style.display = 'none';
orderItem.addEventListener('dblclick', function() {
const detailsDiv = this.querySelector('.result-details');
detailsDiv.style.display = detailsDiv.style.display === 'none' ? 'block' : 'none';
});
projectDiv.appendChild(orderItem);
});
projectDiv.addEventListener('click', function() {
const orders = this.querySelectorAll('.order-item');
orders.forEach(order => {
order.style.display = 'block';
});
const otherProjects = document.querySelectorAll('.project-item');
otherProjects.forEach(project => {
if (project !== this) {
const otherOrders = project.querySelectorAll('.order-item');
otherOrders.forEach(order => {
order.style.display = 'none';
});
}
});
});
resultDiv.appendChild(projectDiv);
});
}
};
xhr.send(JSON.stringify({ rawData }));
}
</script>
</body>
</html>