1 changed files with 277 additions and 0 deletions
@ -0,0 +1,277 @@ |
|||||
|
<template> |
||||
|
<div class="firm-statistics-detail"> |
||||
|
<!-- 返回按钮和标题 --> |
||||
|
<div class="detail-header"> |
||||
|
<a-button type="link" @click="handleBack" class="back-btn"> |
||||
|
<ArrowLeftOutlined /> |
||||
|
返回查询 |
||||
|
</a-button> |
||||
|
<div class="detail-title"> |
||||
|
<h2>律所统计详情</h2> |
||||
|
<div class="detail-subtitle">统计时间:{{ queryParams.year }}年第{{ queryParams.quarter }}季度</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
|
||||
|
<!-- 导出按钮 --> |
||||
|
<div class="export-section"> |
||||
|
<a-button type="primary" @click="handleExport" :loading="exportLoading"> |
||||
|
<ExportOutlined /> |
||||
|
导出Excel |
||||
|
</a-button> |
||||
|
</div> |
||||
|
|
||||
|
<!-- Excel样式表格 --> |
||||
|
<div class="excel-table-container"> |
||||
|
<div class="excel-table-header"> |
||||
|
<div class="excel-table-title">律所服务统计报表</div> |
||||
|
<div class="excel-table-subtitle">统计时间:{{ queryParams.year }}年第{{ queryParams.quarter }}季度</div> |
||||
|
</div> |
||||
|
|
||||
|
<div class="excel-table"> |
||||
|
<!-- 表头 --> |
||||
|
<div class="excel-row excel-header"> |
||||
|
<div class="excel-cell" style="width: 15%;">序号</div> |
||||
|
<div class="excel-cell" style="width: 25%;">律所名称</div> |
||||
|
<div class="excel-cell" style="width: 15%;">季度累计服务时长</div> |
||||
|
<div class="excel-cell" style="width: 15%;">季度累计服务成本</div> |
||||
|
<div class="excel-cell" style="width: 15%;">年度累计服务时长</div> |
||||
|
<div class="excel-cell" style="width: 15%;">年度累计服务成本</div> |
||||
|
</div> |
||||
|
|
||||
|
<!-- 数据行 --> |
||||
|
<div v-for="(item, index) in tableData" :key="index" class="excel-row excel-data"> |
||||
|
<div class="excel-cell" style="width: 15%;">{{ index + 1 }}</div> |
||||
|
<div class="excel-cell" style="width: 25%;">{{ item.firmName || '-' }}</div> |
||||
|
<div class="excel-cell" style="width: 15%;">{{ formatNumber(item.quarterlyServiceDuration) }}</div> |
||||
|
<div class="excel-cell" style="width: 15%;">{{ formatCurrency(item.quarterlyServiceCost) }}</div> |
||||
|
<div class="excel-cell" style="width: 15%;">{{ formatNumber(item.annualServiceDuration) }}</div> |
||||
|
<div class="excel-cell" style="width: 15%;">{{ formatCurrency(item.annualServiceCost) }}</div> |
||||
|
</div> |
||||
|
|
||||
|
<!-- 汇总行 --> |
||||
|
<div v-if="summaryData" class="excel-row excel-summary"> |
||||
|
<div class="excel-cell" style="width: 15%;">汇总</div> |
||||
|
<div class="excel-cell" style="width: 25%;">-</div> |
||||
|
<div class="excel-cell" style="width: 15%;">{{ formatNumber(summaryData.totalQuarterlyDuration) }}</div> |
||||
|
<div class="excel-cell" style="width: 15%;">{{ formatCurrency(summaryData.totalQuarterlyCost) }}</div> |
||||
|
<div class="excel-cell" style="width: 15%;">{{ formatNumber(summaryData.totalAnnualDuration) }}</div> |
||||
|
<div class="excel-cell" style="width: 15%;">{{ formatCurrency(summaryData.totalAnnualCost) }}</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</div> |
||||
|
</template> |
||||
|
|
||||
|
<script setup> |
||||
|
import { ref, computed, onMounted } from 'vue'; |
||||
|
import { ExportOutlined, ArrowLeftOutlined } from '@ant-design/icons-vue'; |
||||
|
import { message } from 'ant-design-vue'; |
||||
|
import { serviceApplicationsApi } from '/@/api/business/service-applications/service-applications-api'; |
||||
|
|
||||
|
// 接收父组件传递的参数 |
||||
|
const props = defineProps({ |
||||
|
queryParams: { |
||||
|
type: Object, |
||||
|
required: true |
||||
|
}, |
||||
|
tableData: { |
||||
|
type: Array, |
||||
|
required: true |
||||
|
} |
||||
|
}); |
||||
|
|
||||
|
const emit = defineEmits(['back']); |
||||
|
|
||||
|
const exportLoading = ref(false); |
||||
|
|
||||
|
// 计算汇总数据 |
||||
|
const summaryData = computed(() => { |
||||
|
if (!props.tableData || props.tableData.length === 0) { |
||||
|
return null; |
||||
|
} |
||||
|
|
||||
|
const summary = { |
||||
|
totalQuarterlyDuration: 0, |
||||
|
totalQuarterlyCost: 0, |
||||
|
totalAnnualDuration: 0, |
||||
|
totalAnnualCost: 0 |
||||
|
}; |
||||
|
|
||||
|
props.tableData.forEach(item => { |
||||
|
summary.totalQuarterlyDuration += Number(item.quarterlyServiceDuration) || 0; |
||||
|
summary.totalQuarterlyCost += Number(item.quarterlyServiceCost) || 0; |
||||
|
summary.totalAnnualDuration += Number(item.annualServiceDuration) || 0; |
||||
|
summary.totalAnnualCost += Number(item.annualServiceCost) || 0; |
||||
|
}); |
||||
|
|
||||
|
return summary; |
||||
|
}); |
||||
|
|
||||
|
// 格式化数字 |
||||
|
function formatNumber(value) { |
||||
|
if (value === null || value === undefined) return '-'; |
||||
|
const num = Number(value); |
||||
|
return isNaN(num) ? '-' : num.toFixed(2); |
||||
|
} |
||||
|
|
||||
|
// 格式化货币 |
||||
|
function formatCurrency(value) { |
||||
|
if (value === null || value === undefined) return '-'; |
||||
|
const num = Number(value); |
||||
|
return isNaN(num) ? '-' : `¥${num.toFixed(2)}`; |
||||
|
} |
||||
|
|
||||
|
// 返回查询页面 |
||||
|
function handleBack() { |
||||
|
emit('back'); |
||||
|
} |
||||
|
|
||||
|
// 导出Excel |
||||
|
async function handleExport() { |
||||
|
if (!props.tableData || props.tableData.length === 0) { |
||||
|
message.warning('暂无数据可导出'); |
||||
|
return; |
||||
|
} |
||||
|
|
||||
|
exportLoading.value = true; |
||||
|
try { |
||||
|
console.log('开始导出律所统计详情...'); |
||||
|
const exportParams = { |
||||
|
quarter: props.queryParams.quarter, |
||||
|
year: props.queryParams.year, |
||||
|
firmName: props.queryParams.firmName, |
||||
|
pageNum: 1, |
||||
|
pageSize: 500 |
||||
|
}; |
||||
|
|
||||
|
await serviceApplicationsApi.exportLawyerByDepartment(exportParams); |
||||
|
message.success('导出成功'); |
||||
|
console.log('律所统计详情导出成功'); |
||||
|
} catch (error) { |
||||
|
message.error('导出失败'); |
||||
|
console.error('律所统计详情导出失败:', error); |
||||
|
} finally { |
||||
|
exportLoading.value = false; |
||||
|
} |
||||
|
} |
||||
|
|
||||
|
onMounted(() => { |
||||
|
console.log('律所统计详情组件已加载,数据量:', props.tableData.length); |
||||
|
}); |
||||
|
</script> |
||||
|
<style scoped> |
||||
|
.firm-statistics-detail { |
||||
|
padding: 0; |
||||
|
} |
||||
|
|
||||
|
.detail-header { |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
margin-bottom: 20px; |
||||
|
padding: 16px; |
||||
|
background: #f5f5f5; |
||||
|
border-radius: 4px; |
||||
|
} |
||||
|
|
||||
|
.back-btn { |
||||
|
margin-right: 20px; |
||||
|
color: #1890ff; |
||||
|
} |
||||
|
|
||||
|
.detail-title h2 { |
||||
|
margin: 0; |
||||
|
font-size: 20px; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.detail-subtitle { |
||||
|
margin-top: 4px; |
||||
|
font-size: 14px; |
||||
|
color: #666; |
||||
|
} |
||||
|
|
||||
|
.export-section { |
||||
|
margin-bottom: 20px; |
||||
|
text-align: right; |
||||
|
padding: 0 16px; |
||||
|
} |
||||
|
|
||||
|
.excel-table-container { |
||||
|
border: 2px solid #d9d9d9; |
||||
|
border-radius: 4px; |
||||
|
overflow: hidden; |
||||
|
} |
||||
|
|
||||
|
.excel-table-header { |
||||
|
background: #f5f5f5; |
||||
|
padding: 16px; |
||||
|
border-bottom: 1px solid #d9d9d9; |
||||
|
text-align: center; |
||||
|
} |
||||
|
|
||||
|
.excel-table-title { |
||||
|
font-size: 18px; |
||||
|
font-weight: 600; |
||||
|
color: #333; |
||||
|
margin-bottom: 4px; |
||||
|
} |
||||
|
|
||||
|
.excel-table-subtitle { |
||||
|
font-size: 14px; |
||||
|
color: #666; |
||||
|
} |
||||
|
|
||||
|
.excel-table { |
||||
|
width: 100%; |
||||
|
} |
||||
|
|
||||
|
.excel-row { |
||||
|
display: flex; |
||||
|
border-bottom: 1px solid #d9d9d9; |
||||
|
} |
||||
|
|
||||
|
.excel-row:last-child { |
||||
|
border-bottom: none; |
||||
|
} |
||||
|
|
||||
|
.excel-header { |
||||
|
background: #e6f7ff; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
|
||||
|
.excel-summary { |
||||
|
background: #f0f0f0; |
||||
|
font-weight: 600; |
||||
|
} |
||||
|
|
||||
|
.excel-cell { |
||||
|
padding: 12px; |
||||
|
border-right: 1px solid #d9d9d9; |
||||
|
display: flex; |
||||
|
align-items: center; |
||||
|
justify-content: center; |
||||
|
min-height: 50px; |
||||
|
box-sizing: border-box; |
||||
|
font-size: 14px; |
||||
|
} |
||||
|
|
||||
|
.excel-cell:last-child { |
||||
|
border-right: none; |
||||
|
} |
||||
|
|
||||
|
.excel-header .excel-cell { |
||||
|
background: #1890ff; |
||||
|
color: white; |
||||
|
border-right: 1px solid #40a9ff; |
||||
|
} |
||||
|
|
||||
|
.excel-data .excel-cell { |
||||
|
background: white; |
||||
|
color: #333; |
||||
|
} |
||||
|
|
||||
|
.excel-summary .excel-cell { |
||||
|
background: #fafafa; |
||||
|
color: #333; |
||||
|
} |
||||
|
</style> |
||||
Loading…
Reference in new issue