|
|
@@ -1,164 +1,179 @@
|
|
|
<template>
|
|
|
- <ele-page flex-table>
|
|
|
- <page-search @search="reload" v-if="useStatus==2"></page-search>
|
|
|
- <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>
|
|
|
+ <ele-page flex-table>
|
|
|
+ <page-search @search="reload" v-if="useStatus == 2"></page-search>
|
|
|
+ <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';
|
|
|
+ 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' });
|
|
|
+ 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';
|
|
|
+ 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();
|
|
|
}
|
|
|
- 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' },
|
|
|
- { label: '预估金额', prop: 'totalExpectMoney', align: 'center' },
|
|
|
- { label: '审核金额', prop: 'totalAuditMoney', align: 'center' },
|
|
|
- { label: '审核日期', prop: 'statisticDate', align: 'center' }
|
|
|
- ]);
|
|
|
|
|
|
- /** 页面组件实例 */
|
|
|
- const pageRef = ref(null);
|
|
|
+ /** 表格列配置 */
|
|
|
+ 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 pageConfig = reactive({
|
|
|
- pageUrl: '/order/recycleOrderStatistic/audit/todayList', // 默认使用实时统计接口
|
|
|
- exportUrl: '/order/recycleOrderStatistic/audit/export',
|
|
|
- fileName: '录入统计',
|
|
|
- cacheKey: 'entryStatisticTable'
|
|
|
- });
|
|
|
+ /** 页面组件实例 */
|
|
|
+ const pageRef = ref(null);
|
|
|
|
|
|
- /**
|
|
|
- * 自定义表格汇总计算方法
|
|
|
- * @param {Object} param0 - 表格数据和列信息
|
|
|
- * @returns {Array} - 汇总行显示的数据
|
|
|
- */
|
|
|
- function getSummaries({ columns, data }) {
|
|
|
- const sums = [];
|
|
|
- columns.forEach((column, index) => {
|
|
|
- if (index === 0) {
|
|
|
- sums[index] = '合计';
|
|
|
- return;
|
|
|
- }
|
|
|
+ const pageConfig = reactive({
|
|
|
+ pageUrl: '/order/recycleOrderStatistic/audit/todayList', // 默认使用实时统计接口
|
|
|
+ exportUrl: '/order/recycleOrderStatistic/audit/export',
|
|
|
+ fileName: '录入统计',
|
|
|
+ cacheKey: 'entryStatisticTable'
|
|
|
+ });
|
|
|
|
|
|
- const values = data.map((item) => Number(item[column.property]));
|
|
|
+ /**
|
|
|
+ * 自定义表格汇总计算方法
|
|
|
+ * @param {Object} param0 - 表格数据和列信息
|
|
|
+ * @returns {Array} - 汇总行显示的数据
|
|
|
+ */
|
|
|
+ function getSummaries({ columns, data }) {
|
|
|
+ const sums = [];
|
|
|
+ columns.forEach((column, index) => {
|
|
|
+ if (index === 0) {
|
|
|
+ sums[index] = '合计';
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
- if (!values.length) {
|
|
|
- sums[index] = 'N/A';
|
|
|
- return;
|
|
|
- }
|
|
|
+ const values = data.map((item) => Number(item[column.property]));
|
|
|
|
|
|
- switch (column.property) {
|
|
|
- case 'badRate': {
|
|
|
- // 不良率计算平均值
|
|
|
- const validValues = values.filter((value) => value && !isNaN(value));
|
|
|
- if (validValues.length > 0) {
|
|
|
- const sum = validValues.reduce((prev, curr) => prev + curr, 0);
|
|
|
- sums[index] = (sum / validValues.length).toFixed(2) + '%';
|
|
|
- } else {
|
|
|
- sums[index] = '';
|
|
|
- }
|
|
|
- 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;
|
|
|
+ if (!values.length) {
|
|
|
+ sums[index] = 'N/A';
|
|
|
+ return;
|
|
|
}
|
|
|
- }, 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;
|
|
|
+
|
|
|
+ switch (column.property) {
|
|
|
+ case 'badRate': {
|
|
|
+ // 不良率计算平均值
|
|
|
+ const validValues = values.filter(
|
|
|
+ (value) => value && !isNaN(value)
|
|
|
+ );
|
|
|
+ if (validValues.length > 0) {
|
|
|
+ const sum = validValues.reduce(
|
|
|
+ (prev, curr) => prev + curr,
|
|
|
+ 0
|
|
|
+ );
|
|
|
+ sums[index] =
|
|
|
+ (sum / validValues.length).toFixed(2) + '%';
|
|
|
+ } else {
|
|
|
+ sums[index] = '';
|
|
|
+ }
|
|
|
+ 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] = '';
|
|
|
}
|
|
|
- }, 0);
|
|
|
- sums[index] = sum.toFixed(2);
|
|
|
- break;
|
|
|
- }
|
|
|
- default:
|
|
|
- sums[index] = '';
|
|
|
- }
|
|
|
- });
|
|
|
+ });
|
|
|
|
|
|
- return sums;
|
|
|
- }
|
|
|
+ return sums;
|
|
|
+ }
|
|
|
|
|
|
- //刷新表格
|
|
|
- function reload(where) {
|
|
|
- pageRef.value?.reload(where);
|
|
|
- }
|
|
|
+ //刷新表格
|
|
|
+ function reload(where) {
|
|
|
+ pageRef.value?.reload(where);
|
|
|
+ }
|
|
|
|
|
|
- //导出excel
|
|
|
- function handleExportExcel() {
|
|
|
- pageRef.value?.exportData('录入统计');
|
|
|
- }
|
|
|
+ //导出excel
|
|
|
+ function handleExportExcel() {
|
|
|
+ pageRef.value?.exportData('录入统计');
|
|
|
+ }
|
|
|
</script>
|