服务费用计算

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 = request.form.get('input_response_data')
    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>

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值