优化了统计接口及图表库引入,提升了用户体验,提高了操作效率。
This commit is contained in:
parent
24f56c44bd
commit
3673c21f3e
@ -31,4 +31,88 @@ export function apistatisticssubcontractingContract(params: any) {
|
|||||||
// 项目付款统计
|
// 项目付款统计
|
||||||
export function apistatisticsprojectPayment(params: any) {
|
export function apistatisticsprojectPayment(params: any) {
|
||||||
return request.get({ url: '/statistics.statistics/projectPayment', params })
|
return request.get({ url: '/statistics.statistics/projectPayment', params })
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// 项目付款统计
|
||||||
|
export function apistatisticoststatistics(params: any) {
|
||||||
|
return request.get({ url: '/cost_project.cost_statistics/project', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
// 项目付款统计
|
||||||
|
export function apistatisticoststatisticsamout(params: any) {
|
||||||
|
return request.get({ url: '/cost_project.cost_statistics/amount', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatisticoststatisticsinvoice(params: any) {
|
||||||
|
return request.get({ url: '/cost_project.cost_statistics/invoice', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function apistatistisupervision_statistics(params: any) {
|
||||||
|
return request.get({ url: '/supervision_project.supervision_statistics/project', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatistisupervision_statisticsproblem(params: any) {
|
||||||
|
return request.get({ url: '/supervision_project.supervision_statistics/problem', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatistisupervision_statisticsmonth_report(params: any) {
|
||||||
|
return request.get({ url: '/supervision_project.supervision_statistics/month_report', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatistisupervision_statisticsinvoice(params: any) {
|
||||||
|
return request.get({ url: '/supervision_project.supervision_statistics/invoice', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatistisupervision_statisticproject(params: any) {
|
||||||
|
return request.get({ url: '/manage_basic.manage_statistics/project', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatistisupervision_statisticinvoice(params: any) {
|
||||||
|
return request.get({ url: '/manage_basic.manage_statistics/invoice', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatistisupervision_statisticmeteredpayment(params: any) {
|
||||||
|
return request.get({ url: '/manage_basic.manage_statistics/metered_payment', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatisticonsult_statisticsproject(params: any) {
|
||||||
|
return request.get({ url: '/consult_basic.consult_statistics/project', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatisticonsult_statisticsinvoice(params: any) {
|
||||||
|
return request.get({ url: '/consult_basic.consult_statistics/invoice', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatistifinancial_statistics(params: any) {
|
||||||
|
return request.get({ url: '/financial.financial_statistics/contracts', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatistifinancial_statisticsinvoice(params: any) {
|
||||||
|
return request.get({ url: '/financial.financial_statistics/invoice', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatistifinancial_statisticsbid(params: any) {
|
||||||
|
return request.get({ url: '/financial.financial_statistics/bid', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function apistatistifinancial_statisticsfund(params: any) {
|
||||||
|
return request.get({ url: '/financial.financial_statistics/fund', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
export function apistatismarketing_statistics(params: any) {
|
||||||
|
return request.get({ url: '/marketing.marketing_statistics/business', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
export function apistatismarketing_statisticscustom(params: any) {
|
||||||
|
return request.get({ url: '/marketing.marketing_statistics/custom', params })
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
export function apistatismarketing_statisticscontract(params: any) {
|
||||||
|
return request.get({ url: '/marketing.marketing_statistics/contract', params })
|
||||||
|
}
|
||||||
|
@ -14,7 +14,6 @@
|
|||||||
|
|
||||||
|
|
||||||
<script setup>
|
<script setup>
|
||||||
import * as echarts from 'echarts';
|
|
||||||
import { reactive, ref } from "vue"
|
import { reactive, ref } from "vue"
|
||||||
import Custom from "./components/Custom.vue"
|
import Custom from "./components/Custom.vue"
|
||||||
import Project from "./components/Project.vue"
|
import Project from "./components/Project.vue"
|
||||||
|
238
src/views/statistic_cw/components/ProjectBid.vue
Normal file
238
src/views/statistic_cw/components/ProjectBid.vue
Normal file
@ -0,0 +1,238 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>保证金统计</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectBid" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatistifinancial_statisticsbid } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总保证金申请",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_margin_apply
|
||||||
|
},
|
||||||
|
url: "/financial/margin_management/financial_bid_margin"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度保证金申请",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_margin_apply
|
||||||
|
},
|
||||||
|
url: "/financial/margin_management/financial_bid_margin"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总保证金回收",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_margin_recovery
|
||||||
|
},
|
||||||
|
url: "/financial/margin_management/financial_bid_margin_recovery"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度保证金回收",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_margin_recovery
|
||||||
|
},
|
||||||
|
url: "/financial/margin_management/financial_bid_margin_recovery"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总履约金申请",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_performance_money_apply
|
||||||
|
},
|
||||||
|
url: "/financial/margin_management/financial_performance_money_apply"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度履约金申请",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_performance_money_apply
|
||||||
|
},
|
||||||
|
url: "/financial/margin_management/financial_performance_money_apply"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总履约金回收",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_performance_money_recovery
|
||||||
|
},
|
||||||
|
url: "/financial/margin_management/financial_performance_money_recovery"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度履约金回收",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_performance_money_recovery
|
||||||
|
},
|
||||||
|
url: "/financial/margin_management/financial_performance_money_recovery"
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatistifinancial_statisticsbid({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.margin_apply_series.name, res.margin_recovery_series.name, res.performance_money_apply_series.name, res.performance_money_recovery_series.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.margin_apply_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.margin_apply_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.margin_recovery_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.margin_recovery_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.performance_money_apply_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.performance_money_apply_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.performance_money_recovery_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.performance_money_recovery_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectBid", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
206
src/views/statistic_cw/components/ProjectFund.vue
Normal file
206
src/views/statistic_cw/components/ProjectFund.vue
Normal file
@ -0,0 +1,206 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>借款还款</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectFund" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatistifinancial_statisticsfund } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总用款",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_using
|
||||||
|
},
|
||||||
|
url: "/financial/fund_management/financial_using_funds"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度用款",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_using
|
||||||
|
},
|
||||||
|
url: "/financial/fund_management/financial_using_funds"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总借款",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_borrow
|
||||||
|
},
|
||||||
|
url: "/financial/fund_management/financial_borrow_money"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度借款",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_borrow
|
||||||
|
},
|
||||||
|
url: "/financial/fund_management/financial_borrow_money"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总还款",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_repayment
|
||||||
|
},
|
||||||
|
url: "/financial/fund_management/financial_repayment"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度还款",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_repayment
|
||||||
|
},
|
||||||
|
url: "/financial/fund_management/financial_repayment"
|
||||||
|
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatistifinancial_statisticsfund({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.using_series.name, res.borrow_series.name, res.repayment_series.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.using_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.using_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.borrow_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.borrow_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.repayment_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.repayment_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectFund", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
207
src/views/statistic_cw/components/ProjectInvoice.vue
Normal file
207
src/views/statistic_cw/components/ProjectInvoice.vue
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>项目合同</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectContract" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatistifinancial_statisticsinvoice } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总开票金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_invoice_amount
|
||||||
|
},
|
||||||
|
url: "/financial/invoice_and_receipt/financial_settlement"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度开票金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_invoice_amount
|
||||||
|
},
|
||||||
|
url: "/financial/invoice_and_receipt/financial_settlement"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总回款金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_refund_amount
|
||||||
|
},
|
||||||
|
url: "/financial/invoice_and_receipt/financial_refund"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度回款金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_refund_amount
|
||||||
|
},
|
||||||
|
url: "/financial/invoice_and_receipt/financial_refund"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总结算金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_settlement_amount
|
||||||
|
},
|
||||||
|
url: "/financial/invoice_and_receipt/financial_settlement"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度结算金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_settlement_amount
|
||||||
|
},
|
||||||
|
url: "/financial/invoice_and_receipt/financial_settlement"
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatistifinancial_statisticsinvoice({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.invoice_series.name, res.refund_series.name, res.settlement_series.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.invoice_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.invoice_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.refund_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.refund_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.settlement_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.settlement_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectContract", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
176
src/views/statistic_cw/components/ProjectPayment.vue
Normal file
176
src/views/statistic_cw/components/ProjectPayment.vue
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>合同金额</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectPayment" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatistifinancial_statistics } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总数量",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_number
|
||||||
|
},
|
||||||
|
url: "/financial/invoice_and_receipt/contract_ledger"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度数量",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_number
|
||||||
|
},
|
||||||
|
url: "/financial/invoice_and_receipt/contract_ledger"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总签约金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_signed_amount
|
||||||
|
},
|
||||||
|
url: "/financial/invoice_and_receipt/contract_ledger"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度签约金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_signed_amount
|
||||||
|
},
|
||||||
|
url: "/financial/invoice_and_receipt/contract_ledger"
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatistifinancial_statistics({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.number_series.name, res.signed_series.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.number_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.number_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.signed_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.signed_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectPayment", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
21
src/views/statistic_cw/index.vue
Normal file
21
src/views/statistic_cw/index.vue
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
<template>
|
||||||
|
<div style="display: flex;flex-wrap: wrap;justify-content: space-between;">
|
||||||
|
<ProjectPayment></ProjectPayment>
|
||||||
|
<ProjectInvoice></ProjectInvoice>
|
||||||
|
<ProjectBid></ProjectBid>
|
||||||
|
<ProjectFund></ProjectFund>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { reactive, ref } from "vue"
|
||||||
|
import ProjectPayment from "./components/ProjectPayment.vue"
|
||||||
|
import ProjectInvoice from "./components/ProjectInvoice.vue"
|
||||||
|
import ProjectBid from "./components/ProjectBid.vue"
|
||||||
|
import ProjectFund from "./components/ProjectFund.vue"
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
78
src/views/statistic_gc/components/Project.vue
Normal file
78
src/views/statistic_gc/components/Project.vue
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span> 项目立项</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div id="projectApproved" class="chart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatistisupervision_statistics } from '@/api/statistics'
|
||||||
|
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
let res = await apistatistisupervision_statistics()
|
||||||
|
let option2 = {
|
||||||
|
title: {
|
||||||
|
text: '',
|
||||||
|
subtext: '',
|
||||||
|
left: 'center'
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'item'
|
||||||
|
},
|
||||||
|
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'pie',
|
||||||
|
radius: '50%',
|
||||||
|
data: res.data,
|
||||||
|
emphasis: {
|
||||||
|
itemStyle: {
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowOffsetX: 0,
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
initChart("projectApproved", option2)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getData()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
#main,
|
||||||
|
#main2,
|
||||||
|
#main3 {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
208
src/views/statistic_gc/components/ProjectInvoice.vue
Normal file
208
src/views/statistic_gc/components/ProjectInvoice.vue
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>项目月报</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectInvince" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatistisupervision_statisticsmonth_report } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总进度",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_schedule
|
||||||
|
},
|
||||||
|
url: "/supervision/supervision_connect/supervision_project_monthly_report"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度进度",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_schedule
|
||||||
|
},
|
||||||
|
url: "/supervision/supervision_connect/supervision_project_monthly_report"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总完成",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_complete
|
||||||
|
},
|
||||||
|
url: "/supervision/supervision_connect/supervision_project_monthly_report"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度完成",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_complete
|
||||||
|
},
|
||||||
|
url: "/supervision/supervision_connect/supervision_project_monthly_report"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总支付",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_payment
|
||||||
|
},
|
||||||
|
url: "/supervision/supervision_connect/supervision_project_monthly_report"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度支付",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_payment
|
||||||
|
},
|
||||||
|
url: "/supervision/supervision_connect/supervision_project_monthly_report"
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatistisupervision_statisticsmonth_report({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.schedule_series.name, res.complete_series.name, res.payment_series.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.schedule_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.schedule_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.complete_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.complete_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.payment_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.payment_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectInvince", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
207
src/views/statistic_gc/components/ProjectPayment.vue
Normal file
207
src/views/statistic_gc/components/ProjectPayment.vue
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>项目开票</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectPayment" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatistisupervision_statisticsinvoice } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总开票金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_invoice_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度开票金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_invoice_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总回款金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_refund_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度回款金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_refund_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总结算金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_settlement_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度结算金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_settlement_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatistisupervision_statisticsinvoice({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.invoice_series.name, res.refund_series.name, res.year_settlement_amount.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.invoice_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.invoice_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.refund_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.refund_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.settlement_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.settlement_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectPayment", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
78
src/views/statistic_gc/components/problem.vue
Normal file
78
src/views/statistic_gc/components/problem.vue
Normal file
@ -0,0 +1,78 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span> 问题跟踪</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div id="projectProblem" class="chart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatistisupervision_statisticsproblem } from '@/api/statistics'
|
||||||
|
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
let res = await apistatistisupervision_statisticsproblem()
|
||||||
|
let option2 = {
|
||||||
|
title: {
|
||||||
|
text: '',
|
||||||
|
subtext: '',
|
||||||
|
left: 'center'
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'item'
|
||||||
|
},
|
||||||
|
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'pie',
|
||||||
|
radius: '50%',
|
||||||
|
data: res.data,
|
||||||
|
emphasis: {
|
||||||
|
itemStyle: {
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowOffsetX: 0,
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
initChart("projectProblem", option2)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getData()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
#main,
|
||||||
|
#main2,
|
||||||
|
#main3 {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
20
src/views/statistic_gc/index.vue
Normal file
20
src/views/statistic_gc/index.vue
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
<template>
|
||||||
|
<div style="display: flex;flex-wrap: wrap;justify-content: space-between;">
|
||||||
|
<Project></Project>
|
||||||
|
<problem></problem>
|
||||||
|
<ProjectInvoice></ProjectInvoice>
|
||||||
|
<ProjectPayment></ProjectPayment>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { reactive, ref } from "vue"
|
||||||
|
import Project from "./components/Project.vue"
|
||||||
|
import problem from "./components/problem.vue"
|
||||||
|
import ProjectPayment from "./components/ProjectPayment.vue"
|
||||||
|
import ProjectInvoice from "./components/ProjectInvoice.vue"
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
91
src/views/statistic_sc/components/Project.vue
Normal file
91
src/views/statistic_sc/components/Project.vue
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span> 业务性质</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- <div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { ...item.query } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div> -->
|
||||||
|
<div id="projectApproved" class="chart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatismarketing_statistics } from '@/api/statistics'
|
||||||
|
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
let res = await apistatismarketing_statistics()
|
||||||
|
let option2 = {
|
||||||
|
title: {
|
||||||
|
text: '',
|
||||||
|
subtext: '',
|
||||||
|
left: 'center'
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'item'
|
||||||
|
},
|
||||||
|
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'pie',
|
||||||
|
radius: '50%',
|
||||||
|
data: res.data,
|
||||||
|
emphasis: {
|
||||||
|
itemStyle: {
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowOffsetX: 0,
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
initChart("projectApproved", option2)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getData()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
#main,
|
||||||
|
#main2,
|
||||||
|
#main3 {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
205
src/views/statistic_sc/components/ProjectInvoice.vue
Normal file
205
src/views/statistic_sc/components/ProjectInvoice.vue
Normal file
@ -0,0 +1,205 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>合同统计</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectInvoice" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatismarketing_statisticscontract } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总主合同数",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_zht
|
||||||
|
},
|
||||||
|
url: "/marketing/marketing_contract/marketing_contract"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度主合同数",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_zht
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总框架协议数",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_kjxy
|
||||||
|
},
|
||||||
|
url: "/marketing/marketing_contract/marketing_framework_agreement"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度框架协议数",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_kjxy
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总补充协议数",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_bcxy
|
||||||
|
},
|
||||||
|
url: "/marketing/marketing_contract/marketing_supplementary_agreement"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度补充协议数",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_bcxy
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatismarketing_statisticscontract({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.zht_series.name, res.kjxy_series.name, res.bcxy_series.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.zht_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.zht_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.kjxy_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.kjxy_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.bcxy_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.bcxy_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectInvoice", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
144
src/views/statistic_sc/components/ProjectPayment.vue
Normal file
144
src/views/statistic_sc/components/ProjectPayment.vue
Normal file
@ -0,0 +1,144 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>客户统计</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectPayment" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatismarketing_statisticscustom } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总客户数",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_num
|
||||||
|
},
|
||||||
|
url: "/marketing/marketing_custom/marketing_custom"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度客户数",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_num
|
||||||
|
},
|
||||||
|
url: "/marketing/marketing_custom/marketing_custom"
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatismarketing_statisticscustom({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.custom_series.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.custom_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.custom_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectPayment", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
19
src/views/statistic_sc/index.vue
Normal file
19
src/views/statistic_sc/index.vue
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<template>
|
||||||
|
<div style="display: flex;flex-wrap: wrap;justify-content: space-between;">
|
||||||
|
<Project></Project>
|
||||||
|
<ProjectPayment></ProjectPayment>
|
||||||
|
<ProjectInvoice></ProjectInvoice>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { reactive, ref } from "vue"
|
||||||
|
import Project from "./components/Project.vue"
|
||||||
|
import ProjectPayment from "./components/ProjectPayment.vue"
|
||||||
|
import ProjectInvoice from "./components/ProjectInvoice.vue"
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
91
src/views/statistic_xm/components/Project.vue
Normal file
91
src/views/statistic_xm/components/Project.vue
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span> 项目立项</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- <div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { ...item.query } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div> -->
|
||||||
|
<div id="projectApproved" class="chart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatistisupervision_statisticproject } from '@/api/statistics'
|
||||||
|
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
let res = await apistatistisupervision_statisticproject()
|
||||||
|
let option2 = {
|
||||||
|
title: {
|
||||||
|
text: '',
|
||||||
|
subtext: '',
|
||||||
|
left: 'center'
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'item'
|
||||||
|
},
|
||||||
|
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'pie',
|
||||||
|
radius: '50%',
|
||||||
|
data: res.data,
|
||||||
|
emphasis: {
|
||||||
|
itemStyle: {
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowOffsetX: 0,
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
initChart("projectApproved", option2)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getData()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
#main,
|
||||||
|
#main2,
|
||||||
|
#main3 {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
208
src/views/statistic_xm/components/ProjectInvoice.vue
Normal file
208
src/views/statistic_xm/components/ProjectInvoice.vue
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>项目开票</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectInvince" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatistisupervision_statisticinvoice } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总开票金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_invoice_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度开票金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_invoice_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总回款金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_refund_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度回款金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_refund_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总结算金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_settlement_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度结算金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_settlement_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatistisupervision_statisticinvoice({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.invoice_series.name, res.refund_series.name, res.settlement_series.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.invoice_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.invoice_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.refund_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.refund_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.settlement_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.settlement_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectInvince", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
174
src/views/statistic_xm/components/ProjectPayment.vue
Normal file
174
src/views/statistic_xm/components/ProjectPayment.vue
Normal file
@ -0,0 +1,174 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>计量支付</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectPayment" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatistisupervision_statisticmeteredpayment } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总进度",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_done
|
||||||
|
},
|
||||||
|
url: "/management/manage_invest/manage_metered_payment"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度进度",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_done
|
||||||
|
},
|
||||||
|
url: "/management/manage_invest/manage_metered_payment"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总支付",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_payment
|
||||||
|
},
|
||||||
|
url: "/management/manage_invest/manage_metered_payment"
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度支付",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_payment
|
||||||
|
},
|
||||||
|
url: "/management/manage_invest/manage_metered_payment"
|
||||||
|
|
||||||
|
},
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatistisupervision_statisticmeteredpayment({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.complete_series.name, res.payment_series.name,]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.complete_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.complete_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.payment_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.payment_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectPayment", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
18
src/views/statistic_xm/index.vue
Normal file
18
src/views/statistic_xm/index.vue
Normal file
@ -0,0 +1,18 @@
|
|||||||
|
<template>
|
||||||
|
<div style="display: flex;flex-wrap: wrap;justify-content: space-between;">
|
||||||
|
<Project></Project>
|
||||||
|
<ProjectInvoice></ProjectInvoice>
|
||||||
|
<ProjectPayment></ProjectPayment>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { reactive, ref } from "vue"
|
||||||
|
import Project from "./components/Project.vue"
|
||||||
|
import ProjectPayment from "./components/ProjectPayment.vue"
|
||||||
|
import ProjectInvoice from "./components/ProjectInvoice.vue"
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
92
src/views/statistic_zj/components/Project.vue
Normal file
92
src/views/statistic_zj/components/Project.vue
Normal file
@ -0,0 +1,92 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span> 项目立项</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- <div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { ...item.query } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div> -->
|
||||||
|
<div id="projectApproved" class="chart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatisticoststatistics } from '@/api/statistics'
|
||||||
|
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
let res = await apistatisticoststatistics()
|
||||||
|
let option2 = {
|
||||||
|
title: {
|
||||||
|
text: '',
|
||||||
|
subtext: '',
|
||||||
|
left: 'center'
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'item'
|
||||||
|
},
|
||||||
|
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: '我的立项',
|
||||||
|
type: 'pie',
|
||||||
|
radius: '50%',
|
||||||
|
data: res.data,
|
||||||
|
emphasis: {
|
||||||
|
itemStyle: {
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowOffsetX: 0,
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
initChart("projectApproved", option2)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getData()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
#main,
|
||||||
|
#main2,
|
||||||
|
#main3 {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
207
src/views/statistic_zj/components/ProjectInvoice.vue
Normal file
207
src/views/statistic_zj/components/ProjectInvoice.vue
Normal file
@ -0,0 +1,207 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>项目合同</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectContract" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatisticoststatisticsinvoice } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总开票金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_invoice_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度开票金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_invoice_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总回款金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_refund_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度回款金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_refund_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总结算金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_settlement_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度结算金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_settlement_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatisticoststatisticsinvoice({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.settlement_series.name, res.refund_series.name, res.settlement_series.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.invoice_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.invoice_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.refund_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.refund_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.settlement_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.settlement_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectContract", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
176
src/views/statistic_zj/components/ProjectPayment.vue
Normal file
176
src/views/statistic_zj/components/ProjectPayment.vue
Normal file
@ -0,0 +1,176 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>项目开票</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectPayment" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatisticoststatisticsamout } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总签约金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_signed_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总投资金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_invest_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度签约金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_signed_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度投资金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_invest_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatisticoststatisticsamout({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.signed_series.name, res.invest_series.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.signed_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.signed_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.invest_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.invest_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectPayment", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
19
src/views/statistic_zj/index.vue
Normal file
19
src/views/statistic_zj/index.vue
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
<template>
|
||||||
|
<div style="display: flex;flex-wrap: wrap;justify-content: space-between;">
|
||||||
|
<Project></Project>
|
||||||
|
<ProjectPayment></ProjectPayment>
|
||||||
|
<ProjectInvoice></ProjectInvoice>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { reactive, ref } from "vue"
|
||||||
|
import Project from "./components/Project.vue"
|
||||||
|
import ProjectPayment from "./components/ProjectPayment.vue"
|
||||||
|
import ProjectInvoice from "./components/ProjectInvoice.vue"
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
91
src/views/statistic_zx/components/Project.vue
Normal file
91
src/views/statistic_zx/components/Project.vue
Normal file
@ -0,0 +1,91 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span> 项目立项</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
<!-- <div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { ...item.query } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div> -->
|
||||||
|
<div id="projectApproved" class="chart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatisticonsult_statisticsproject } from '@/api/statistics'
|
||||||
|
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const getData = async () => {
|
||||||
|
let res = await apistatisticonsult_statisticsproject()
|
||||||
|
let option2 = {
|
||||||
|
title: {
|
||||||
|
text: '',
|
||||||
|
subtext: '',
|
||||||
|
left: 'center'
|
||||||
|
},
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'item'
|
||||||
|
},
|
||||||
|
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
type: 'pie',
|
||||||
|
radius: '50%',
|
||||||
|
data: res.data,
|
||||||
|
emphasis: {
|
||||||
|
itemStyle: {
|
||||||
|
shadowBlur: 10,
|
||||||
|
shadowOffsetX: 0,
|
||||||
|
shadowColor: 'rgba(0, 0, 0, 0.5)'
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
||||||
|
initChart("projectApproved", option2)
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
getData()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
#main,
|
||||||
|
#main2,
|
||||||
|
#main3 {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
208
src/views/statistic_zx/components/ProjectInvoice.vue
Normal file
208
src/views/statistic_zx/components/ProjectInvoice.vue
Normal file
@ -0,0 +1,208 @@
|
|||||||
|
<template>
|
||||||
|
<el-card style="width: 49.9%;">
|
||||||
|
<template #header>
|
||||||
|
<div class="card-header">
|
||||||
|
<span>项目开票</span>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
<div style="height:40px">
|
||||||
|
<el-date-picker v-model="year" @change='getCustom' value-format="YYYY" type="year" style="float:right"
|
||||||
|
:placeholder="year" />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div style="display: flex;justify-content: space-around;">
|
||||||
|
<router-link :to="{
|
||||||
|
path: item.url,
|
||||||
|
query: item.query ? { year } : null
|
||||||
|
}" v-for=" item in customList" :key="item" class="header-btn">
|
||||||
|
<div>
|
||||||
|
<div>{{ item.value() }}</div>
|
||||||
|
<div>{{ item.name }}</div>
|
||||||
|
</div>
|
||||||
|
</router-link>
|
||||||
|
</div>
|
||||||
|
<div id="ProjectInvince" class="chart" v-if="showChart"></div>
|
||||||
|
</el-card>
|
||||||
|
</template>
|
||||||
|
<script setup>
|
||||||
|
import * as echarts from 'echarts';
|
||||||
|
import { apistatisticonsult_statisticsinvoice } from '@/api/statistics'
|
||||||
|
|
||||||
|
const year = ref(new Date().getFullYear())
|
||||||
|
const showChart = ref(true)
|
||||||
|
|
||||||
|
const customList = reactive([
|
||||||
|
{
|
||||||
|
name: "总开票金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_invoice_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度开票金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_invoice_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总回款金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_refund_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度回款金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_refund_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "总结算金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.total_settlement_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: "年度结算金额",
|
||||||
|
value: () => {
|
||||||
|
return baseData.value.year_settlement_amount
|
||||||
|
},
|
||||||
|
url: ""
|
||||||
|
|
||||||
|
},
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
])
|
||||||
|
|
||||||
|
const labelOption = {
|
||||||
|
show: true,
|
||||||
|
rich: {
|
||||||
|
name: {}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const initChart = (id, opt) => {
|
||||||
|
var chartDom = document.getElementById(id);
|
||||||
|
var myChart = echarts.init(chartDom);
|
||||||
|
myChart.setOption(opt);
|
||||||
|
}
|
||||||
|
|
||||||
|
const baseData = ref({})
|
||||||
|
|
||||||
|
const getCustom = async () => {
|
||||||
|
showChart.value = false
|
||||||
|
let res = await apistatisticonsult_statisticsinvoice({ year: year.value })
|
||||||
|
baseData.value = res
|
||||||
|
showChart.value = true
|
||||||
|
await nextTick()
|
||||||
|
var option4 = {
|
||||||
|
tooltip: {
|
||||||
|
trigger: 'axis',
|
||||||
|
axisPointer: {
|
||||||
|
type: 'shadow'
|
||||||
|
}
|
||||||
|
},
|
||||||
|
legend: {
|
||||||
|
data: [res.invoice_series.name, res.refund_series.name, res.settlement_series.name]
|
||||||
|
},
|
||||||
|
toolbox: {
|
||||||
|
show: true,
|
||||||
|
orient: 'vertical',
|
||||||
|
left: 'right',
|
||||||
|
top: 'center',
|
||||||
|
|
||||||
|
},
|
||||||
|
xAxis: [
|
||||||
|
{
|
||||||
|
type: 'category',
|
||||||
|
axisTick: { show: false },
|
||||||
|
data: res.column
|
||||||
|
}
|
||||||
|
],
|
||||||
|
yAxis: [
|
||||||
|
{
|
||||||
|
type: 'value'
|
||||||
|
}
|
||||||
|
],
|
||||||
|
series: [
|
||||||
|
{
|
||||||
|
name: res.invoice_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
barGap: 0,
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.invoice_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.refund_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.refund_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: res.settlement_series.name,
|
||||||
|
type: 'bar',
|
||||||
|
label: labelOption,
|
||||||
|
emphasis: {
|
||||||
|
focus: 'series'
|
||||||
|
},
|
||||||
|
data: res.settlement_series.data,
|
||||||
|
itemStyle: {
|
||||||
|
normal: {
|
||||||
|
label: {
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
initChart("ProjectInvince", option4)
|
||||||
|
}
|
||||||
|
getCustom()
|
||||||
|
</script>
|
||||||
|
<style lang="scss" scoped>
|
||||||
|
.chart {
|
||||||
|
width: 100%;
|
||||||
|
height: 300px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn {
|
||||||
|
text-align: center;
|
||||||
|
cursor: pointer;
|
||||||
|
padding: 0px 10px;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
.header-btn:active {
|
||||||
|
background-color: #EDEFFF;
|
||||||
|
}
|
||||||
|
</style>
|
17
src/views/statistic_zx/index.vue
Normal file
17
src/views/statistic_zx/index.vue
Normal file
@ -0,0 +1,17 @@
|
|||||||
|
<template>
|
||||||
|
<div style="display: flex;flex-wrap: wrap;justify-content: space-between;">
|
||||||
|
<Project></Project>
|
||||||
|
<ProjectInvoice></ProjectInvoice>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { reactive, ref } from "vue"
|
||||||
|
import Project from "./components/Project.vue"
|
||||||
|
import ProjectInvoice from "./components/ProjectInvoice.vue"
|
||||||
|
|
||||||
|
|
||||||
|
</script>
|
Loading…
x
Reference in New Issue
Block a user