someone-oa/pc/report-receivable-summary.html
2025-12-11 19:04:46 +08:00

257 lines
9.4 KiB
HTML
Raw Permalink Blame History

This file contains invisible Unicode characters

This file contains invisible Unicode characters that are indistinguishable to humans but may be processed differently by a computer. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE html>
<html lang="zh-CN">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>应收账款汇总表 - OA系统</title>
<link rel="stylesheet" href="https://unpkg.com/element-ui/lib/theme-chalk/index.css">
<!-- 统一布局样式 -->
<link rel="stylesheet" href="unified-layout.css">
<style>
* { margin: 0; padding: 0; box-sizing: border-box; }
body {
font-family: "Helvetica Neue", Helvetica, "PingFang SC", "Hiragino Sans GB", "Microsoft YaHei", Arial, sans-serif;
background: #f0f2f5;
overflow: hidden;
}
.layout-container {
height: 100vh;
display: flex;
flex-direction: column;
}
 background: #409EFF; }
.main-container {
flex: 1;
display: flex;
overflow: hidden;
}
.app-main {
flex: 1;
overflow: hidden;
display: flex;
flex-direction: column;
background: #f0f2f5;
}
.sidebar {
width: 210px;
background: #fff;
border-right: 1px solid #e6e6e6;
overflow-y: auto;
}
.el-menu {
border-right: none;
}
.menu-item { padding: 12px 24px; cursor: pointer; }
.menu-item.active {
background: #409EFF;
color: #fff;
}
.content {
flex: 1;
padding: 20px;
overflow-y: auto;
background: #fff;
margin: 10px;
border-radius: 4px;
}
.page-header { margin-bottom: 24px; padding-bottom: 16px; border-bottom: 1px solid #f0f0f0; }
.page-title { font-size: 20px; font-weight: 500; }
.search-form { background: #fafafa; padding: 16px; border-radius: 4px; margin-bottom: 16px; }
.form-row { display: flex; gap: 16px; margin-bottom: 12px; }
.form-item { flex: 1; }
.form-input { width: 100%; padding: 6px 12px; border: 1px solid #d9d9d9; border-radius: 4px; }
.btn { padding: 6px 16px; border: none; border-radius: 4px; cursor: pointer; }
.btn-primary { background: #409EFF; color: white; }
.btn-default { background: white; color: #333; border: 1px solid #d9d9d9; }
table { width: 100%; border-collapse: collapse; }
th, td { padding: 12px; text-align: left; border-bottom: 1px solid #f0f0f0; }
th { background: #fafafa; font-weight: 500; }
.summary-row { background: #f0f5ff; font-weight: 500; }
.chart-container {
background: white;
border-radius: 4px;
padding: 20px;
margin-bottom: 20px;
box-shadow: 0 1px 3px rgba(0,0,0,0.04);
}
.chart-title {
font-size: 16px;
font-weight: 500;
margin-bottom: 16px;
padding-bottom: 12px;
border-bottom: 1px solid #f0f0f0;
}
.chart-wrapper {
height: 300px;
width: 100%;
}
</style>
<!-- ECharts -->
<script src="https://cdn.jsdelivr.net/npm/echarts@5.4.0/dist/echarts.min.js"></script>
<!-- Vue.js -->
<script src="https://unpkg.com/vue@2/dist/vue.js"></script>
<!-- Element UI JS -->
<script src="https://unpkg.com/element-ui/lib/index.js"></script>
</head>
<body>
<div id="app">
<div class="layout-container">
<div class="main-container">
<div class="sidebar">
<div class="menu-item" onclick="window.location.href='report-project-detail.html'">项目明细表</div>
<div class="menu-item" onclick="window.location.href='report-project-summary.html'">项目汇总表</div>
<div class="menu-item" onclick="window.location.href='report-output-detail.html'">产值明细表</div>
<div class="menu-item" onclick="window.location.href='report-output-summary.html'">产值汇总表</div>
<div class="menu-item" onclick="window.location.href='report-receivable-detail.html'">应收账款明细表</div>
<div class="menu-item active">应收账款汇总表</div>
<div class="menu-item" onclick="window.location.href='report-payable-detail.html'">应付账款明细表</div>
<div class="menu-item" onclick="window.location.href='report-payable-summary.html'">应付账款汇总表</div>
</div>
<div class="content">
<div class="page-header">
<div class="page-title">应收账款汇总表</div>
</div>
<div class="search-form">
<div class="form-row">
<div class="form-item" style="display: flex; gap: 8px;">
<button class="btn btn-primary" onclick="queryData()">查询</button>
<button class="btn btn-default" onclick="exportExcel()">导出Excel</button>
</div>
</div>
</div>
<!-- 图表展示 -->
<div class="chart-container">
<div class="chart-title">应收账款统计图表</div>
<div id="receivableChart" class="chart-wrapper"></div>
</div>
<table>
<thead>
<tr>
<th>客户名称</th>
<th>项目数量</th>
<th>合同总额</th>
<th>开票总额</th>
<th>已回款总额</th>
<th>应收余额</th>
</tr>
</thead>
<tbody>
<tr>
<td>XX公司</td>
<td>2</td>
<td>¥1,300,000</td>
<td>¥800,000</td>
<td>¥500,000</td>
<td>¥800,000</td>
</tr>
<tr>
<td>YY公司</td>
<td>1</td>
<td>¥800,000</td>
<td>¥500,000</td>
<td>¥300,000</td>
<td>¥500,000</td>
</tr>
<tr class="summary-row">
<td>合计</td>
<td>3</td>
<td>¥2,100,000</td>
<td>¥1,300,000</td>
<td>¥800,000</td>
<td>¥1,300,000</td>
</tr>
</tbody>
</table>
</div>
</div>
</div>
</div>
<script src="common.js"></script>
<script>
let receivableChart = null;
// 初始化图表
function initChart() {
const chartDom = document.getElementById('receivableChart');
receivableChart = echarts.init(chartDom);
renderChart();
window.addEventListener('resize', () => receivableChart.resize());
}
// 渲染图表
function renderChart() {
// 模拟数据(实际应从后端获取)
const data = [
{ name: 'XX公司', receivable: 800000, received: 500000 },
{ name: 'YY公司', receivable: 500000, received: 300000 },
{ name: 'ZZ公司', receivable: 600000, received: 400000 }
];
const option = {
tooltip: {
trigger: 'axis',
axisPointer: { type: 'shadow' }
},
legend: {
data: ['应收余额', '已回款']
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
containLabel: true
},
xAxis: {
type: 'category',
data: data.map(item => item.name)
},
yAxis: {
type: 'value',
name: '金额(元)'
},
series: [
{
name: '应收余额',
type: 'bar',
data: data.map(item => item.receivable),
itemStyle: { color: '#ff4d4f' }
},
{
name: '已回款',
type: 'bar',
data: data.map(item => item.received),
itemStyle: { color: '#52c41a' }
}
]
};
receivableChart.setOption(option);
}
// 查询数据
function queryData() {
CommonUtils.showMessage('查询数据');
renderChart();
}
// 导出Excel
function exportExcel() {
CommonUtils.exportExcel('应收账款汇总表.xlsx');
}
// 页面加载时初始化
window.onload = function() {
initChart();
};
</script>
<script src="unified-layout.js"></script>
<script>
initUnifiedLayout('report');
</script>
</body>
</html>