<template>
    <ele-page flex-table>
        <page-search @search="reload" v-if="useStatus == 2" />
        <common-table
            ref="pageRef"
            :pageConfig="pageConfig"
            :columns="columns"
            :tools="false"
            show-summary
            :summary-method="getSummaries"
            :flex-table="false"
        >
            <template #toolbar="{ row }">
                <div>
                    <el-radio-group
                        @change="handleStatusChange"
                        v-model="useStatus"
                    >
                        <el-radio-button label="订单审核实时统计" value="1" />
                        <el-radio-button label="订单审核历史统计" value="2" />
                    </el-radio-group>
                    <el-button
                        style="margin-left: 40px"
                        type="success"
                        plain
                        v-permission="'statistic:entry:export'"
                        v-if="useStatus == 2"
                        @click="handleExportExcel(row)"
                    >
                        导出EXCEL
                    </el-button>
                </div>
            </template>
        </common-table>
    </ele-page>
</template>

<script setup>
    import { ref, reactive } from 'vue';
    import CommonTable from '@/components/CommonPage/CommonTable.vue';
    import pageSearch from './components/page-search.vue';
    import { useDictData } from '@/utils/use-dict-data';

    defineOptions({ name: 'EntryStatistic' });

    const useStatus = ref('1');
    function handleStatusChange(val) {
        useStatus.value = val;
        // 根据选择的状态动态更新接口URL
        if (val === '1') {
            // 实时统计
            pageConfig.pageUrl = '/order/recycleOrderStatistic/audit/todayList';
        } else {
            // 历史统计
            pageConfig.pageUrl =
                '/order/recycleOrderStatistic/audit/historyPage';
        }
        pageRef.value?.reload();
    }

    /** 表格列配置 */
    const columns = ref([
        { type: 'index', label: '#', align: 'center', width: 80 },
        { label: '录入员', prop: 'sysUserName', align: 'center' },
        { label: '录入审核订单', prop: 'orderCount', align: 'center' },
        { label: '录入书籍数量', prop: 'totalNum', align: 'center' },
        { label: '实际回收数量', prop: 'totalRecycleReal', align: 'center' },
        { label: '品相良好', prop: 'totalGoodNum', align: 'center' },
        { label: '品相一般', prop: 'totalGeneralNum', align: 'center' },
        { label: '品相极差', prop: 'totalBadNum', align: 'center' },
        {
            label: '不良率',
            prop: 'badRate',
            align: 'center',
            formatter: (row) => (row.badRate || 0) + '%'
        },
        { label: '预估金额', prop: 'totalExpectMoney', align: 'center' },
        { label: '审核金额', prop: 'totalAuditMoney', align: 'center' },
        { label: '审核日期', prop: 'statisticDate', align: 'center' }
    ]);

    /** 页面组件实例 */
    const pageRef = ref(null);

    const pageConfig = reactive({
        pageUrl: '/order/recycleOrderStatistic/audit/todayList', // 默认使用实时统计接口
        exportUrl: '/order/recycleOrderStatistic/audit/export',
        fileName: '录入统计',
        cacheKey: 'entryStatisticTable'
    });

    /**
     * 自定义表格汇总计算方法
     * @param {Object} param0 - 表格数据和列信息
     * @returns {Array} - 汇总行显示的数据
     */
    function getSummaries({ columns, data }) {
        const sums = [];
        columns.forEach((column, index) => {
            if (index === 0) {
                sums[index] = '合计';
                return;
            }

            const values = data.map((item) => Number(item[column.property]));

            if (!values.length) {
                sums[index] = 'N/A';
                return;
            }

            switch (column.property) {
                case 'badRate': {
                    // 不良率 = 品相极差总数 / 录入书籍总数
                    const totalBadValues = data.map((item) =>
                        Number(item.totalBadNum || 0)
                    );
                    const totalNumValues = data.map((item) =>
                        Number(item.totalNum || 0)
                    );

                    const totalBadSum = totalBadValues.reduce((prev, curr) => {
                        const value = Number(curr);
                        if (!isNaN(value)) {
                            return prev + value;
                        } else {
                            return prev;
                        }
                    }, 0);

                    const totalNumSum = totalNumValues.reduce((prev, curr) => {
                        const value = Number(curr);
                        if (!isNaN(value)) {
                            return prev + value;
                        } else {
                            return prev;
                        }
                    }, 0);

                    if (totalNumSum > 0) {
                        sums[index] =
                            ((totalBadSum / totalNumSum) * 100).toFixed(2) +
                            '%';
                    } else {
                        sums[index] = '0.00%';
                    }
                    break;
                }
                case 'orderCount':
                case 'totalNum':
                case 'totalRecycleReal':
                case 'totalGoodNum':
                case 'totalGeneralNum':
                case 'totalBadNum': {
                    // 数量类字段求和
                    const sum = values.reduce((prev, curr) => {
                        const value = Number(curr);
                        if (!isNaN(value)) {
                            return prev + value;
                        } else {
                            return prev;
                        }
                    }, 0);
                    sums[index] = sum;
                    break;
                }
                case 'totalExpectMoney':
                case 'totalAuditMoney': {
                    // 金额类字段求和，保留两位小数
                    const sum = values.reduce((prev, curr) => {
                        const value = Number(curr);
                        if (!isNaN(value)) {
                            return prev + value;
                        } else {
                            return prev;
                        }
                    }, 0);
                    sums[index] = sum.toFixed(2);
                    break;
                }
                default:
                    sums[index] = '';
            }
        });

        return sums;
    }

    //刷新表格
    function reload(where) {
        pageRef.value?.reload(where);
    }

    //导出excel
    function handleExportExcel() {
        pageRef.value?.exportData('录入统计');
    }
</script>
