feat(M08-B): 补免清洁统计展示
This commit is contained in:
@@ -287,6 +287,7 @@ const statistics = reactive<CleaningStatistics>({
|
||||
pendingReview: 0,
|
||||
active: 0,
|
||||
rejected: 0,
|
||||
exempted: 0,
|
||||
completed: 0,
|
||||
rewardCents: 0,
|
||||
pendingSettlementCents: 0,
|
||||
|
||||
@@ -57,6 +57,10 @@
|
||||
<span>待结算</span>
|
||||
<strong>{{ money(statistics.summary.pendingSettlementCents) }}</strong>
|
||||
</div>
|
||||
<div class="metric">
|
||||
<span>{{ '\u514d\u6e05\u6d01' }}</span>
|
||||
<strong>{{ statistics.summary.exempted }}</strong>
|
||||
</div>
|
||||
<div class="metric">
|
||||
<span>已发放</span>
|
||||
<strong>{{ money(statistics.summary.paidSettlementCents) }}</strong>
|
||||
@@ -136,6 +140,7 @@
|
||||
<span>待验 {{ row.pendingReview }}</span>
|
||||
<span>完成 {{ row.completed }}</span>
|
||||
<span>驳回 {{ row.rejected }}</span>
|
||||
<span>{{ '\u514d\u6e05\u6d01' }} {{ row.exempted }}</span>
|
||||
<span>奖励 {{ money(row.rewardCents) }}</span>
|
||||
<span>发放 {{ money(row.paidSettlementCents) }}</span>
|
||||
</div>
|
||||
@@ -155,6 +160,7 @@
|
||||
<el-table-column prop="pendingReview" label="待验" width="90" />
|
||||
<el-table-column prop="completed" label="完成" width="90" />
|
||||
<el-table-column prop="rejected" label="驳回" width="90" />
|
||||
<el-table-column prop="exempted" :label="'\u514d\u6e05\u6d01'" width="90" />
|
||||
<el-table-column prop="rewardCents" label="奖励" width="120">
|
||||
<template #default="{ row }">{{ money(row.rewardCents) }}</template>
|
||||
</el-table-column>
|
||||
@@ -300,46 +306,51 @@ function exportCleanerPerformance() {
|
||||
function exportStatistics() {
|
||||
downloadCsv(`cleaning-statistics-${Date.now()}.csv`, [
|
||||
['section', 'key', 'value', 'extra1', 'extra2', 'extra3', 'extra4'],
|
||||
['filter', 'from', filterDraft.from || '未设置', '', '', '', ''],
|
||||
['filter', 'to', filterDraft.to || '未设置', '', '', '', ''],
|
||||
['filter', 'storeId', filterDraft.storeId || '全部门店', '', '', '', ''],
|
||||
['filter', 'cleanerUserId', filterDraft.cleanerUserId || '全部保洁员', '', '', '', ''],
|
||||
['summary', '任务总数', String(props.statistics.summary.taskTotal), '', '', '', ''],
|
||||
['summary', '待验收', String(props.statistics.summary.pendingReview), '', '', '', ''],
|
||||
['summary', '进行中', String(props.statistics.summary.active), '', '', '', ''],
|
||||
['summary', '驳回', String(props.statistics.summary.rejected), '', '', '', ''],
|
||||
['summary', '已完成', String(props.statistics.summary.completed), '', '', '', ''],
|
||||
['summary', '奖励合计', money(props.statistics.summary.rewardCents), '', '', '', ''],
|
||||
['summary', '待结算', money(props.statistics.summary.pendingSettlementCents), '', '', '', ''],
|
||||
['summary', '待发放', money(props.statistics.summary.confirmedSettlementCents), '', '', '', ''],
|
||||
['summary', '已发放', money(props.statistics.summary.paidSettlementCents), '', '', '', ''],
|
||||
['任务状态', '状态', '数量', '奖励', '', '', ''],
|
||||
...props.statistics.byStatus.map((row) => ['任务状态', row.status, String(row.total), money(row.rewardCents), '', '', '']),
|
||||
['结算口径', '状态', '单数', '金额', '', '', ''],
|
||||
...props.statistics.settlements.map((row) => ['结算口径', row.status, String(row.total), money(row.rewardCents), '', '', '']),
|
||||
['每日趋势', '日期', '任务', '待验', '完成', '驳回', '已发放'],
|
||||
['filter', 'from', filterDraft.from || '\u672a\u8bbe\u7f6e', '', '', '', ''],
|
||||
['filter', 'to', filterDraft.to || '\u672a\u8bbe\u7f6e', '', '', '', ''],
|
||||
['filter', 'storeId', filterDraft.storeId || '\u5168\u90e8\u95e8\u5e97', '', '', '', ''],
|
||||
['filter', 'cleanerUserId', filterDraft.cleanerUserId || '\u5168\u90e8\u4fdd\u6d01\u5458', '', '', '', ''],
|
||||
['summary', '\u4efb\u52a1\u603b\u6570', String(props.statistics.summary.taskTotal), '', '', '', ''],
|
||||
['summary', '\u5f85\u9a8c\u6536', String(props.statistics.summary.pendingReview), '', '', '', ''],
|
||||
['summary', '\u8fdb\u884c\u4e2d', String(props.statistics.summary.active), '', '', '', ''],
|
||||
['summary', '\u9a73\u56de', String(props.statistics.summary.rejected), '', '', '', ''],
|
||||
['summary', '\u514d\u6e05\u6d01', String(props.statistics.summary.exempted), '', '', '', ''],
|
||||
['summary', '\u5df2\u5b8c\u6210', String(props.statistics.summary.completed), '', '', '', ''],
|
||||
['summary', '\u5956\u52b1\u5408\u8ba1', money(props.statistics.summary.rewardCents), '', '', '', ''],
|
||||
['summary', '\u5f85\u7ed3\u7b97', money(props.statistics.summary.pendingSettlementCents), '', '', '', ''],
|
||||
['summary', '\u5f85\u53d1\u653e', money(props.statistics.summary.confirmedSettlementCents), '', '', '', ''],
|
||||
['summary', '\u5df2\u53d1\u653e', money(props.statistics.summary.paidSettlementCents), '', '', '', ''],
|
||||
['\u4efb\u52a1\u72b6\u6001', '\u72b6\u6001', '\u6570\u91cf', '\u5956\u52b1', '', '', ''],
|
||||
...props.statistics.byStatus.map((row) => ['\u4efb\u52a1\u72b6\u6001', row.status, String(row.total), money(row.rewardCents), '', '', '']),
|
||||
['\u7ed3\u7b97\u53e3\u5f84', '\u72b6\u6001', '\u5355\u6570', '\u91d1\u989d', '', '', ''],
|
||||
...props.statistics.settlements.map((row) => ['\u7ed3\u7b97\u53e3\u5f84', row.status, String(row.total), money(row.rewardCents), '', '', '']),
|
||||
['\u6bcf\u65e5\u8d8b\u52bf', '\u65e5\u671f', '\u4efb\u52a1', '\u5f85\u9a8c', '\u5b8c\u6210', '\u9a73\u56de', '\u514d\u6e05\u6d01'],
|
||||
...props.statistics.trend.map((row) => [
|
||||
'每日趋势',
|
||||
'\u6bcf\u65e5\u8d8b\u52bf',
|
||||
row.date,
|
||||
String(row.taskTotal),
|
||||
String(row.pendingReview),
|
||||
String(row.completed),
|
||||
String(row.rejected),
|
||||
money(row.paidSettlementCents)
|
||||
String(row.exempted)
|
||||
]),
|
||||
['门店明细', '门店', '任务', '待验', '完成', '驳回', '奖励'],
|
||||
['\u6bcf\u65e5\u53d1\u653e', '\u65e5\u671f', '\u5df2\u53d1\u653e', '', '', '', ''],
|
||||
...props.statistics.trend.map((row) => ['\u6bcf\u65e5\u53d1\u653e', row.date, money(row.paidSettlementCents), '', '', '', '']),
|
||||
['\u95e8\u5e97\u660e\u7ec6', '\u95e8\u5e97', '\u4efb\u52a1', '\u5f85\u9a8c', '\u5b8c\u6210', '\u9a73\u56de', '\u514d\u6e05\u6d01'],
|
||||
...props.statistics.byStore.map((row) => [
|
||||
'门店明细',
|
||||
'\u95e8\u5e97\u660e\u7ec6',
|
||||
`${row.storeName || ''}(${row.storeId})`,
|
||||
String(row.taskTotal),
|
||||
String(row.pendingReview),
|
||||
String(row.completed),
|
||||
String(row.rejected),
|
||||
money(row.rewardCents)
|
||||
String(row.exempted)
|
||||
]),
|
||||
['成员分账', '保洁员', '任务', '完成', '驳回', '待结算', '已结算'],
|
||||
['\u95e8\u5e97\u5956\u52b1', '\u95e8\u5e97', '\u5956\u52b1', '', '', '', ''],
|
||||
...props.statistics.byStore.map((row) => ['\u95e8\u5e97\u5956\u52b1', `${row.storeName || ''}(${row.storeId})`, money(row.rewardCents), '', '', '', '']),
|
||||
['\u6210\u5458\u5206\u8d26', '\u4fdd\u6d01\u5458', '\u4efb\u52a1', '\u5b8c\u6210', '\u9a73\u56de', '\u5f85\u7ed3\u7b97', '\u5df2\u7ed3\u7b97'],
|
||||
...props.statistics.members.map((row) => [
|
||||
'成员分账',
|
||||
'\u6210\u5458\u5206\u8d26',
|
||||
`${row.cleanerName || ''}(${row.cleanerUserId})`,
|
||||
String(row.taskCount),
|
||||
String(row.completedTaskCount),
|
||||
@@ -347,9 +358,9 @@ function exportStatistics() {
|
||||
money(row.pendingSettlementCents),
|
||||
money(row.settledRewardCents)
|
||||
]),
|
||||
['绩效排行', '排名', '保洁员', '任务', '完成率', '驳回', '结算合计'],
|
||||
['\u7ee9\u6548\u6392\u884c', '\u6392\u540d', '\u4fdd\u6d01\u5458', '\u4efb\u52a1', '\u5b8c\u6210\u7387', '\u9a73\u56de', '\u7ed3\u7b97\u5408\u8ba1'],
|
||||
...cleanerPerformanceRows.value.map((row) => [
|
||||
'绩效排行',
|
||||
'\u7ee9\u6548\u6392\u884c',
|
||||
String(row.rank),
|
||||
`${row.cleanerName || ''}(${row.cleanerUserId})`,
|
||||
String(row.taskCount),
|
||||
@@ -359,7 +370,6 @@ function exportStatistics() {
|
||||
])
|
||||
]);
|
||||
}
|
||||
|
||||
function downloadCsv(filename: string, rows: string[][]) {
|
||||
const content = rows.map((row) => row.map(csvCell).join(',')).join('\r\n');
|
||||
const blob = new Blob([`\uFEFF${content}`], { type: 'text/csv;charset=utf-8;' });
|
||||
|
||||
@@ -139,6 +139,7 @@ export interface CleaningStatistics {
|
||||
pendingReview: number;
|
||||
active: number;
|
||||
rejected: number;
|
||||
exempted: number;
|
||||
completed: number;
|
||||
rewardCents: number;
|
||||
pendingSettlementCents: number;
|
||||
@@ -157,6 +158,7 @@ export interface CleaningStatistics {
|
||||
pendingReview: number;
|
||||
completed: number;
|
||||
rejected: number;
|
||||
exempted: number;
|
||||
rewardCents: number;
|
||||
}>;
|
||||
settlements: Array<{
|
||||
@@ -179,6 +181,7 @@ export interface CleaningStatistics {
|
||||
pendingReview: number;
|
||||
completed: number;
|
||||
rejected: number;
|
||||
exempted: number;
|
||||
rewardCents: number;
|
||||
paidSettlementCents: number;
|
||||
}>;
|
||||
|
||||
Reference in New Issue
Block a user