This commit is contained in:
ylj20011123 2025-06-10 20:53:56 +08:00
parent 499a72203f
commit 76a4951cf0
77 changed files with 2949 additions and 588 deletions

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 10 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 24 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 413 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 76 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 4.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 454 B

View File

@ -44,7 +44,8 @@
.AccountsReceivableWarningContent { .AccountsReceivableWarningContent {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 40px 28px 0; // padding: 40px 28px 0;
padding: 0 28px 0;
.AccountsReceivableWarningPie { .AccountsReceivableWarningPie {
width: 100%; width: 100%;

View File

@ -25,6 +25,7 @@ echarts.use([
]); ]);
let myChart: echarts.ECharts; let myChart: echarts.ECharts;
let myChart2: echarts.ECharts;
// //
const colorList = ['#FF307C', '#FF9500', '#00FFB7']; const colorList = ['#FF307C', '#FF9500', '#00FFB7'];
const colorListSecond = ['#FF307C', '#FF9500', '#00FFB7']; const colorListSecond = ['#FF307C', '#FF9500', '#00FFB7'];
@ -43,6 +44,7 @@ let legendList = ref<any>([])
onMounted(async () => { onMounted(async () => {
await handleHaveFirstPie() await handleHaveFirstPie()
await handleHaveSecond()
}) })
// //
@ -81,19 +83,19 @@ const handleGetData = async () => {
} }
// tab // tab
const handleChangeSelectTab = async (value: number) => { // const handleChangeSelectTab = async (value: number) => {
selectTab.value = value // selectTab.value = value
if (value === 1) { // if (value === 1) {
await handleHaveFirstPie() // await handleHaveFirstPie()
} else { // } else {
await handleHaveSecond() // await handleHaveSecond()
} // }
} // }
// //
const handleHaveFirstPie = async () => { const handleHaveFirstPie = async () => {
const res: any = await handleGetData() const res: any = await handleGetData()
const chartDom = document.getElementById('AccountsReceivableWarningPieBox'); const chartDom = document.getElementById('AccountsReceivableWarningPieBox1');
if (!chartDom) return; if (!chartDom) return;
myChart = echarts.init(chartDom); myChart = echarts.init(chartDom);
@ -195,10 +197,10 @@ const handleGetDataSecond = async () => {
// //
const handleHaveSecond = async () => { const handleHaveSecond = async () => {
const res: any = await handleGetDataSecond() const res: any = await handleGetDataSecond()
const chartDom = document.getElementById('AccountsReceivableWarningPieBox'); const chartDom = document.getElementById('AccountsReceivableWarningPieBox2');
if (!chartDom) return; if (!chartDom) return;
myChart = echarts.init(chartDom); myChart2 = echarts.init(chartDom);
const option = { const option = {
tooltip: { tooltip: {
@ -255,18 +257,20 @@ const handleHaveSecond = async () => {
] ]
}; };
myChart.setOption(option); myChart2.setOption(option);
myChart.resize(); myChart2.resize();
window.addEventListener('resize', resizeChart); window.addEventListener('resize', resizeChart);
} }
const resizeChart = () => { const resizeChart = () => {
myChart?.resize(); myChart?.resize();
myChart2?.resize();
}; };
onBeforeUnmount(() => { onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart); window.removeEventListener('resize', resizeChart);
myChart?.dispose(); myChart?.dispose();
myChart2?.dispose();
}); });
@ -275,15 +279,18 @@ onBeforeUnmount(() => {
<template> <template>
<div class="AccountsReceivableWarningBox"> <div class="AccountsReceivableWarningBox">
<div class="selectTabBox"> <!-- <div class="selectTabBox">
<div :class="selectTab === item.value ? 'tabItem selectTabItem' : 'tabItem'" <div :class="selectTab === item.value ? 'tabItem selectTabItem' : 'tabItem'"
v-for="(item, index) in tabList" :key="index" @click="handleChangeSelectTab(item.value)">{{ item.label v-for="(item, index) in tabList" :key="index" @click="handleChangeSelectTab(item.value)">{{ item.label
}}</div> }}</div>
</div> </div> -->
<div class="AccountsReceivableWarningContent"> <div class="AccountsReceivableWarningContent">
<div class="AccountsReceivableWarningPie" v-if="selectTab === 1">
<div class="progressPieLeft" id="AccountsReceivableWarningPieBox"></div> <SmallTitle :title="'应收账款预警'" />
<div class="AccountsReceivableWarningPie" style="margin-top: 25px;">
<div class="progressPieLeft" id="AccountsReceivableWarningPieBox1"></div>
<div class="progressPieRight"> <div class="progressPieRight">
<div class="progressPieTop"> <div class="progressPieTop">
@ -343,8 +350,10 @@ onBeforeUnmount(() => {
</div> </div>
</div> </div>
<div class="AccountsReceivableWarningPie" v-if="selectTab === 2"> <SmallTitle :title="'合同到期预警'" style="margin-top: 21px;" />
<div class="progressPieLeft" id="AccountsReceivableWarningPieBox"></div>
<div class="AccountsReceivableWarningPie" style="margin-top: 25px;">
<div class="progressPieLeft" id="AccountsReceivableWarningPieBox2"></div>
<div class="progressPieRight"> <div class="progressPieRight">
<div class="progressPieTop" style="border-bottom: none;"> <div class="progressPieTop" style="border-bottom: none;">
@ -360,9 +369,11 @@ onBeforeUnmount(() => {
<div class="progressPieBottomSecond"> <div class="progressPieBottomSecond">
<div class="progressPieBottomItem" <div class="progressPieBottomItem"
v-for="(item, index) in AccountsReceivableWarning.ContractHalfYearListExpired" :key="index"> v-for="(item, index) in AccountsReceivableWarning?.ContractHalfYearListExpired"
:key="index">
<div class="progressPieBottomItemTop"> <div class="progressPieBottomItemTop">
<div class="progressPieBottomItemTopLegend" :style="{ background: colorListSecond[index] }"> <div class="progressPieBottomItemTopLegend"
:style="{ background: colorListSecond[index] }">
</div> </div>
<div class="progressPieBottomItemTopLabel">{{ item.Expired_Situation || "" }}</div> <div class="progressPieBottomItemTopLabel">{{ item.Expired_Situation || "" }}</div>
</div> </div>

View File

@ -0,0 +1,15 @@
.AnnualAccountsReceivableBox {
width: 100%;
.AnnualAccountsReceivableContent {
width: 100%;
margin-top: 18px;
height: 162px;
.AnnualAccountsReceivableCharts {
width: 100%;
height: 162px;
}
}
}

View File

@ -0,0 +1,163 @@
<script setup lang="ts">
import SmallTitle from '../smallTitle/smallTitle.vue';
import './AnnualAccountsReceivable.less'
import * as echarts from 'echarts/core';
import { BarChart } from 'echarts/charts';
import {
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent
} from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers';
import { onBeforeUnmount, onMounted } from 'vue';
import { handleGetProjectYearlyArrearageList } from '../../service';
//
echarts.use([
BarChart,
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent,
CanvasRenderer
]);
let myChart: echarts.ECharts;
onMounted(async () => {
const res = await handleGetData()
const chartDom = document.getElementById('AnnualAccountsReceivableCharts');
if (!chartDom) return;
myChart = echarts.init(chartDom);
const option = {
yAxis: { // yAxis
type: 'category',
data: res.category,
axisLabel: {
width: 80,
overflow: 'truncate',
ellipsis: '...',
interval: 0
}
},
xAxis: { // xAxis
type: 'value',
name: "万元",
splitLine: { show: false }
},
series: [
{
data: res.seriesData,
realData: res.seriesData,
type: 'bar',
barWidth: '6', //
showBackground: true,
backgroundStyle: {
borderRadius: [0, 4, 4, 0], //
color: 'rgba(23, 42, 70, 1)'
},
itemStyle: {
borderRadius: [0, 4, 4, 0], //
color: function (params: any) {
const index = params.dataIndex;
if (index > 6) {
return new echarts.graphic.LinearGradient(
0, 0, 1, 0, //
[
{ offset: 0, color: '#FF4F00' },
{ offset: 1, color: '#D3B70E' }
]
);
}
else {
return new echarts.graphic.LinearGradient(
0, 0, 1, 0, //
[
{ offset: 0, color: '#018FFF' },
{ offset: 1, color: '#00F4FF' }
]
);
}
}
}
},
],
grid: {
left: '0', // y
right: '10%',
bottom: '5%',
top: '0',
containLabel: true
},
tooltip: {
trigger: 'axis',
axisPointer: { type: 'shadow' },
formatter: function (params: any) {
const data: any = params[0]
return `
<div style="font-weight:bold">${data?.name || '-'}</div>
<div>已付金额${data?.value || '-'}万元 </div>
`;
}
// + ''
}
};
myChart.setOption(option);
window.addEventListener('resize', resizeChart);
})
//
const handleGetData = async () => {
let category: any = []
let seriesData: any = []
const req: any = {
}
const data = await handleGetProjectYearlyArrearageList(req)
console.log('handleGetProjectYearlyArrearageListhandleGetProjectYearlyArrearageListhandleGetProjectYearlyArrearageList', data);
let list: any = data.ProjectMonthlyCompleteList.slice(0, 5)
list.reverse()
if (list && list.length > 0) {
list.forEach((item: any) => {
category.push(item.Business_Year)
seriesData.push(item.Payment_Amount)
})
}
return {
category: category,
seriesData: seriesData,
}
}
const resizeChart = () => {
myChart?.resize();
};
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart);
myChart?.dispose();
});
</script>
<template>
<div class="AnnualAccountsReceivableBox">
<SmallTitle title="年度应收总额完成度" />
<div class="AnnualAccountsReceivableContent">
<div class="AnnualAccountsReceivableCharts" id="AnnualAccountsReceivableCharts"></div>
</div>
</div>
</template>

View File

@ -0,0 +1,106 @@
.AssessmentScoringRankingBox {
width: 100%;
.AssessmentScoringRankingListBox {
.AssessmentScoringRankingItem {
width: 100%;
box-sizing: border-box;
padding: 11px 10px;
background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0.05) 100%);
margin-bottom: 10px;
.AssessmentScoringRankingItemTop {
display: flex;
align-items: center;
.AssessmentScoringRankingItemIndex {
font-family: Impact, Impact;
font-weight: 400;
font-size: 15px;
color: #171B2D;
letter-spacing: 1px;
text-align: center;
font-style: normal;
box-sizing: border-box;
padding: 1px 8px 2px 4px;
margin-right: 5px;
background-image: url('../../../../assets/image/threeStBg.png');
background-repeat: no-repeat;
background-size: 100% 100%;
}
.AssessmentScoringRankingItemIndexAfter {
background-image: url('../../../../assets/image/otherStBg.png');
}
.AssessmentScoringRankingItemName {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 12px;
color: #FFFFFF;
text-align: left;
font-style: normal;
}
}
.AssessmentScoringRankingItemBottom {
width: 100%;
display: flex;
margin-top: 10px;
align-items: center;
justify-content: space-between;
.AssessmentScoringRankingItemBottomItem {
width: calc(50% - 5px);
display: flex;
align-items: flex-end;
.AssessmentScoringRankingItemBottomItemPosition {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 12px;
color: #0094FF;
text-align: left;
font-style: normal;
padding: 5px 7px;
background: rgba(0, 148, 255, 0.3);
border-radius: 5px 5px 5px 5px;
margin-right: 5px;
}
.AssessmentScoringRankingItemBottomItemRight {
flex: 1;
.AssessmentScoringRankingItemBottomItemMark {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 12px;
color: #FFFFFF;
text-align: right;
font-style: normal;
}
.AssessmentScoringRankingItemBottomItemProgress {
width: 100%;
height: 3px;
margin-top: 4px;
background: rgba(47, 52, 107, 1);
border-radius: 4px;
position: relative;
.AssessmentScoringRankingItemBottomItemHaveProgress {
height: 100%;
background-color: #7D4CD2;
position: absolute;
left: 0;
top: 0;
}
}
}
}
}
}
}
}

View File

@ -0,0 +1,65 @@
<script setup lang="ts">
import { onMounted, ref } from 'vue';
import SmallTitle from '../smallTitle/smallTitle.vue';
import './AssessmentScoringRanking.less'
import { handleGetExamineResultList } from '../../service';
//
let rankList: any = ref<any>([])
onMounted(async () => {
await handleGetData()
})
//
const handleGetData = async () => {
const req: any = {
DataType: 1,
StartMonth: "202501",
EndMonth: "202501",
provinceCode: "340000",
}
const data = await handleGetExamineResultList(req)
console.log('fjdisfjoasidfj', data);
let list: any = data.slice(0, 5)
rankList.value = list
}
</script>
<template>
<div class="AssessmentScoringRankingBox">
<SmallTitle title="考核打分排行榜" />
<div class="AssessmentScoringRankingListBox">
<div class="AssessmentScoringRankingItem" v-for="(item, index) in rankList" :key="index">
<div class="AssessmentScoringRankingItemTop">
<div
:class="index + 1 > 3 ? 'AssessmentScoringRankingItemIndex AssessmentScoringRankingItemIndexAfter' : 'AssessmentScoringRankingItemIndex '">
{{ index + 1 }}</div>
<div class="AssessmentScoringRankingItemName">{{ item.SERVERPART_NAME }}</div>
</div>
<div class="AssessmentScoringRankingItemBottom">
<div class="AssessmentScoringRankingItemBottomItem" v-for="(subItem, subIndex) in item.list"
:key="subIndex">
<div class="AssessmentScoringRankingItemBottomItemPosition">{{ subItem.REGION_NAME }}</div>
<div class="AssessmentScoringRankingItemBottomItemRight">
<div class="AssessmentScoringRankingItemBottomItemMark">{{ subItem.EXAMINE_SCORE }}</div>
<div class="AssessmentScoringRankingItemBottomItemProgress">
<div class="AssessmentScoringRankingItemBottomItemHaveProgress"
:style="{ width: `${subItem.EXAMINE_SCORE}%` }"></div>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</template>

View File

@ -4,7 +4,7 @@
.BrandConsumptionLevel { .BrandConsumptionLevel {
width: 100%; width: 100%;
height: 174px; height: 167px;
margin-top: 13px; margin-top: 14px;
} }
} }

View File

@ -52,16 +52,32 @@ onMounted(async () => {
containLabel: true containLabel: true
}, },
yAxis: { yAxis: {
name: '%',
type: 'value', type: 'value',
splitLine: { show: false } // 线 splitLine: { show: false }, // 线
axisLine: {
show: true,
lineStyle: {
color: '#fff'
}
},
axisLabel: {
color: '#fff',
}
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
data: res.category, data: res.category,
axisLabel: { axisLabel: {
interval: 0 // interval: 0 //
},
axisLine: {
show: true,
lineStyle: {
color: '#fff'
} }
}, },
},
series: res.seriesData, series: res.seriesData,
tooltip: { tooltip: {
trigger: 'item', trigger: 'item',

View File

@ -5,6 +5,9 @@
width: 100%; width: 100%;
display: flex; display: flex;
align-items: center; align-items: center;
background: linear-gradient(90deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
padding: 3px 20px;
box-sizing: border-box;
.BusinessCaseItem { .BusinessCaseItem {
font-family: Microsoft YaHei, Microsoft YaHei; font-family: Microsoft YaHei, Microsoft YaHei;
@ -42,12 +45,13 @@
.BusinessCaseRevenueYOY { .BusinessCaseRevenueYOY {
width: 100%; width: 100%;
margin-top: 26px; margin-top: 29px;
background: linear-gradient(30deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%); background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
box-sizing: border-box; box-sizing: border-box;
padding: 20px 15px; padding: 20px 15px;
display: flex; display: flex;
align-items: center; align-items: center;
border-bottom: 1px solid rgba(0, 148, 255, 0.50);
.BusinessCaseLeftItem { .BusinessCaseLeftItem {
@ -144,16 +148,18 @@
.featureAnalysis { .featureAnalysis {
width: 100%; width: 100%;
height: 283px; height: 283px;
margin-top: 32px;
.featureAnalysisBox { .featureAnalysisBox {
width: 100%; width: 100%;
height: 283px; height: 283px;
margin-top: 18px;
} }
.featureAnalysisBottom { .featureAnalysisBottom {
width: 100%; width: 100%;
height: 283px; height: 283px;
margin-top: 23px; margin-top: 18px;
} }
} }
} }

View File

@ -306,7 +306,7 @@ const handleShowBottomData = async (res: any) => {
grid: { grid: {
left: '10', // left: '10', //
right: '10', // right: '10', //
bottom: '10', bottom: '0',
top: '10', top: '10',
containLabel: true containLabel: true
}, },
@ -379,7 +379,7 @@ onBeforeUnmount(() => {
<template> <template>
<div class="BusinessCaseBox"> <div class="BusinessCaseBox">
<SmallTitle> <SmallTitle style="padding-left: 0;">
<template #extra> <template #extra>
<div class="BusinessCaseTabBox"> <div class="BusinessCaseTabBox">
<div :class="selectTab === item.value ? 'BusinessCaseItem selectBusinessCaseItem' : 'BusinessCaseItem'" <div :class="selectTab === item.value ? 'BusinessCaseItem selectBusinessCaseItem' : 'BusinessCaseItem'"
@ -419,11 +419,11 @@ onBeforeUnmount(() => {
<!-- 营收特征分析 --> <!-- 营收特征分析 -->
<div class="featureAnalysis"> <div class="featureAnalysis">
<SmallTitle title="营收特征分析" style="margin-top: 20px;" /> <SmallTitle title="营收特征分析" />
<div class="featureAnalysisBox" id="featureAnalysis"></div> <div class="featureAnalysisBox" id="featureAnalysis"></div>
<SmallTitle title="营收同比分析" style="margin-top: 20px;" /> <SmallTitle title="营收同比分析" style="margin-top: 31px;" />
<div class="featureAnalysisBottom" id="featureAnalysisBottom"></div> <div class="featureAnalysisBottom" id="featureAnalysisBottom"></div>
</div> </div>

View File

@ -1,12 +1,12 @@
.BusinessStructureBox { .BusinessStructureBox {
width: 100%; width: 100%;
box-sizing: border-box;
padding: 3px 0 0 10px;
.BusinessStructureCharts { .BusinessStructureCharts {
width: 100%; width: 100%;
// margin-top: 10px;
box-sizing: border-box; box-sizing: border-box;
padding: 0 20px 30px; padding: 22px 0 0 31px;
.BusinessStructureUnit { .BusinessStructureUnit {
font-family: "Microsoft YaHei"; font-family: "Microsoft YaHei";
@ -19,21 +19,24 @@
} }
.BusinessStructure { .BusinessStructure {
width: 112px; width: 132px;
height: 172px; height: 132px;
display: inline-block;
} }
.BusinessStructureDataList { .BusinessStructureDataList {
flex: 1; display: inline-block;
width: calc(100% - 162px);
height: 132px;
margin-left: 30px; margin-left: 30px;
.BusinessStructureDataBox { .BusinessStructureDataBox {
// margin-left: 30px; // margin-left: 30px;
display: flex; display: flex;
padding: 6px 0;
.BusinessStructureDataLeftBox { .BusinessStructureDataLeftBox {
box-sizing: border-box; box-sizing: border-box;
padding-top: 20px;
.BusinessStructureItem { .BusinessStructureItem {
display: flex; display: flex;
@ -93,7 +96,7 @@
} }
} }
} }
}
} }
}

View File

@ -182,7 +182,6 @@ onBeforeUnmount(() => {
<div class="BusinessStructureCharts"> <div class="BusinessStructureCharts">
<!-- <div class="BusinessStructureUnit">万元</div> --> <!-- <div class="BusinessStructureUnit">万元</div> -->
<div style="display: flex;margin-top: 30px;align-items: center;">
<div class="BusinessStructure" id="BusinessStructure"></div> <div class="BusinessStructure" id="BusinessStructure"></div>
<div class="BusinessStructureDataList"> <div class="BusinessStructureDataList">
@ -202,5 +201,4 @@ onBeforeUnmount(() => {
</div> </div>
</div> </div>
</div>
</template> </template>

View File

@ -1,6 +1,5 @@
.BusyTradingRankingBox { .BusyTradingRankingBox {
width: 100%; width: 100%;
height: 150px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
@ -10,9 +9,12 @@
.BusyTradingRankingDataList { .BusyTradingRankingDataList {
width: 100%; width: 100%;
height: 120px;
.BusyTradingRankingItem { .BusyTradingRankingItem {
width: 100%; width: 100%;
height: 24px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
@ -65,6 +67,7 @@
.tradingRankingItemRight { .tradingRankingItemRight {
display: flex; display: flex;
justify-content: flex-end; justify-content: flex-end;
.tradingRankingItemTOTALPRICE { .tradingRankingItemTOTALPRICE {
font-family: Microsoft YaHei, Microsoft YaHei; font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400; font-weight: 400;

View File

@ -5,7 +5,7 @@
.ConsumptionConversion { .ConsumptionConversion {
width: 100%; width: 100%;
// height: 100%; // height: 100%;
height: 174px; height: 163px;
margin-top: 13px; margin-top: 18px;
} }
} }

View File

@ -36,32 +36,40 @@ onMounted(async () => {
const option = { const option = {
legend: { legend: {
data: ['客单', '车流'], // series name
top: 0, // top: 0, //
right: 0, right: 0,
itemWidth: 20, // itemWidth: 30, //
itemHeight: 10, // itemHeight: 10, //
textStyle: { textStyle: {
color: '#333' // color: '#fff' //
} }
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
data: res.category, data: res.category,
boundaryGap: true, boundaryGap: true,
axisLine: {
show: true,
lineStyle: {
color: '#ffffff'
}
},
axisTick: {
alignWithLabel: true // 线
}
}, },
yAxis: [ yAxis: [
{ {
type: 'value', type: 'value',
name: '车流量', name: '车流量',
nameTextStyle: { nameTextStyle: {
color: '#00F6FF' // Y color: '#ffffff' // Y
}, },
splitLine: { show: false }, splitLine: { show: false },
axisLine: { axisLine: {
show: true, show: true,
lineStyle: { lineStyle: {
color: '#00F6FF' color: '#ffffff'
} }
}, },
axisLabel: { axisLabel: {
@ -73,28 +81,27 @@ onMounted(async () => {
type: 'value', type: 'value',
name: '客单量', name: '客单量',
nameTextStyle: { nameTextStyle: {
color: '#008CFF' // Y color: '#ffffff' // Y
}, },
splitLine: { show: false }, splitLine: { show: false },
position: 'right', position: 'right',
axisLine: { axisLine: {
show: true, show: true,
lineStyle: { lineStyle: {
color: '#008CFF' color: '#ffffff'
} }
}, },
axisLabel: { axisLabel: {
color: '#008CFF', color: '#ffffff',
formatter: '{value}' //
}, },
offset: 0 // Y offset: 0 // Y
} }
], ],
grid: { grid: {
left: '10', // left: '20', //
right: '10', // right: '10', //
bottom: '10', bottom: '0',
top: '10', top: '50',
containLabel: true containLabel: true
}, },
series: [ series: [
@ -102,7 +109,7 @@ onMounted(async () => {
name: '车流量', name: '车流量',
data: res.carResList.map((value: any, index: any) => ({ data: res.carResList.map((value: any, index: any) => ({
value: value, value: value,
symbol: index % 3 === 0 ? 'circle' : 'none', symbol: index % 2 === 0 ? 'circle' : 'none',
symbolSize: 6 symbolSize: 6
})), })),
type: 'line', type: 'line',
@ -120,7 +127,7 @@ onMounted(async () => {
name: '客单量', name: '客单量',
data: res.orderResList.map((value: any, index: any) => ({ data: res.orderResList.map((value: any, index: any) => ({
value: value, value: value,
symbol: index % 3 === 0 ? 'circle' : 'none', symbol: index % 2 === 0 ? 'circle' : 'none',
symbolSize: 6 symbolSize: 6
})), })),
type: 'line', type: 'line',

View File

@ -4,8 +4,8 @@
.ConsumptionLevel { .ConsumptionLevel {
width: 100%; width: 100%;
height: 174px; height: 163px;
margin-top: 13px; margin-top: 19px;
} }
.ConsumptionLevelDesc { .ConsumptionLevelDesc {

View File

@ -4,7 +4,7 @@
.ConsumptionPeriod { .ConsumptionPeriod {
width: 100%; width: 100%;
height: 174px; height: 167px;
margin-top: 13px; margin-top: 14px;
} }
} }

View File

@ -43,23 +43,32 @@ onMounted(async () => {
interval: 3, interval: 3,
showMinLabel: true, showMinLabel: true,
showMaxLabel: true showMaxLabel: true
},
axisLine: {
show: true,
lineStyle: {
color: '#fff'
}
},
axisTick: {
alignWithLabel: true // 线
} }
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
name: '车流量', name: '客单占比',
nameTextStyle: { nameTextStyle: {
color: '#00F6FF' // Y color: '#fff' // Y
}, },
splitLine: { show: false }, splitLine: { show: false },
axisLine: { axisLine: {
show: true, show: true,
lineStyle: { lineStyle: {
color: '#00F6FF' color: '#fff'
} }
}, },
axisLabel: { axisLabel: {
color: '#00F6FF', color: '#fff',
formatter: '{value}' // formatter: '{value}' //
} }
}, },
@ -67,12 +76,20 @@ onMounted(async () => {
left: '10', // left: '10', //
right: '10', // right: '10', //
bottom: '10', bottom: '10',
top: '10', top: '30',
containLabel: true containLabel: true
}, },
series: [ series: [
{ {
data: res.seriesData, // data: res.seriesData,
data: res.seriesData.map((value: any, index: any) => {
return {
value: value,
// symbol
symbol: index % 4 === 0 ? 'circle' : 'none',
symbolSize: 6
}
}),
type: 'line', type: 'line',
smooth: true, smooth: true,
lineStyle: { lineStyle: {

View File

@ -0,0 +1,175 @@
.ContractInformationBox {
width: 100%;
box-sizing: border-box;
padding: 10px 15px;
background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
border-bottom: 1px solid rgba(0, 148, 255, 0.50);
.ContractInformationBigItem {
width: 100%;
box-sizing: border-box;
padding: 0 5px 10px;
display: flex;
align-items: center;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
.ContractInformationBigLeft {
width: 46px;
height: 46px;
margin-right: 10px;
.ContractInformationBigLeftImg {
width: 46px;
height: 46px;
}
}
.ContractInformationBigRight {
width: calc(100% - 56px);
display: flex;
align-items: center;
justify-content: space-between;
.ContractInformationBigRightLeft {
.ContractInformationBigRightLabel {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 14px;
color: #FFFFFF;
text-align: left;
font-style: normal;
}
.ContractInformationBigRightText {
.ContractInformationBigRightSmallLabel {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #7E858A;
text-align: left;
font-style: normal;
}
.ContractInformationBigRightValue {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #00F6FF;
text-align: left;
font-style: normal;
margin-left: 5px;
}
}
}
.ContractInformationBigRightRight {
display: flex;
align-items: center;
.ContractInformationBigRightRightValue {
font-family: Impact, Impact;
font-weight: 400;
font-size: 25px;
color: #FFFFFF;
letter-spacing: 2px;
text-align: right;
font-style: normal;
margin-right: 10px;
}
.ContractInformationBigRightRightUnit {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #828689;
text-align: right;
font-style: normal;
}
}
}
}
.ContractInformationSmallItem {
width: 100%;
box-sizing: border-box;
padding: 0 5px 10px;
display: flex;
align-items: center;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
.ContractInformationSmallLeft {
width: 33px;
height: 33px;
margin-right: 17px;
}
.ContractInformationSmallRight {
width: calc(100% - 50px);
display: flex;
align-items: center;
justify-content: space-between;
.ContractInformationSmallRightLeft {
.ContractInformationSmallRightLeftTop {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 14px;
color: #FFFFFF;
text-align: left;
font-style: normal;
}
.ContractInformationSmallRightLeftBottom {
.ContractInformationSmallRightLeftBottomNormalText {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #7B858D;
text-align: left;
font-style: normal;
}
.ContractInformationSmallRightLeftBottomValue {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #7B858D;
text-align: left;
font-style: normal;
margin-left: 5px;
}
}
}
.ContractInformationSmallRightRight {
display: flex;
align-items: flex-end;
.ContractInformationSmallRightRightValue {
font-family: Impact, Impact;
font-weight: 400;
font-size: 25px;
color: #FFFFFF;
letter-spacing: 2px;
text-align: right;
font-style: normal;
}
.ContractInformationSmallRightRightUnit {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #7B858D;
text-align: right;
font-style: normal;
margin-left: 10px;
}
}
}
}
}

View File

@ -0,0 +1,225 @@
<script setup lang="ts">
import './ContractInformation.less'
import ContractInformationIcon from '../../../../assets/image/ContractInformationIcon.png'
import { onBeforeUnmount, onMounted, ref } from 'vue';
import { handleGetProjectSummaryInfo } from '../../service';
import * as echarts from 'echarts/core';
import { PieChart } from 'echarts/charts';
import {
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent
} from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers';
//
echarts.use([
PieChart,
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent,
CanvasRenderer
]);
let myChart: echarts.ECharts;
let myChart2: echarts.ECharts;
//
let realDataObj = ref<any>()
//
let shareRevenue = ref<any>()
//
let FixedRent = ref<any>()
onMounted(async () => {
await handleGetData()
})
//
const handleGetData = async () => {
const req: any = {
ProvinceCode: '340000'
}
const data = await handleGetProjectSummaryInfo(req)
console.log('handleGetDatahandleGetDatahandleGetDatahandleGetData', data);
realDataObj.value = data
shareRevenue.value = data.BusinessTypeSummaryList[0]
FixedRent.value = data.BusinessTypeSummaryList[1]
const chartDom = document.getElementById('ContractInformation1');
if (!chartDom) return;
myChart = echarts.init(chartDom);
const chartDom2 = document.getElementById('ContractInformation2');
if (!chartDom) return;
myChart2 = echarts.init(chartDom2);
const option1 = {
series: [
{
name: 'Access From',
type: 'pie',
radius: ['80%', '100%'],
center: ['50%', '50%'], // [, ]
avoidLabelOverlap: false,
label: {
show: false
},
emphasis: false,
labelLine: {
show: false
},
itemStyle: {
color: function (params: any) {
//
return params.dataIndex === 0 ? '#00F6FF' : '#0C6370';
}
},
data: [((shareRevenue?.value.Contract_SignCount / realDataObj?.value.Contract_SignCount) * 100), 100 - ((shareRevenue?.value.Contract_SignCount / realDataObj?.value.Contract_SignCount) * 100)]
}
]
};
const option2 = {
series: [
{
name: 'Access From',
type: 'pie',
radius: ['80%', '100%'],
center: ['50%', '50%'], // [, ]
avoidLabelOverlap: false,
label: {
show: false
},
emphasis: false,
labelLine: {
show: false
},
itemStyle: {
color: function (params: any) {
//
return params.dataIndex === 0 ? '#00F6FF' : '#0C6370';
}
},
data: [((FixedRent?.value.Contract_SignCount / realDataObj?.value.Contract_SignCount) * 100), 100 - ((FixedRent?.value.Contract_SignCount / realDataObj?.value.Contract_SignCount) * 100)]
}
]
};
myChart.setOption(option1);
myChart.resize();
myChart2.setOption(option2);
myChart2.resize();
window.addEventListener('resize', resizeChart);
}
const resizeChart = () => {
myChart?.resize();
myChart2?.resize();
};
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart);
myChart?.dispose();
myChart2?.dispose();
});
</script>
<template>
<div class="ContractInformationBox">
<div class="ContractInformationBigItem">
<div class="ContractInformationBigLeft">
<img :src="ContractInformationIcon" class="ContractInformationBigLeftImg" />
</div>
<div class="ContractInformationBigRight">
<div class="ContractInformationBigRightLeft">
<div class="ContractInformationBigRightLabel">合同信息</div>
<div class="ContractInformationBigRightText">
<span class="ContractInformationBigRightSmallLabel">签约合同</span>
<span class="ContractInformationBigRightValue">{{ realDataObj?.Contract_SignCount || ''
}}</span>
</div>
</div>
<div class="ContractInformationBigRightRight">
<div class="ContractInformationBigRightRightValue">{{ realDataObj?.Contract_Amount || '' }}
</div>
<div class="ContractInformationBigRightRightUnit">万元</div>
</div>
</div>
</div>
<div class="ContractInformationSmallItem">
<div class="ContractInformationSmallLeft" id="ContractInformation1"></div>
<div class="ContractInformationSmallRight">
<div class="ContractInformationSmallRightLeft">
<div class="ContractInformationSmallRightLeftTop">合作分成</div>
<div class="ContractInformationSmallRightLeftBottom">
<span class="ContractInformationSmallRightLeftBottomNormalText">合同</span>
<span class="ContractInformationSmallRightLeftBottomValue">{{ shareRevenue?.Contract_SignCount
|| "" }}</span>
<span class="ContractInformationSmallRightLeftBottomNormalText"
style="margin-left: 10px;">占比</span>
<span class="ContractInformationSmallRightLeftBottomValue">
{{ realDataObj?.Contract_SignCount ? ((shareRevenue?.Contract_SignCount /
realDataObj?.Contract_SignCount) * 100).toFixed(2) + '%' : '-' }}
</span>
</div>
</div>
<div class="ContractInformationSmallRightRight">
<div class="ContractInformationSmallRightRightValue">{{ shareRevenue?.Contract_Amount || '' }}
</div>
<div class="ContractInformationSmallRightRightUnit">万元</div>
</div>
</div>
</div>
<div class="ContractInformationSmallItem" style="border-bottom: none;padding-bottom: 0;">
<div class="ContractInformationSmallLeft" id="ContractInformation2"></div>
<div class="ContractInformationSmallRight">
<div class="ContractInformationSmallRightLeft">
<div class="ContractInformationSmallRightLeftTop">固定租金</div>
<div class="ContractInformationSmallRightLeftBottom">
<span class="ContractInformationSmallRightLeftBottomNormalText">合同</span>
<span class="ContractInformationSmallRightLeftBottomValue">{{ FixedRent?.Contract_SignCount
|| "" }}</span>
<span class="ContractInformationSmallRightLeftBottomNormalText"
style="margin-left: 10px;">占比</span>
<span class="ContractInformationSmallRightLeftBottomValue">
{{ realDataObj?.Contract_SignCount ? ((FixedRent?.Contract_SignCount /
realDataObj?.Contract_SignCount) * 100).toFixed(2) + '%' : '-' }}
</span>
</div>
</div>
<div class="ContractInformationSmallRightRight">
<div class="ContractInformationSmallRightRightValue">{{ FixedRent?.Contract_Amount || '' }}
</div>
<div class="ContractInformationSmallRightRightUnit">万元</div>
</div>
</div>
</div>
</div>
</template>

View File

@ -118,6 +118,9 @@
.newCoreBusinessBox { .newCoreBusinessBox {
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: center;
background: rgba(3, 22, 38, 0.2);
.newCoreBusinessItem { .newCoreBusinessItem {
box-sizing: border-box; box-sizing: border-box;

View File

@ -1,17 +1,23 @@
.CustomerAgeGroupBox { .CustomerAgeGroupBox {
width: 25%; width: calc((100% - 28px) / 3);
display: inline-block; display: inline-block;
height: 210px; height: 210px;
.CustomerAgeGroupCharts { .CustomerAgeGroupCharts {
width: 100%; width: 100%;
height: 182px; height: 182px;
background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%); // background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
box-sizing: border-box; // box-sizing: border-box;
padding: 20px 20px 18px; // padding: 20px 20px 18px;
display: flex; display: flex;
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
// margin-top: 5px;
box-sizing: border-box;
padding: 10px 10px 18px;
background-image: url('../../../../assets/image/smallModalBg.png');
background-repeat: no-repeat;
background-size: 100% 100%;
.CustomerAgeGroupUnit { .CustomerAgeGroupUnit {
font-family: "Microsoft YaHei"; font-family: "Microsoft YaHei";
@ -26,8 +32,8 @@
} }
.CustomerAgeGroup { .CustomerAgeGroup {
width: 86px; width: 190px;
height: 86px; height: 154px;
} }
.legendBox { .legendBox {

View File

@ -49,34 +49,65 @@ onMounted(async () => {
// }, // },
formatter: function (params: any) { // formatter: function (params: any) { //
return ` return `
<div>${res.category[params?.dataIndex]}${params?.data || ""}万人, 占比${params?.percent || ''}%</div> <div>${res.category[params?.dataIndex]}${params?.data || ""}万人, 占比${res?.percentData[params?.dataIndex] || ''}%</div>
` `
// return ` // return `
// <div style="font-weight:bold">${params.data.name} ${params?.percent}% ${res.realData[params.dataIndex].toLocaleString()}</div> // <div style="font-weight:bold">${params.data.name} ${params?.percent}% ${res.realData[params.dataIndex].toLocaleString()}</div>
// `; // `;
} }
}, },
series: [ xAxis: {
{ type: 'category',
name: 'Access From', data: res.category,
type: 'pie', axisLabel: {
radius: ['0%', '100%'], interval: 0, //
avoidLabelOverlap: false, hideOverlap: false, //
},
axisTick: {
alignWithLabel: true // 线
}
},
yAxis: {
type: 'value',
name: '%',
splitLine: { show: false },
axisLine: {
show: true,
}
},
grid: {
left: '10', //
right: '10', //
bottom: '10',
top: '30',
containLabel: true
},
series: {
// data: [120, 200, 150, 80, 70, 110, 130],
data: res.seriesData,
realData: res.realData,
type: 'bar',
barWidth: '6',
showBackground: true,
backgroundStyle: {
borderRadius: [4, 4, 0, 0],
// color: 'rgba(23, 42, 70, 1)'
color: 'rgba(0, 148, 255, 0.1)'
},
itemStyle: { itemStyle: {
borderRadius: [4, 4, 0, 0],
//
color: function (params: any) { color: function (params: any) {
return colorList[params.dataIndex]; return new echarts.graphic.LinearGradient(
} 0, 0, 0, 1, //
}, [
label: { { offset: 0, color: '#008CFF' }, //
show: false { offset: 1, color: '#00F6FF' } //
},
emphasis: false,
labelLine: {
show: false
},
data: res.pieData
}
] ]
);
}
}
},
}; };
@ -89,7 +120,7 @@ onMounted(async () => {
const handleGetData = async () => { const handleGetData = async () => {
let category: any = [] let category: any = []
let seriesData: any = [] let seriesData: any = []
let realData: any = [] let percentData: any = []
const req: any = { const req: any = {
provinceCode: '530000', provinceCode: '530000',
@ -97,17 +128,22 @@ const handleGetData = async () => {
} }
const data = await handleGetCustomerAgeRatio(req) const data = await handleGetCustomerAgeRatio(req)
for (let i = 0; i < 4; i++) { for (let i = 0; i < 4; i++) {
let sum: number = (data[0].data[i] + data[1].data[i]).toFixed(2) let sum: number = (data[0].data[i] + data[1].data[i])
seriesData.push(sum) seriesData.push(sum.toFixed(2))
percentData.push((sum / 200 * 100).toFixed(2))
} }
let res: any = { let res: any = {
category: ["25以下", "25-35", "35-45", "45以上"],// x category: ["25以下", "25-35", "35-45", "45以上"],// x
pieData: seriesData,// y seriesData: seriesData,// y
realData: realData// percentData: percentData//
} }
console.log('hfuhdsuafsdjfh', res);
return res return res
} }
@ -131,13 +167,13 @@ onBeforeUnmount(() => {
<!-- <div class="CustomerAgeGroupUnit">万人</div> --> <!-- <div class="CustomerAgeGroupUnit">万人</div> -->
<div class="CustomerAgeGroup" id="CustomerAgeGroup"></div> <div class="CustomerAgeGroup" id="CustomerAgeGroup"></div>
<div class="legendBox"> <!-- <div class="legendBox">
<div class="legendItem" v-for="(item, index) in categoryList" :key="index" <div class="legendItem" v-for="(item, index) in categoryList" :key="index"
:style="{ marginBottom: index <= 1 ? '6px' : '' }"> :style="{ marginBottom: index <= 1 ? '6px' : '' }">
<div class="legendIcon" :style="{ background: colorList[index] }"></div> <div class="legendIcon" :style="{ background: colorList[index] }"></div>
<div class="legendLabel">{{ item }}</div> <div class="legendLabel">{{ item }}</div>
</div> </div>
</div> </div> -->
</div> </div>
</div> </div>
</template> </template>

View File

@ -2,13 +2,13 @@
width: 100%; width: 100%;
.CustomerConsumptionPreferencesContent { .CustomerConsumptionPreferencesContent {
margin-top: 25px; margin-top: 14px;
width: 100%; width: 100%;
height: 212px; height: 167px;
.CustomerConsumptionPreferencesCharts { .CustomerConsumptionPreferencesCharts {
width: 100%; width: 100%;
height: 212px; height: 167px;
} }
} }
} }

View File

@ -65,11 +65,23 @@ const handleGoMounted = async () => {
interval: 0 // interval: 0 //
// rotate: 30, // 30 // rotate: 30, // 30
}, },
axisLine: {
show: true,
lineStyle: {
color: '#fff'
}
},
// data: res.category // data: res.category
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
name: "万辆", name: "万辆",
axisLine: {
show: true,
lineStyle: {
color: '#fff'
}
},
splitLine: { show: false } // 线 splitLine: { show: false } // 线
}, },
series: [ series: [

View File

@ -3,7 +3,7 @@
.CustomerGroupBoxContent{ .CustomerGroupBoxContent{
width: 100%; width: 100%;
height: 173px; height: 163px;
margin-top: 20px; margin-top: 18px;
} }
} }

View File

@ -77,7 +77,10 @@ const handleShowCharts = async () => {
show: false // 线 show: false // 线
}, },
axisLine: { axisLine: {
show: false // 线 show: true, // 线
lineStyle: {
color: '#fff'
}
}, },
splitLine: { splitLine: {
show: false // 线 show: false // 线
@ -85,29 +88,32 @@ const handleShowCharts = async () => {
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
name: '交易金额',
axisLabel: { axisLabel: {
color: '#fff',
formatter: '{value}' formatter: '{value}'
}, },
axisTick: { axisTick: {
show: false // 线 show: false // 线
}, },
axisLine: { axisLine: {
show: false // 线 show: true,// 线
lineStyle: {
color: '#fff'
}
}, },
splitLine: { splitLine: {
show: false // 线 show: false // 线
} },
}, },
series: [{ series: [{
name: '用户交易', name: '用户交易',
type: 'scatter', type: 'scatter',
symbolSize: function (data) { symbolSize: function (data: any) {
return Math.sqrt(data[2]) * 5; // return Math.sqrt(data[2]) * 5; //
}, },
data: res, data: res,
itemStyle: { itemStyle: {
color: function (params) { color: function (params: any) {
// //
const gender = params.data[3]; // const gender = params.data[3]; //
return gender === '男性' ? '#0094FF' : '#FF307C'; // return gender === '男性' ? '#0094FF' : '#FF307C'; //
@ -134,7 +140,7 @@ const handleShowCharts = async () => {
// //
tooltip: { tooltip: {
trigger: 'item', trigger: 'item',
formatter: function (params) { formatter: function (params: any) {
const data = params.data; const data = params.data;
return ` return `
年龄: ${data[0]}<br> 年龄: ${data[0]}<br>

View File

@ -0,0 +1,62 @@
.DailyInspectionBox {
width: 100%;
.DailyInspectionContent {
width: 100%;
box-sizing: border-box;
padding: 20px 28px 0;
display: flex;
align-items: center;
.DailyInspectionCharts {
width: 118px;
height: 118px;
margin-right: 38px;
}
.DailyInspectionRightBox {
width: calc(100% - 156px);
height: 100%;
.DailyInspectionRightBoxTop {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 12px;
color: #E0E3E4;
text-align: left;
font-style: normal;
}
.DailyInspectionRightBoxBottom {
margin-top: 10px;
width: 100%;
display: flex;
align-items: center;
.DailyInspectionRightBoxBottomItem {
width: 50%;
.DailyInspectionRightBoxBottomItemValue {
font-family: Impact, Impact;
font-weight: 400;
font-size: 15px;
color: #FFFFFF;
letter-spacing: 1px;
text-align: left;
font-style: normal
}
.DailyInspectionRightBoxBottomItemLabel {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 12px;
color: #3D4A54;
text-align: left;
font-style: normal;
margin-top: 10px;
}
}
}
}
}
}

View File

@ -0,0 +1,198 @@
<script setup lang="ts">
import * as echarts from 'echarts/core';
import { PieChart } from 'echarts/charts';
import {
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent,
GraphicComponent
} from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers';
import { onBeforeUnmount, onMounted, ref, watch } from 'vue';
import returnRateBg from '../../../../assets/image/returnRateBg.png'
import { handleGetPatrolAnalysis } from '../../service';
import moment from 'moment';
import SmallTitle from '../smallTitle/smallTitle.vue';
import './DailyInspection.less'
//
echarts.use([
PieChart,
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent,
GraphicComponent,
CanvasRenderer
]);
let myChart: echarts.ECharts;
//
const colorList = ['#7D4CD2', '#2E2C5D'];
//
let dailyDetailObj = ref<any>()
onMounted(async () => {
await handleGoMounted()
})
const handleGoMounted = async () => {
const res: any = await handleGetData()
const chartDom = document.getElementById('DailyInspectionCharts');
if (!chartDom) return;
myChart = echarts.init(chartDom);
const option = {
tooltip: { // tooltip
trigger: 'item', //
axisPointer: { //
type: 'shadow' //
},
formatter: function (params: any) { //
return `
<div style="font-weight:bold">${params.data.name} ${params?.percent}% ${res.realData[params.dataIndex]}</div>
`;
}
},
graphic: { //
elements: [
{
type: 'image',
style: {
image: returnRateBg,
width: 83,
height: 83
},
left: 'center',
top: 'center',
z: 10
},
{
//
type: 'text',
style: {
text: `${dailyDetailObj.value.CompleteRate || '-'}`, //
font: 'bold 20px Arial', //
fill: '#FFFFFF', //
textAlign: 'center',
textVerticalAlign: 'middle'
},
left: 'center',
top: 'center',
z: 20 //
}
]
},
series: [
{
name: 'Access From',
type: 'pie',
radius: ['85%', '100%'],
center: ['50%', '50%'], // [, ]
avoidLabelOverlap: false,
itemStyle: {
color: function (params: any) {
return colorList[params.dataIndex];
}
},
label: {
show: false
},
emphasis: false,
labelLine: {
show: false
},
data: res.seriesData
}
]
};
myChart.setOption(option);
myChart.resize();
window.addEventListener('resize', resizeChart);
}
//
const props = defineProps<{
currentService?: any;
}>();
//
watch(
() => props.currentService,
(newVal, oldVal) => {
handleGoMounted()
},
{ deep: true }
);
//
const handleGetData = async () => {
const req: any = {
StartDate: '2025-01-01',
EndDate: '2025-01-01',
provinceCode: "340000"
}
const data = await handleGetPatrolAnalysis(req)
console.log('业态结构占比', data)
dailyDetailObj.value = data
let res: any = {
// category: category,// x
seriesData: [data.CompleteRate, 100 - data.CompleteRate],// y
// realData: realData//
}
return res
}
const resizeChart = () => {
myChart?.resize();
};
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart);
myChart?.dispose();
});
</script>
<template>
<div class="DailyInspectionBox">
<SmallTitle title="日常巡检" />
<div class="DailyInspectionContent">
<div class="DailyInspectionCharts" id="DailyInspectionCharts"></div>
<div class="DailyInspectionRightBox">
<div class="DailyInspectionRightBoxTop">达标率/全省(%)</div>
<div class="DailyInspectionRightBoxBottom">
<div class="DailyInspectionRightBoxBottomItem">
<div class="DailyInspectionRightBoxBottomItemValue">{{ dailyDetailObj?.RectifyCount || '-' }}
</div>
<div class="DailyInspectionRightBoxBottomItemLabel">已整改</div>
</div>
<div class="DailyInspectionRightBoxBottomItem">
<div class="DailyInspectionRightBoxBottomItemValue">{{ dailyDetailObj?.UnRectifyCount || '-' }}
</div>
<div class="DailyInspectionRightBoxBottomItemLabel">未整改()</div>
</div>
</div>
</div>
</div>
</div>
</template>

View File

@ -0,0 +1,13 @@
.DetailedPaymentBox {
width: 100%;
.DetailedPaymentCharts {
width: 100%;
margin-top: 15px;
.DetailedPayment {
width: 100%;
height: 145px;
}
}
}

View File

@ -0,0 +1,166 @@
<script setup lang="ts">
import SmallTitle from '../smallTitle/smallTitle.vue'
import './DetailedPayment.less'
import { onMounted, onBeforeUnmount } from 'vue';
import * as echarts from 'echarts/core';
import { RadarChart } from 'echarts/charts';
import {
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent
} from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers';
import moment from 'moment';
import { handleGetBusinessTradeRevenue, handleGetProjectYearlyArrearageList, handleGetSPBayonetList } from '../../service';
//
echarts.use([
RadarChart,
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent,
CanvasRenderer
]);
let myChart: echarts.ECharts;
onMounted(async () => {
const res: any = await handleGetSectionFlowCount()
const chartDom = document.getElementById('DetailedPayment');
if (!chartDom) return;
myChart = echarts.init(chartDom);
const option = {
// tooltip: { // tooltip
// trigger: 'item',
// formatter: function (params: any) {
// return `
// <div style="font-weight:bold">${params.name}</div>
// `;
// }
// },
radar: {
indicator: res.category,
shape: 'circle',
splitNumber: 5,
radius: '60%', //
center: ['50%', '60%'], // 2.
axisName: {
color: 'rgb(255, 255, 255)',
padding: 10
},
splitLine: {
lineStyle: {
color: [
'rgba(25, 46, 76, 1)',
'rgba(25, 46, 76, 1)',
'rgba(25, 46, 76, 1)',
'rgba(25, 46, 76, 1)',
'rgba(25, 46, 76, 1)',
'rgba(25, 46, 76, 1)',
]
}
},
splitArea: {
show: false
},
axisLine: {
lineStyle: {
color: 'rgba(25, 46, 76, 1)',
}
}
},
series: [
{
type: 'radar',
lineStyle: {
width: 1,
opacity: 0.5
},
data: res.seriesData,
symbol: 'none',
itemStyle: {
color: '#0289ED'
},
areaStyle: {
opacity: 0.1
}
}
]
};
myChart.setOption(option);
myChart.resize();
window.addEventListener('resize', resizeChart);
})
//
const handleGetSectionFlowCount = async () => {
const req: any = {
}
const data = await handleGetProjectYearlyArrearageList(req)
console.log('datadatadatadatadatadata', data);
let category: any = []
let seriesData: any = []
let realData: any = []
let list: any = data.ProjectCompleteDetailList
let max: number = 0
if (list && list.length > 0) {
list.forEach((item: any) => {
let prent: number = Number(((item.Account_Amount > 0 ? item.Payment_Amount / item.Account_Amount : 0) * 100).toFixed(2))
if (prent > max) {
max = prent
}
category.push({ name: item.Account_Name, max: max })
seriesData.push(prent)
// realData.push(item.data)
})
}
let res: any = {
category: category,// x
seriesData: seriesData,// y
realData: realData//
}
return res
}
const resizeChart = () => {
myChart?.resize();
};
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart);
myChart?.dispose();
});
</script>
<template>
<div class="DetailedPaymentBox">
<SmallTitle :title="`年详细款项完成进度`"></SmallTitle>
<div class="DetailedPaymentCharts">
<!-- <div class="DetailedPaymentUnit">万元</div> -->
<div class="DetailedPaymentChartsContent">
<div class="DetailedPayment" id="DetailedPayment"></div>
</div>
</div>
</div>
</template>

View File

@ -1,10 +1,11 @@
.FestivalRevenueBox { .FestivalRevenueBox {
width: 100%; width: 100%;
height: 250px; // height: 250px;
box-sizing: border-box; box-sizing: border-box;
padding: 20px 11px 0;
// padding: 35px 20px 40px; // 老的 // padding: 35px 20px 40px; // 老的
padding: 20px 10px 30px; // padding: 20px 10px 30px;
background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%); // background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
// backdrop-filter: blur(10px); // backdrop-filter: blur(10px);
/* 高斯模糊效果 */ /* 高斯模糊效果 */
// -webkit-backdrop-filter: blur(10px); // -webkit-backdrop-filter: blur(10px);
@ -12,6 +13,6 @@
.FestivalRevenue { .FestivalRevenue {
width: 100%; width: 100%;
height: 100%; height: 190px;
} }
} }

View File

@ -10,7 +10,7 @@ import {
} from 'echarts/components'; } from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers'; import { CanvasRenderer } from 'echarts/renderers';
import { onBeforeUnmount, onMounted, watch } from 'vue'; import { onBeforeUnmount, onMounted, watch } from 'vue';
import { handleGetHolidayAnalysis } from '../../service'; import { handleGetHolidayAnalysis, handleGetHolidayDailyAnalysis } from '../../service';
import moment from 'moment'; import moment from 'moment';
// //
@ -70,8 +70,7 @@ const handleGoMounted = async () => {
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
name: '营收', name: '万元',
splitLine: { show: false }, splitLine: { show: false },
axisLine: { axisLine: {
show: true, show: true,
@ -81,7 +80,7 @@ const handleGoMounted = async () => {
left: '10', // left: '10', //
right: '10', // right: '10', //
bottom: '10', bottom: '10',
top: '10', top: '30',
containLabel: true containLabel: true
}, },
series: [ series: [
@ -119,8 +118,8 @@ const handleGoMounted = async () => {
}, },
formatter: function (params: any) { formatter: function (params: any) {
console.log('djidasjd', params); console.log('djidasjd', params);
let str1: string = `${params[0].seriesName}(${res.category[params[0].dataIndex]})${params[0].value}` let str1: string = `${params[0].seriesName}(${res.currentDateList[params[0].dataIndex]})${res.currentYearReal[params[0].dataIndex].toLocaleString()}`
let str2: string = `${params[1].seriesName}(${res.category[params[0].dataIndex]})${params[1].value}` let str2: string = `${params[1].seriesName}(${res.lastYearDateList[params[0].dataIndex]})${res.lastYearReal[params[1].dataIndex].toLocaleString()}`
return `<div> return `<div>
<div>${str1}</div> <div>${str1}</div>
@ -139,11 +138,16 @@ const handleGoMounted = async () => {
// //
const handleGetData = async () => { const handleGetData = async () => {
let category: any = ["4.29", "4.30", "5.01", "5.2", "5.3", "5.4"] let category: any = []
let currentYear: any = [50, 40, 36, 85, 46, 77] // "4.29", "4.30", "5.01", "5.2", "5.3", "5.4"
let lastYear: any = [33, 23, 56, 12, 45, 44] // let currentYear: any = [50, 40, 36, 85, 46, 77]
// let currentYear: any = [] // let lastYear: any = [33, 23, 56, 12, 45, 44]
// let lastYear: any = [] let currentYear: any = []
let currentYearReal: any = []
let currentDateList: any = []
let lastYear: any = []
let lastYearReal: any = []
let lastYearDateList: any = []
const req: any = { const req: any = {
// pushProvinceCode: 530000, // pushProvinceCode: 530000,
@ -154,17 +158,30 @@ const handleGetData = async () => {
StatisticsDate: moment().subtract(1, 'd').format('YYYY-MM-DD'), StatisticsDate: moment().subtract(1, 'd').format('YYYY-MM-DD'),
ServerpartId: props.currentService?.SERVERPART_ID || "", ServerpartId: props.currentService?.SERVERPART_ID || "",
} }
const data = await handleGetHolidayAnalysis(req) const data = await handleGetHolidayDailyAnalysis(req)
console.log('dsijdasijdaiosd', data) console.log('dsijdasijdaiosd', data)
if (data.curYearSelfRevenue) { if (data && data.length > 0) {
data.forEach((item: any) => {
if (item.name !== '累计') {
category.push(`${item.name}`)
currentYear.push(Number(item.value) / 10000)
currentYearReal.push(Number(item.value))
lastYear.push(Number(item.data) / 10000)
lastYearReal.push(Number(item.data))
currentDateList.push(item.date.split(',')[0])
lastYearDateList.push(item.date.split(',')[1])
}
})
} }
let res: any = { let res: any = {
category: category,// x category: category,// x
currentYear: currentYear,// y currentYear: currentYear,// y
lastYear: lastYear lastYear: lastYear,
currentYearReal: currentYearReal,
lastYearReal: lastYearReal,
currentDateList: currentDateList,
lastYearDateList: lastYearDateList,
} }
return res return res
} }

View File

@ -1,12 +1,15 @@
.GenderCustomerGroupBox { .GenderCustomerGroupBox {
width: 25%; width: calc((100% - 28px) / 3);
display: inline-block; display: inline-block;
height: 210px; height: 210px;
.GenderCustomerGroupCharts { .GenderCustomerGroupCharts {
width: 100%; width: 100%;
height: 182px; height: 182px;
background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%); // background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
background-image: url('../../../../assets/image/smallModalBg.png');
background-repeat: no-repeat;
background-size: 100% 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 20px 64px 18px; padding: 20px 64px 18px;
@ -47,6 +50,7 @@
flex-direction: column; flex-direction: column;
align-items: center; align-items: center;
justify-content: center; justify-content: center;
.legendIcon { .legendIcon {
width: 14px; width: 14px;
height: 14px; height: 14px;

View File

@ -4,7 +4,7 @@
.HotProductListCharts { .HotProductListCharts {
width: 100%; width: 100%;
height: 366px; height: 196px;
box-sizing: border-box; box-sizing: border-box;
padding: 10px 10px 0; padding: 10px 10px 0;

View File

@ -1,5 +1,7 @@
.MultiIndustryIncomeBox { .MultiIndustryIncomeBox {
width: 100%; width: 100%;
box-sizing: border-box;
padding: 3px 0 0 10px;
.MultiIndustryIncomeCharts { .MultiIndustryIncomeCharts {
width: 100%; width: 100%;
@ -17,7 +19,7 @@
.MultiIndustryIncome { .MultiIndustryIncome {
width: 100%; width: 100%;
height: 194px; height: 134px;
} }
.YOYBox, .YOYBox,

View File

@ -48,13 +48,14 @@ const handleGoMounted = async () => {
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
name: "万元",
splitLine: { show: false } // 线 splitLine: { show: false } // 线
}, },
grid: { grid: {
left: '0', // left: '0', //
right: '0', // right: '0', //
bottom: '0', // bottom: '0', //
top: '10', // top: '30', //
containLabel: true // grid containLabel: true // grid
}, },
series: [ series: [
@ -63,23 +64,17 @@ const handleGoMounted = async () => {
realData: res.realData, realData: res.realData,
type: 'bar', type: 'bar',
smooth: true, smooth: true,
showBackground: true,
barWidth: '6', barWidth: '6',
backgroundStyle: { backgroundStyle: {
borderRadius: [4, 4, 0, 0], borderRadius: [4, 4, 0, 0],
color: 'rgba(23, 42, 70, 1)' // color: 'rgba(23, 42, 70, 1)'
color: 'rgba(0, 148, 255, 0.1)'
}, },
itemStyle: { itemStyle: {
borderRadius: [4, 4, 0, 0], borderRadius: [4, 4, 0, 0],
// //
color: function (params: any) { color: '#69BCFF'
return new echarts.graphic.LinearGradient(
0, 0, 0, 1,
[
{ offset: 0, color: '#018FFF' }, //
{ offset: 1, color: '#00F4FF' } //
]
);
}
} }
} }
], ],
@ -144,7 +139,7 @@ const handleGetSectionFlowCount = async () => {
if (list && list.length > 0) { if (list && list.length > 0) {
list.forEach((item: any) => { list.forEach((item: any) => {
category.push(item.name) category.push(item.name)
seriesData.push(Number(item.value)) seriesData.push(Number(item.value) / 10000)
realData.push(item.data) realData.push(item.data)
}) })
} }

View File

@ -21,7 +21,7 @@
.PassengerFlowChanges { .PassengerFlowChanges {
width: 100%; width: 100%;
height: 134px; height: 140px;
} }
} }
} }

View File

@ -1,7 +1,7 @@
<script setup lang="ts"> <script setup lang="ts">
import SmallTitle from '../smallTitle/smallTitle.vue' import SmallTitle from '../smallTitle/smallTitle.vue'
import './PassengerFlowChanges.less' import './PassengerFlowChanges.less'
import { onMounted, onBeforeUnmount, watch } from 'vue'; import { onMounted, onBeforeUnmount, watch, ref } from 'vue';
import * as echarts from 'echarts/core'; import * as echarts from 'echarts/core';
import { LineChart } from 'echarts/charts'; import { LineChart } from 'echarts/charts';
import { import {
@ -25,6 +25,8 @@ echarts.use([
]); ]);
let myChart: echarts.ECharts; let myChart: echarts.ECharts;
//
let searchTime = ref<string>()
onMounted(async () => { onMounted(async () => {
await handleGoMounted() await handleGoMounted()
@ -57,7 +59,7 @@ const handleGoMounted = async () => {
xAxis: { xAxis: {
type: 'category', type: 'category',
data: res.category, data: res.category,
boundaryGap: true, // boundaryGap: true,
axisLabel: { axisLabel: {
interval: 3, interval: 3,
showMinLabel: true, showMinLabel: true,
@ -68,39 +70,39 @@ const handleGoMounted = async () => {
{ {
type: 'value', type: 'value',
name: '车流量', name: '车流量',
nameTextStyle: {
color: '#00FFFF' // Y
},
splitLine: { show: false }, splitLine: { show: false },
axisLine: { axisLine: {
show: true, show: true,
lineStyle: { lineStyle: {
color: '#00FFFF' color: '#FFFFFF'
} }
}, },
axisLabel: { axisLabel: {
color: '#00FFFF',
formatter: '{value}' // formatter: '{value}' //
},
nameTextStyle: {
color: '#666',
padding: [0, 0, 0, 30] //
} }
}, },
{ {
type: 'value', type: 'value',
name: '客单量', name: '客单量',
nameTextStyle: {
color: '#FFA500' // Y
},
splitLine: { show: false }, splitLine: { show: false },
position: 'right', position: 'right',
axisLine: { axisLine: {
show: true, show: true,
lineStyle: { lineStyle: {
color: '#FFA500' color: '#FFFFFF'
} }
}, },
axisLabel: { axisLabel: {
color: '#FFA500',
formatter: '{value}' // formatter: '{value}' //
}, },
nameTextStyle: {
color: '#666',
padding: [0, 0, 0, 30] //
},
offset: 0 // Y offset: 0 // Y
} }
], ],
@ -108,7 +110,7 @@ const handleGoMounted = async () => {
left: '10', // left: '10', //
right: '10', // right: '10', //
bottom: '10', bottom: '10',
top: '10', top: '30',
containLabel: true containLabel: true
}, },
series: [ series: [
@ -120,7 +122,7 @@ const handleGoMounted = async () => {
symbolSize: 6 symbolSize: 6
})), })),
type: 'line', type: 'line',
smooth: true, // smooth: true,
lineStyle: { lineStyle: {
width: 2, width: 2,
color: '#00FFFF' color: '#00FFFF'
@ -138,7 +140,7 @@ const handleGoMounted = async () => {
symbolSize: 6 symbolSize: 6
})), })),
type: 'line', type: 'line',
smooth: true, // smooth: true,
lineStyle: { lineStyle: {
width: 2, width: 2,
color: '#FFA500' // color: '#FFA500' //
@ -182,8 +184,11 @@ const handleGetData = async () => {
TimeSpan: 1 TimeSpan: 1
} }
searchTime.value = moment(req.Statistics_Date).format('MM')
const data = await handleGetTransactionConvert(req) const data = await handleGetTransactionConvert(req)
console.log('fhdusyfusahfjsdh', data);
// //
let customerOrder = data.TransactionList let customerOrder = data.TransactionList
@ -222,6 +227,10 @@ const handleGetData = async () => {
customerOrderRealList: customerOrderRealList customerOrderRealList: customerOrderRealList
// realData: realData// // realData: realData//
} }
console.log('fjioadhgasdhnfjks', res);
return res return res
@ -262,13 +271,14 @@ onBeforeUnmount(() => {
<template> <template>
<div class="PassengerFlowChangesBox"> <div class="PassengerFlowChangesBox">
<SmallTitle :title="'客流变化'"></SmallTitle> <SmallTitle :title="`客流变化${searchTime ? `(${searchTime}月)` : ''}`"></SmallTitle>
<div class="PassengerFlowChangesCharts"> <div class="PassengerFlowChangesCharts" style="margin-top:15px">
<div class="PassengerFlowChangesUnit" style="display: flex;align-items: center;justify-content: space-between;"> <!-- <div class="PassengerFlowChangesUnit"
<span></span> style="width: 100%;display: flex;align-items: center;justify-content: space-between;">
<span></span> <span></span>
</div> <span></span>
</div> -->
<div class="PassengerFlowChanges" id="PassengerFlowChanges"></div> <div class="PassengerFlowChanges" id="PassengerFlowChanges"></div>
</div> </div>
</div> </div>

View File

@ -98,7 +98,7 @@
width: 100%; width: 100%;
margin-top: 30px; margin-top: 30px;
box-sizing: border-box; box-sizing: border-box;
padding: 0 30px; padding: 0 0 0 30px;
display: flex; display: flex;
align-items: center; align-items: center;
@ -109,7 +109,7 @@
} }
.progressPieRight { .progressPieRight {
flex: 1; width: calc(100% - 172px);
.progressPieItem { .progressPieItem {
width: 100%; width: 100%;
@ -135,6 +135,7 @@
color: #FFFFFF; color: #FFFFFF;
text-align: left; text-align: left;
font-style: normal; font-style: normal;
white-space: nowrap;
} }
} }

View File

@ -1,12 +1,17 @@
.PreferenceTypeBox { .PreferenceTypeBox {
width: 25%; // width: 50%;
width: calc((100% - 28px) / 3 * 2);
display: inline-block; display: inline-block;
height: 210px; height: 210px;
.PreferenceTypeCharts { .PreferenceTypeCharts {
width: 100%; width: 100%;
height: 182px; height: 182px;
background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%); // background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
background-image: url('../../../../assets/image/smallModalBg.png');
background-repeat: no-repeat;
background-size: 100% 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 11px 20px 16px; padding: 11px 20px 16px;

View File

@ -49,7 +49,8 @@ onMounted(async () => {
indicator: res.category, indicator: res.category,
shape: 'circle', shape: 'circle',
splitNumber: 5, splitNumber: 5,
radius: '70%', // radius: '60%', //
center: ['50%', '60%'], // 2.
axisName: { axisName: {
color: 'rgb(255, 255, 255)', color: 'rgb(255, 255, 255)',
padding: 10 padding: 10

View File

@ -1,15 +1,61 @@
.RegionalRevenueBox { .RegionalRevenueBox {
width: 100%; width: 100%;
box-sizing: border-box;
padding: 3px 0 0 10px;
.RegionalRevenueSelect {
display: flex;
align-items: center;
.RegionalRevenueItem {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 13px;
color: rgba(255, 255, 255, 0.5);
text-align: center;
font-style: normal;
padding: 2px 5px 4px 6px;
border: 1px solid rgba(255, 255, 255, 0.5);
cursor: pointer;
}
.RegionalRevenueItemLeft {
border-radius: 4px 0px 0px 4px;
}
.RegionalRevenueItemRight {
border-radius: 0px 4px 4px 0px;
}
.selectRegionalRevenueItem {
border-color: #2366D8;
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 13px;
color: #2366D8;
text-align: center;
font-style: normal;
padding: 2px 5px 4px 6px;
}
}
.RegionalRevenueCharts { .RegionalRevenueCharts {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 30px; // padding: 30px;
padding: 25px 26px 20px 31px;
display: flex; display: flex;
align-items: center; align-items: center;
.RegionalRevenueChartsContent { .RegionalRevenueChartsContent {
width: 100%; width: 100%;
height: 132px;
display: flex; display: flex;
align-items: center; align-items: center;
@ -19,7 +65,8 @@
} }
.RegionalRevenueDataBoxList { .RegionalRevenueDataBoxList {
flex: 1; display: inline-block;
width: calc(100% - 162px);
margin-left: 30px; margin-left: 30px;
.RegionalRevenueDataBox { .RegionalRevenueDataBox {

View File

@ -31,6 +31,10 @@ let allServiceId: string = '1143,1144,1186,1188,1189,1190,1191,1192,1193,979,999
// //
let lengedList = ref<any>([]) let lengedList = ref<any>([])
// 1 2
let selectDataType = ref<number>(1)
//
let showCharts = ref<boolean>(true)
onMounted(async () => { onMounted(async () => {
@ -102,12 +106,14 @@ const handleGoMounted = async () => {
// //
const handleGetData = async () => { const handleGetData = async () => {
const req: any = { const req: any = {
DataType: 1, DataType: selectDataType.value,
ServerpartIds: props.currentService?.SERVERPART_ID || allServiceId, ServerpartIds: props.currentService?.SERVERPART_ID || allServiceId,
DataSourceType: 1, DataSourceType: 1,
} }
const data = await handleGetRevenueReport(req) const data = await handleGetRevenueReport(req)
showCharts.value = true
let category: string[] = [] let category: string[] = []
let seriesData: number[] = [] let seriesData: number[] = []
let realData: number[] = [] let realData: number[] = []
@ -141,6 +147,13 @@ const handleGetData = async () => {
return res return res
} }
//
const handleChangeDataType = async (value: number) => {
showCharts.value = false
selectDataType.value = value
await handleGoMounted()
}
const resizeChart = () => { const resizeChart = () => {
myChart?.resize(); myChart?.resize();
@ -158,19 +171,32 @@ onBeforeUnmount(() => {
<template> <template>
<div class="RegionalRevenueBox"> <div class="RegionalRevenueBox">
<SmallTitle :title="'区域营收占比'"></SmallTitle> <SmallTitle :title="'区域营收占比'">
<template #extra>
<div class="RegionalRevenueSelect">
<div :class="selectDataType === 1 ? 'RegionalRevenueItem RegionalRevenueItemLeft selectRegionalRevenueItem' : 'RegionalRevenueItem RegionalRevenueItemLeft'"
@click="handleChangeDataType(1)">
</div>
<div :class="selectDataType === 2 ? 'RegionalRevenueItem RegionalRevenueItemRight selectRegionalRevenueItem' : 'RegionalRevenueItem RegionalRevenueItemRight'"
@click="handleChangeDataType(2)">
</div>
</div>
</template>
</SmallTitle>
<div class="RegionalRevenueCharts"> <div class="RegionalRevenueCharts">
<!-- <div class="RegionalRevenueUnit">万元</div> --> <!-- <div class="RegionalRevenueUnit">万元</div> -->
<div class="RegionalRevenueChartsContent"> <div class="RegionalRevenueChartsContent">
<div class="RegionalRevenue" id="RegionalRevenue"></div> <div class="RegionalRevenue" id="RegionalRevenue" v-if="showCharts"></div>
<template v-if="showCharts">
<div class="RegionalRevenueDataBoxList" v-if="lengedList && lengedList.length > 0"> <div class="RegionalRevenueDataBoxList" v-if="lengedList && lengedList.length > 0">
<div class="RegionalRevenueDataBox" v-for="(item, index) in lengedList" :key="index"> <div class="RegionalRevenueDataBox" v-for="(item, index) in lengedList" :key="index">
<div class="RegionalRevenueDataLeftBox"> <div class="RegionalRevenueDataLeftBox">
<div class="RegionalRevenueItem"> <div class="RegionalRevenueItem">
<div class="RegionalRevenueItemLeged" :style="{ background: colorList[index] }"></div> <div class="RegionalRevenueItemLeged" :style="{ background: colorList[index] }">
</div>
<div class="RegionalRevenueItemLabel">{{ item.name }}</div> <div class="RegionalRevenueItemLabel">{{ item.name }}</div>
<div class="RegionalRevenueItemValue">{{ item.value }}</div> <div class="RegionalRevenueItemValue">{{ item.value }}</div>
<div class="RegionalRevenueItemUnit"></div> <div class="RegionalRevenueItemUnit"></div>
@ -187,6 +213,8 @@ onBeforeUnmount(() => {
</div> --> </div> -->
</div> </div>
</div> </div>
</template>
</div> </div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,175 @@
.SignedClientsBox {
width: 100%;
box-sizing: border-box;
padding: 10px 15px;
background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
border-bottom: 1px solid rgba(0, 148, 255, 0.50);
.SignedClientsBigItem {
width: 100%;
box-sizing: border-box;
padding: 0 5px 10px;
display: flex;
align-items: center;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
.SignedClientsBigLeft {
width: 46px;
height: 46px;
margin-right: 10px;
.SignedClientsBigLeftImg {
width: 46px;
height: 46px;
}
}
.SignedClientsBigRight {
width: calc(100% - 56px);
display: flex;
align-items: center;
justify-content: space-between;
.SignedClientsBigRightLeft {
.SignedClientsBigRightLabel {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 14px;
color: #FFFFFF;
text-align: left;
font-style: normal;
}
.SignedClientsBigRightText {
.SignedClientsBigRightSmallLabel {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #7E858A;
text-align: left;
font-style: normal;
}
.SignedClientsBigRightValue {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #00F6FF;
text-align: left;
font-style: normal;
margin-left: 5px;
}
}
}
.SignedClientsBigRightRight {
display: flex;
align-items: center;
.SignedClientsBigRightRightValue {
font-family: Impact, Impact;
font-weight: 400;
font-size: 25px;
color: #FFFFFF;
letter-spacing: 2px;
text-align: right;
font-style: normal;
margin-right: 10px;
}
.SignedClientsBigRightRightUnit {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #828689;
text-align: right;
font-style: normal;
}
}
}
}
.SignedClientsSmallItem {
width: 100%;
box-sizing: border-box;
padding: 0 5px 10px;
display: flex;
align-items: center;
border-bottom: 1px solid rgba(255, 255, 255, 0.05);
.SignedClientsSmallLeft {
width: 33px;
height: 33px;
margin-right: 17px;
}
.SignedClientsSmallRight {
width: calc(100% - 50px);
display: flex;
align-items: center;
justify-content: space-between;
.SignedClientsSmallRightLeft {
.SignedClientsSmallRightLeftTop {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 14px;
color: #FFFFFF;
text-align: left;
font-style: normal;
}
.SignedClientsSmallRightLeftBottom {
.SignedClientsSmallRightLeftBottomNormalText {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #7B858D;
text-align: left;
font-style: normal;
}
.SignedClientsSmallRightLeftBottomValue {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #7B858D;
text-align: left;
font-style: normal;
margin-left: 5px;
}
}
}
.SignedClientsSmallRightRight {
display: flex;
align-items: flex-end;
.SignedClientsSmallRightRightValue {
font-family: Impact, Impact;
font-weight: 400;
font-size: 25px;
color: #FFFFFF;
letter-spacing: 2px;
text-align: right;
font-style: normal;
}
.SignedClientsSmallRightRightUnit {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #7B858D;
text-align: right;
font-style: normal;
margin-left: 10px;
}
}
}
}
}

View File

@ -0,0 +1,225 @@
<script setup lang="ts">
import './SignedClients.less'
import SignedClientsIcon from '../../../../assets/image/SignedClientsIcon.png'
import { onBeforeUnmount, onMounted, ref } from 'vue';
import { handleGetProjectSummaryInfo } from '../../service';
import * as echarts from 'echarts/core';
import { PieChart } from 'echarts/charts';
import {
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent
} from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers';
//
echarts.use([
PieChart,
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent,
CanvasRenderer
]);
let myChart: echarts.ECharts;
let myChart2: echarts.ECharts;
//
let realDataObj = ref<any>()
//
let shareRevenue = ref<any>()
//
let FixedRent = ref<any>()
onMounted(async () => {
await handleGetData()
})
//
const handleGetData = async () => {
const req: any = {
ProvinceCode: '340000'
}
const data = await handleGetProjectSummaryInfo(req)
console.log('handleGetDatahandleGetDatahandleGetDatahandleGetData', data);
realDataObj.value = data
shareRevenue.value = data.BusinessTypeSummaryList[0]
FixedRent.value = data.BusinessTypeSummaryList[1]
const chartDom = document.getElementById('SignedClients1');
if (!chartDom) return;
myChart = echarts.init(chartDom);
const chartDom2 = document.getElementById('SignedClients2');
if (!chartDom) return;
myChart2 = echarts.init(chartDom2);
const option1 = {
series: [
{
name: 'Access From',
type: 'pie',
radius: ['80%', '100%'],
center: ['50%', '50%'], // [, ]
avoidLabelOverlap: false,
label: {
show: false
},
emphasis: false,
labelLine: {
show: false
},
itemStyle: {
color: function (params: any) {
//
return params.dataIndex === 0 ? '#FF9500' : '#634B24';
}
},
data: [((shareRevenue?.value.ArrearageMerchant_Count / realDataObj?.value.Contract_SignCount) * 100), 100 - ((shareRevenue?.value.ArrearageMerchant_Count / realDataObj?.value.Contract_SignCount) * 100)]
}
]
};
const option2 = {
series: [
{
name: 'Access From',
type: 'pie',
radius: ['80%', '100%'],
center: ['50%', '50%'], // [, ]
avoidLabelOverlap: false,
label: {
show: false
},
emphasis: false,
labelLine: {
show: false
},
itemStyle: {
color: function (params: any) {
//
return params.dataIndex === 0 ? '#FF9500' : '#634B24';
}
},
data: [((FixedRent?.value.ArrearageMerchant_Count / realDataObj?.value.Contract_SignCount) * 100), 100 - ((FixedRent?.value.ArrearageMerchant_Count / realDataObj?.value.Contract_SignCount) * 100)]
}
]
};
myChart.setOption(option1);
myChart.resize();
myChart2.setOption(option2);
myChart2.resize();
window.addEventListener('resize', resizeChart);
}
const resizeChart = () => {
myChart?.resize();
myChart2?.resize();
};
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart);
myChart?.dispose();
myChart2?.dispose();
});
</script>
<template>
<div class="SignedClientsBox">
<div class="SignedClientsBigItem">
<div class="SignedClientsBigLeft">
<img :src="SignedClientsIcon" class="SignedClientsBigLeftImg" />
</div>
<div class="SignedClientsBigRight">
<div class="SignedClientsBigRightLeft">
<div class="SignedClientsBigRightLabel">签约客户</div>
<div class="SignedClientsBigRightText">
<span class="SignedClientsBigRightSmallLabel">欠款商户</span>
<span class="SignedClientsBigRightValue" style="color: #FF9500;">{{
realDataObj?.ArrearageMerchant_Count || ''
}}</span>
</div>
</div>
<div class="SignedClientsBigRightRight">
<div class="SignedClientsBigRightRightValue">{{ realDataObj?.ArrearageMerchant_Count || '' }}
</div>
<div class="SignedClientsBigRightRightUnit"></div>
</div>
</div>
</div>
<div class="SignedClientsSmallItem">
<div class="SignedClientsSmallLeft" id="SignedClients1"></div>
<div class="SignedClientsSmallRight">
<div class="SignedClientsSmallRightLeft">
<div class="SignedClientsSmallRightLeftTop">合作分成</div>
<div class="SignedClientsSmallRightLeftBottom">
<span class="SignedClientsSmallRightLeftBottomNormalText">欠款商户</span>
<span class="SignedClientsSmallRightLeftBottomValue">{{
shareRevenue?.ArrearageMerchant_Count
|| "" }}</span>
<span class="SignedClientsSmallRightLeftBottomNormalText" style="margin-left: 10px;">欠款占比</span>
<span class="SignedClientsSmallRightLeftBottomValue">
{{ realDataObj?.ArrearageMerchant_Count ? ((shareRevenue?.ArrearageMerchant_Count /
realDataObj?.ArrearageMerchant_Count) * 100).toFixed(2) + '%' : '-' }}
</span>
</div>
</div>
<div class="SignedClientsSmallRightRight">
<div class="SignedClientsSmallRightRightValue">{{ shareRevenue?.ArrearageMerchant_Count || '' }}
</div>
<div class="SignedClientsSmallRightRightUnit"></div>
</div>
</div>
</div>
<div class="SignedClientsSmallItem" style="border-bottom: none;padding-bottom: 0;">
<div class="SignedClientsSmallLeft" id="SignedClients2"></div>
<div class="SignedClientsSmallRight">
<div class="SignedClientsSmallRightLeft">
<div class="SignedClientsSmallRightLeftTop">固定租金</div>
<div class="SignedClientsSmallRightLeftBottom">
<span class="SignedClientsSmallRightLeftBottomNormalText">欠款商户</span>
<span class="SignedClientsSmallRightLeftBottomValue">{{ FixedRent?.ArrearageMerchant_Count
|| "" }}</span>
<span class="SignedClientsSmallRightLeftBottomNormalText" style="margin-left: 10px;">欠款占比</span>
<span class="SignedClientsSmallRightLeftBottomValue">
{{ realDataObj?.ArrearageMerchant_Count ? ((FixedRent?.ArrearageMerchant_Count /
realDataObj?.ArrearageMerchant_Count) * 100).toFixed(2) + '%' : '-' }}
</span>
</div>
</div>
<div class="SignedClientsSmallRightRight">
<div class="SignedClientsSmallRightRightValue">{{ FixedRent?.ArrearageMerchant_Count || '' }}
</div>
<div class="SignedClientsSmallRightRightUnit"></div>
</div>
</div>
</div>
</div>
</template>

View File

@ -1,7 +1,7 @@
.TodayTrendBox { .TodayTrendBox {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 20px 20px 0; // padding: 20px 20px 0;
.TodayTrendUnit { .TodayTrendUnit {
width: 100%; width: 100%;
@ -21,6 +21,7 @@
.TodayTrendContent { .TodayTrendContent {
width: 100%; width: 100%;
margin-top: 15px;
.TodayTrend { .TodayTrend {
width: 100%; width: 100%;

View File

@ -45,161 +45,162 @@ let myChart: echarts.ECharts;
onMounted(async () => { onMounted(async () => {
handleGetOnlineData() // handleGetOnlineData()
// const res: any = await handleGetData() const res: any = await handleGetData()
// const chartDom = document.getElementById('TodayTrend'); const chartDom = document.getElementById('TodayTrend');
// if (!chartDom) return; if (!chartDom) return;
// myChart = echarts.init(chartDom); myChart = echarts.init(chartDom);
// const option = { const option = {
// xAxis: { xAxis: {
// type: 'category', type: 'category',
// data: res.category, data: res.category,
// // boundaryGap: true, // boundaryGap: true,
// axisLabel: { axisLabel: {
// interval: 3, interval: 3,
// showMinLabel: true, showMinLabel: true,
// showMaxLabel: true showMaxLabel: true
// } },
// }, axisLine: {
// yAxis: [ show: true,
// { lineStyle: {
// type: 'value', color: '#fff'
// name: '', }
// nameTextStyle: { },
// color: '#00FFFF' axisTick: {
// }, alignWithLabel: true // 线
// splitLine: { show: false }, }
// axisLine: { },
// show: true, yAxis: [
// lineStyle: { {
// color: '#00FFFF' type: 'value',
// } name: '营收',
// }, nameTextStyle: {
// axisLabel: { color: '#fff'
// color: '#00FFFF', },
// formatter: '{value}' splitLine: { show: false },
// } axisLine: {
// }, show: true,
// { lineStyle: {
// type: 'value', color: '#fff'
// name: '', }
// nameTextStyle: { }
// color: '#FFA500' },
// }, {
// splitLine: { show: false }, type: 'value',
// position: 'right', name: '客单',
// axisLine: { nameTextStyle: {
// show: true, color: '#fff'
// lineStyle: { },
// color: '#FFA500' splitLine: { show: false },
// } position: 'right',
// }, axisLine: {
// axisLabel: { show: true,
// color: '#FFA500', lineStyle: {
// formatter: '{value}' color: '#fff'
// }, }
// offset: 0 },
// } offset: 0
// ], }
// grid: { ],
// left: '10', grid: {
// right: '10', left: '10',
// bottom: '10', right: '10',
// top: '10', bottom: '10',
// containLabel: true top: '10',
// }, containLabel: true
// series: [ },
// { series: [
// name: '', {
// data: res.seriesData.map((value: any, index: any) => ({ name: '营收',
// value: value, data: res.seriesData.map((value: any, index: any) => ({
// symbol: index % 3 === 0 ? 'circle' : 'none', value: value,
// symbolSize: 6 symbol: index % 3 === 0 ? 'circle' : 'none',
// })), symbolSize: 6
// type: 'line', })),
// smooth: true, type: 'line',
// lineStyle: { smooth: true,
// width: 2, lineStyle: {
// color: '#00FFFF' width: 2,
// }, color: '#00FFFF'
// itemStyle: { },
// color: '#00FFFF' itemStyle: {
// }, color: '#00FFFF'
// areaStyle: { },
// color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ areaStyle: {
// { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
// offset: 0, {
// color: 'rgba(0, 255, 255, 0.3)' offset: 0,
// }, color: 'rgba(0, 255, 255, 0.3)'
// { },
// offset: 1, {
// color: 'rgba(0, 255, 255, 0.1)' offset: 1,
// } color: 'rgba(0, 255, 255, 0.1)'
// ]) }
// }, ])
// yAxisIndex: 0 },
// }, yAxisIndex: 0
// { },
// name: '', {
// data: res.seriesDataSecond.map((value: any, index: any) => ({ name: '客单',
// value: value, data: res.seriesDataSecond.map((value: any, index: any) => ({
// symbol: index % 3 === 0 ? 'circle' : 'none', value: value,
// symbolSize: 6 symbol: index % 3 === 0 ? 'circle' : 'none',
// })), symbolSize: 6
// type: 'line', })),
// smooth: true, type: 'line',
// lineStyle: { smooth: true,
// width: 2, lineStyle: {
// color: '#FFA500' width: 2,
// }, color: '#FFA500'
// itemStyle: { },
// color: '#FFA500' itemStyle: {
// }, color: '#FFA500'
// areaStyle: { },
// color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [ areaStyle: {
// { color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
// offset: 0, {
// color: 'rgba(255, 165, 0, 0.3)' offset: 0,
// }, color: 'rgba(255, 165, 0, 0.3)'
// { },
// offset: 1, {
// color: 'rgba(255, 165, 0, 0.1)' offset: 1,
// } color: 'rgba(255, 165, 0, 0.1)'
// ]) }
// }, ])
// yAxisIndex: 1 },
// } yAxisIndex: 1
// ], }
// tooltip: { ],
// trigger: 'axis', tooltip: {
// axisPointer: { trigger: 'axis',
// type: 'line', axisPointer: {
// snap: true, // type: 'line',
// lineStyle: { snap: true, //
// color: '#FFF', // 线 lineStyle: {
// width: 1 color: '#FFF', // 线
// } width: 1
// }, }
// formatter: function (params: any) { },
// let tip = `<div style="font-weight:bold">${params[0].name}</div>`; formatter: function (params: any) {
// params.forEach((param: any) => { let tip = `<div style="font-weight:bold">${params[0].name}</div>`;
// const unit = param.seriesName === '' ? '' : ''; params.forEach((param: any) => {
// let value = param.seriesName === '' ? res.seriesData[param.dataIndex] : res.seriesDataSecond[param.dataIndex] const unit = param.seriesName === '营收' ? '元' : '单';
// tip += `<div>${param.seriesName}: ${value ? value.toLocaleString() : ''}${unit}</div>`; let value = param.seriesName === '营收' ? res.seriesData[param.dataIndex] : res.seriesDataSecond[param.dataIndex]
// }); tip += `<div>${param.seriesName}: ${value ? value.toLocaleString() : ''}${unit}</div>`;
});
// return tip return tip
// } }
// } }
// }; };
// myChart.setOption(option); myChart.setOption(option);
// myChart.resize(); myChart.resize();
// window.addEventListener('resize', resizeChart); window.addEventListener('resize', resizeChart);
}) })
// //
@ -276,31 +277,31 @@ const handleGetOnlineData = async () => {
onlineCashRegisterValue.value = handleGetFiveNumber(res.MACHINECOUNT) onlineCashRegisterValue.value = handleGetFiveNumber(res.MACHINECOUNT)
} }
// const resizeChart = () => { const resizeChart = () => {
// myChart?.resize(); myChart?.resize();
// }; };
// onBeforeUnmount(() => { onBeforeUnmount(() => {
// window.removeEventListener('resize', resizeChart); window.removeEventListener('resize', resizeChart);
// myChart?.dispose(); myChart?.dispose();
// }); });
</script> </script>
<template> <template>
<div class="TodayTrendBox"> <div class="TodayTrendBox">
<!-- <SmallTitle :title="'今日走势图'"></SmallTitle> --> <SmallTitle :title="'今日走势图'" style="margin-top: 13px;"></SmallTitle>
<!-- <div class="TodayTrendUnit"> <!-- <div class="TodayTrendUnit">
<span></span> <span></span>
<span></span> <span></span>
</div> --> </div> -->
<!-- <div class="TodayTrendContent"> <div class="TodayTrendContent">
<div class="TodayTrend" id="TodayTrend"></div> <div class="TodayTrend" id="TodayTrend"></div>
</div> --> </div>
<div class="onlineServiceBox"> <!-- <div class="onlineServiceBox">
<div class="onlineServiceItem"> <div class="onlineServiceItem">
<div class="onlineServiceItemLeft"> <div class="onlineServiceItemLeft">
<img class="onlineServiceItemImg" :src="onlineService" /> <img class="onlineServiceItemImg" :src="onlineService" />
@ -334,8 +335,6 @@ const handleGetOnlineData = async () => {
</div> </div>
</div> </div>
</div> </div>
</div> -->
</div> </div>
</div>
</template> </template>

View File

@ -17,7 +17,7 @@
.TotalAccountsReceivable { .TotalAccountsReceivable {
width: 100%; width: 100%;
height: 243px; height: 162px;
} }
} }
} }

View File

@ -45,6 +45,13 @@ onMounted(async () => {
} }
} }
}, },
grid: {
left: '0', //
right: '0', //
bottom: '0',
top: '30',
containLabel: true
},
toolbox: { toolbox: {
feature: { feature: {
dataView: { show: true, readOnly: false }, dataView: { show: true, readOnly: false },

View File

@ -1,14 +1,14 @@
.TradingAlertBox { .TradingAlertBox {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 0 20px; // padding: 0 20px;
margin-top: 20px; // margin-top: 20px;
.TradingAlertListBox { .TradingAlertListBox {
width: 100%; width: 100%;
height: 240px; height: 120px;
margin-top: 8px; margin-top: 12px;
.TradingAlertItem { .TradingAlertItem {
width: 100%; width: 100%;

View File

@ -30,7 +30,7 @@ const handleGetData = async () => {
if (data && data.length > 0) { if (data && data.length > 0) {
let list = data.slice(0, 10) let list = data.slice(0, 5)
TradingAlertList.length = 0; TradingAlertList.length = 0;
list && list.forEach((item: any) => TradingAlertList.push(item)); list && list.forEach((item: any) => TradingAlertList.push(item));

View File

@ -21,7 +21,7 @@
.TrendOfTrafficFlow { .TrendOfTrafficFlow {
width: 100%; width: 100%;
height: 133px; height: 150px;
} }
} }
} }

View File

@ -70,8 +70,15 @@ const handleGoMounted = async () => {
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
name: "万辆", name: '万辆', //
splitLine: { show: false } // 线 nameTextStyle: {
color: '#666',
padding: [0, 30, 0, 0] //
},
axisLabel: {
formatter: '{value}' //
},
splitLine: { show: false }
}, },
series: [ series: [
{ {
@ -120,7 +127,7 @@ const handleGoMounted = async () => {
left: '0', // left: '0', //
right: '0', // right: '0', //
bottom: '0', // bottom: '0', //
top: '10', // top: '30', //
containLabel: true // grid containLabel: true // grid
}, },
tooltip: { // tooltip tooltip: { // tooltip
@ -193,7 +200,6 @@ onBeforeUnmount(() => {
<SmallTitle :title="`车流断面趋势(04月)`" /> <SmallTitle :title="`车流断面趋势(04月)`" />
<div class="TrendOfTrafficFlowCharts"> <div class="TrendOfTrafficFlowCharts">
<div class="trafficFlowCarUnit"></div>
<div class="TrendOfTrafficFlow" id="TrendOfTrafficFlow"></div> <div class="TrendOfTrafficFlow" id="TrendOfTrafficFlow"></div>
</div> </div>
</div> </div>

View File

@ -0,0 +1,27 @@
.VehicleModelStayBox {
width: 100%;
.VehicleModelStayCharts {
width: 100%;
margin-top: 10px;
position: relative;
.VehicleModelStayUnit {
font-family: "Microsoft YaHei";
font-weight: 400;
font-size: 10px;
color: #7F808B;
text-align: left;
font-style: normal;
padding-left: 8px;
position: absolute;
top: -10px;
left: 0;
}
.VehicleModelStay {
width: 100%;
height: 150px;
}
}
}

View File

@ -0,0 +1,247 @@
<script setup lang="ts">
import SmallTitle from '../smallTitle/smallTitle.vue'
import './VehicleModelStay.less'
import { onMounted, onBeforeUnmount, watch, ref } from 'vue';
import * as echarts from 'echarts/core';
import { LineChart } from 'echarts/charts';
import {
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent
} from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers';
import moment from 'moment';
import { handleGetBayonetSTAnalysis, handleGetTransactionConvert, handleGetTransactionTimeAnalysis } from '../../service';
//
echarts.use([
LineChart,
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent,
CanvasRenderer
]);
let myChart: echarts.ECharts;
//
let searchTime = ref<string>()
onMounted(async () => {
await handleGoMounted()
})
//
const props = defineProps<{
currentService?: any;
}>();
//
watch(
() => props.currentService,
(newVal, oldVal) => {
handleGoMounted()
},
{ deep: true }
);
//
const handleGoMounted = async () => {
const res: any = await handleGetData()
console.log('fhdsuFHDSJFAHKD', res);
const chartDom = document.getElementById('VehicleModelStay');
if (!chartDom) return;
myChart = echarts.init(chartDom);
const option = {
xAxis: {
type: 'category',
data: res.category,
axisLabel: {
interval: 1, // 113
showMinLabel: true,
showMaxLabel: true
}
},
yAxis: [
{
type: 'value',
name: '停留时长',
splitLine: { show: false },
axisLine: {
show: true
},
axisLabel: {
formatter: '{value}' //
}
}
],
grid: {
left: '10', //
right: '10', //
bottom: '10',
top: '50',
containLabel: true
},
series: [
{
name: '小型车',
data: res?.smallCarData && res?.smallCarData.map((value, index) => ({
value: value,
symbol: index % 2 === 0 ? 'circle' : 'none', //
symbolSize: 6,
itemStyle: {
color: '#0094FF', //
borderWidth: 0 //
}
})),
type: 'line',
// smooth: true,
lineStyle: {
width: 2,
color: '#0094FF'
},
},
{
name: '中型车',
data: res?.middleCarData && res?.middleCarData.map((value, index) => ({
value: value,
symbol: index % 2 === 0 ? 'circle' : 'none', //
symbolSize: 6,
itemStyle: {
color: '#7D4CD2', //
borderWidth: 0 //
}
})),
type: 'line',
// smooth: true,
lineStyle: {
width: 2,
color: '#7D4CD2'
},
},
{
name: '大型车',
data: res?.bigCarData && res?.bigCarData.map((value, index) => ({
value: value,
symbol: index % 2 === 0 ? 'circle' : 'none', //
symbolSize: 6,
itemStyle: {
color: '#00FFB7', //
borderWidth: 0 //
}
})),
type: 'line',
// smooth: true,
lineStyle: {
width: 2,
color: '#00FFB7'
},
}
],
tooltip: {
trigger: 'axis',
axisPointer: {
type: 'line' // 线
},
formatter: function (params: any) {
}
},
legend: {
data: ['小型车', '中型车', '大型车'], //
textStyle: { color: '#fff' }, //
right: '0', // 4%
top: '0',
}
};
myChart.setOption(option);
myChart.resize();
window.addEventListener('resize', resizeChart);
}
//
const handleGetData = async () => {
let category: number[] = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19, 20, 21, 22, 23]
// let seriesData: number[] = []
// let realData: string[] = []
let smallCarData: number[] = []
let middleCarData: number[] = []
let bigCarData: number[] = []
const req: any = {
StartMonth: moment().subtract(1, 'd').format('YYYYMM'),
EndMonth: moment().subtract(1, 'd').format('YYYYMM'),
Province_Code: '340000',
TimeSpan: 1,
}
console.log('reqreqreqreqreq', req);
searchTime.value = moment(req.StartMonth).format('MM')
const data = await handleGetBayonetSTAnalysis(req)
console.log('fdsjifjasifjdsnafsdvbhcav', data);
if (data && data.length > 0) {
data.forEach((item: any) => {
if (item.name === '小型车') {
if (item.data && item.data.length > 0) {
item.data.forEach((subItem: any) => {
smallCarData.push(subItem[1])
})
}
} else if (item.name === '中型车') {
if (item.data && item.data.length > 0) {
item.data.forEach((subItem: any) => {
middleCarData.push(subItem[1])
})
}
} else if (item.name === '大型车') {
if (item.data && item.data.length > 0) {
item.data.forEach((subItem: any) => {
bigCarData.push(subItem[1])
})
}
}
})
}
let res: any = {
category: category,// x
// seriesData: seriesData,// y
// realData: realData//
smallCarData: smallCarData,
middleCarData: middleCarData,
bigCarData: bigCarData,
}
return res
}
const resizeChart = () => {
myChart?.resize();
};
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart);
myChart?.dispose();
});
</script>
<template>
<div class="VehicleModelStayBox">
<SmallTitle :title="`车型停留分析/日均${searchTime ? `(${searchTime}月)` : ''}`"></SmallTitle>
<div class="VehicleModelStayCharts" style="margin-top:15px">
<div class="VehicleModelStay" id="VehicleModelStay"></div>
</div>
</div>
</template>

View File

@ -21,7 +21,7 @@
.VehiclesEntering { .VehiclesEntering {
width: 100%; width: 100%;
// height: 134px; // height: 134px;
height: 167px; height: 190px;
} }
} }
} }

View File

@ -79,7 +79,7 @@ const handleGoMounted = async () => {
left: '3%', left: '3%',
right: '4%', right: '4%',
bottom: '3%', bottom: '3%',
top: '30%', top: '40%',
containLabel: true containLabel: true
}, },
xAxis: { xAxis: {
@ -95,28 +95,33 @@ const handleGoMounted = async () => {
type: 'value', type: 'value',
name: '车流量(万辆)', name: '车流量(万辆)',
splitLine: { show: false }, splitLine: { show: false },
axisLabel: { nameTextStyle: {
formatter: '{value}' color: '#666',
padding: [0, 30, 0, 0] //
}, },
splitNumber: 4 splitNumber: 4,
}, },
{ {
type: 'value', type: 'value',
name: '交易金额(万元)', name: '交易金额(万元)',
splitLine: { show: false }, splitLine: { show: false },
axisLabel: { nameTextStyle: {
formatter: '{value}' color: '#666',
padding: [0, 0, 0, 30] //
}, },
splitNumber: 4 splitNumber: 4,
} }
], ],
series: [ series: [
{ {
name: `${res.currentYear}年车流量`, name: `${res.currentYear}年车流量`,
type: 'bar', type: 'bar',
barWidth: '6', barWidth: 5,
data: res.seriesDataCar, data: res.seriesDataCar,
yAxisIndex: 0 yAxisIndex: 0,
itemStyle: {
borderRadius: [3, 3, 0, 0]
}
}, },
{ {
name: `${res.yesYear}年车流量`, name: `${res.yesYear}年车流量`,
@ -124,9 +129,9 @@ const handleGoMounted = async () => {
smooth: true, smooth: true,
data: res.yesSeriesDataCar, data: res.yesSeriesDataCar,
yAxisIndex: 0, yAxisIndex: 0,
barWidth: '6', barWidth: 5,
lineStyle: { itemStyle: {
width: 3 borderRadius: [3, 3, 0, 0]
} }
}, },
{ {
@ -135,7 +140,10 @@ const handleGoMounted = async () => {
data: res.seriesDataRevenue, data: res.seriesDataRevenue,
yAxisIndex: 1, yAxisIndex: 1,
symbol: 'circle', symbol: 'circle',
symbolSize: 8, symbolSize: 6,
lineStyle: {
width: 2
}
}, },
{ {
name: `${res.yesYear}年交易额`, name: `${res.yesYear}年交易额`,
@ -143,7 +151,10 @@ const handleGoMounted = async () => {
data: res.yesSeriesDataRevenue, data: res.yesSeriesDataRevenue,
yAxisIndex: 1, yAxisIndex: 1,
symbol: 'circle', symbol: 'circle',
symbolSize: 8 symbolSize: 6,
lineStyle: {
width: 2
}
} }
], ],
color: ['#008CFF', '#69BCFF', '#FF5E5E', '#FF9500'] // Custom colors for each series color: ['#008CFF', '#69BCFF', '#FF5E5E', '#FF9500'] // Custom colors for each series
@ -224,6 +235,11 @@ const handleGetSectionFlowCount = async () => {
currentYear: moment().format('YYYY'), // currentYear: moment().format('YYYY'), //
yesYear: moment().subtract(1, 'y').format('YYYY')// yesYear: moment().subtract(1, 'y').format('YYYY')//
} }
console.log('fdshufahsudifhasdjkfh', res);
return res return res
} }

View File

@ -14,3 +14,8 @@
box-sizing: border-box; box-sizing: border-box;
padding-left: 38px; padding-left: 38px;
} }
.newBigTitleBoxLong {
background-image: url(../../../../assets/image/newTitleLongBg.png);
}

View File

@ -6,13 +6,14 @@ import './newBigTitleBox.less'
// //
const props = defineProps<{ const props = defineProps<{
title?: string; title?: string;
type?: number;// 1 2
}>(); }>();
</script> </script>
<template> <template>
<div class="newBigTitleBox"> <div :class="type === 2 ? 'newBigTitleBox newBigTitleBoxLong' : 'newBigTitleBox'">
{{ props?.title || "" }} {{ props?.title || "" }}
</div> </div>

View File

@ -162,6 +162,10 @@
// } // }
// } // }
.bigPageTop {
width: 100vw;
height: 86px;
background: linear-gradient(180deg, rgba(3, 22, 38, 0.7) 0%, rgba(3, 22, 38, 0) 100%);
.pageTop169 { .pageTop169 {
width: 100vw; width: 100vw;
@ -245,3 +249,4 @@
} }
} }
} }
}

View File

@ -148,14 +148,15 @@ onBeforeUnmount(() => {
<template> <template>
<!-- <div class="pageTop"> --> <!-- <div class="pageTop"> -->
<div class="bigPageTop">
<div class="pageTop169"> <div class="pageTop169">
<!-- 新版的顶部分区的方法 --> <!-- 新版的顶部分区的方法 -->
<div class="leftTabBox"> <div class="leftTabBox">
<div :class="selectPageTab === 1 ? 'pageTopTabItem selectPageTopTabItem' : 'pageTopTabItem'" <div :class="selectPageTab === 1 ? 'pageTopTabItem selectPageTopTabItem' : 'pageTopTabItem'"
@click="handleChangePageTab(1)">分区一</div> @click="handleChangePageTab(1)">综合运维</div>
<div :class="selectPageTab === 2 ? 'pageTopTabItem selectPageTopTabItem' : 'pageTopTabItem'" <div :class="selectPageTab === 2 ? 'pageTopTabItem selectPageTopTabItem' : 'pageTopTabItem'"
@click="handleChangePageTab(2)">分区二</div> @click="handleChangePageTab(2)">流量洞察</div>
</div> </div>
<!-- 最初版的内容 --> <!-- 最初版的内容 -->
@ -204,10 +205,11 @@ onBeforeUnmount(() => {
<div class="leftTabBox"> <div class="leftTabBox">
<div :class="selectPageTab === 3 ? 'pageTopTabItem selectPageTopTabItem' : 'pageTopTabItem'" <div :class="selectPageTab === 3 ? 'pageTopTabItem selectPageTopTabItem' : 'pageTopTabItem'"
@click="handleChangePageTab(3)">分区三</div> @click="handleChangePageTab(3)">财约枢纽</div>
<div :class="selectPageTab === 4 ? 'pageTopTabItem selectPageTopTabItem' : 'pageTopTabItem'" <div :class="selectPageTab === 4 ? 'pageTopTabItem selectPageTopTabItem' : 'pageTopTabItem'"
@click="handleChangePageTab(4)">分区四</div> @click="handleChangePageTab(4)">彩云驿出行</div>
</div> </div>
</div> </div>
</div>
</template> </template>

View File

@ -47,14 +47,23 @@
height: 28px; height: 28px;
box-sizing: border-box; box-sizing: border-box;
padding: 4px 10px; padding: 4px 10px;
font-family: "Microsoft YaHei"; // font-family: "Microsoft YaHei";
font-weight: 400; // font-weight: 400;
font-size: 16px; // font-size: 16px;
// color: #FFFFFF;
// text-align: center;
// font-style: normal;
// background-image: url('../../../../assets//image/smallTitleBg.png');
// background-repeat: no-repeat;
// background-size: 100% 100%;
// background: linear-gradient(90deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
.title {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: bold;
font-size: 15px;
color: #FFFFFF; color: #FFFFFF;
text-align: center; text-align: center;
font-style: normal; font-style: normal;
background-image: url('../../../../assets//image/smallTitleBg.png'); }
background-repeat: no-repeat;
background-size: 100% 100%;
// background: linear-gradient(90deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
} }

View File

@ -50,6 +50,14 @@ import BrandDetail from './components/BrandDetail/BrandDetail.vue'
import AssessmentScoring from './components/AssessmentScoring/AssessmentScoring.vue'; import AssessmentScoring from './components/AssessmentScoring/AssessmentScoring.vue';
import OverviewOfServiceArea from './components/OverviewOfServiceArea/OverviewOfServiceArea.vue' import OverviewOfServiceArea from './components/OverviewOfServiceArea/OverviewOfServiceArea.vue'
import NewBigTitleBox from './components/newBigTitleBox/newBigTitleBox.vue' import NewBigTitleBox from './components/newBigTitleBox/newBigTitleBox.vue'
import VehicleModelStay from './components/VehicleModelStay/VehicleModelStay.vue';
import ContractInformation from './components/ContractInformation/ContractInformation.vue'
import SignedClients from './components/SignedClients/SignedClients.vue'
import AnnualAccountsReceivable from './components/AnnualAccountsReceivable/AnnualAccountsReceivable.vue';
import DetailedPayment from './components/DetailedPayment/DetailedPayment.vue';
import DailyInspection from './components/DailyInspection/DailyInspection.vue';
import AssessmentScoringRanking from './components/AssessmentScoringRanking/AssessmentScoringRanking.vue';
// //
let pageType = ref<string>("center") let pageType = ref<string>("center")
@ -95,34 +103,54 @@ const handleChangePageTab = (value: number) => {
</div> </div>
<!-- 分区一 --> <!-- 分区一 -->
<div class="content169" v-if="selectPageTab === 1"> <div class="content169" v-if="selectPageTab === 1 || selectPageTab === 3">
<div class="content169Left"> <div class="content169Left">
<!-- 消息轮播框 --> <!-- 消息轮播框 -->
<NoticeListBox :currentService="currentService" /> <NoticeListBox :currentService="currentService" />
<template v-if="selectPageTab === 1">
<!-- <modalTitle :title="'流量趋势'" style="margin-top: 20px;" /> --> <!-- <modalTitle :title="'流量趋势'" style="margin-top: 20px;" /> -->
<NewBigTitleBox title="流量趋势" style="margin-top: 37px;" />
<div class="content169LeftContent"> <div class="content169LeftContent">
<div class="leftContentBoxItem"> <!-- 服务区概况 -->
<!-- 车流断面趋势 --> <OverviewOfServiceArea />
<TrendOfTrafficFlow :currentService="currentService" />
<NewBigTitleBox :title="'管理运营监控'" style="margin-top: 13px;" />
<!-- 今日走势图 -->
<TodayTrend />
<!-- 服务区繁忙排行 交易排行 -->
<BusyTradingRanking style="margin-top: 11px;" />
<!-- 交易预警 -->
<TradingAlert style="margin-top: 11px;" />
</div> </div>
<div class="leftContentBoxItem" style="margin-top: 30px;"> </template>
<!-- 入区车辆趋势 -->
<VehiclesEntering :currentService="currentService" />
</div>
<div class="leftContentBoxItem" style="margin-top: 20px;"> <template v-if="selectPageTab === 3">
<!-- 客流变化 --> <NewBigTitleBox title="应收账款" style="margin-top: 20px;" />
<PassengerFlowChanges :currentService="currentService" />
</div> <div style="width: 100%;box-sizing: border-box;padding: 20px 11px;">
<!-- 合同信息 -->
<ContractInformation />
<!-- 收款完成进度 -->
<PaymentProgress style="margin-top: 24px;" />
<!-- 收款预警 -->
<AccountsReceivableWarning style="margin-top: 24px;" />
</div> </div>
</template>
<modalTitle :title="'节假日营收分析'" style="margin-top: 20px;">
<!-- <modalTitle :title="'节假日营收分析'" style="margin-top: 20px;">
<template #extra> <template #extra>
<div class="FestivalBox"> <div class="FestivalBox">
<el-select class="festivalSelect" v-model="FestivalValue" placeholder="Select" <el-select class="festivalSelect" v-model="FestivalValue" placeholder="Select"
@ -132,9 +160,9 @@ const handleChangePageTab = (value: number) => {
</el-select> </el-select>
</div> </div>
</template> </template>
</modalTitle> </modalTitle> -->
<!-- 节假日营收分析 --> <!-- 节假日营收分析 -->
<FestivalRevenue :currentService="currentService" /> <!-- <FestivalRevenue :currentService="currentService" /> -->
</div> </div>
<div class="content169Center"> <div class="content169Center">
@ -152,31 +180,61 @@ const handleChangePageTab = (value: number) => {
<div class="content169Right"> <div class="content169Right">
<!-- 时间天气等内容 --> <!-- 时间天气等内容 -->
<BasicMessageBox :currentService="currentService" /> <BasicMessageBox :currentService="currentService" />
<modalTitle :title="'经营业态月度情况'" style="margin-top: 20px;" />
<div class="rightContentBox">
<!-- 多业态收入 -->
<MultiIndustryIncome style="margin-top: 20px;" :currentService="currentService" />
<template v-if="selectPageTab === 1">
<NewBigTitleBox :title="'经营业态月度情况'" style="margin-top: 20px;" />
<div class="rightContentBox">
<!-- 区域营收占比 --> <!-- 区域营收占比 -->
<RegionalRevenue :currentService="currentService" style="margin-top: 90px;" /> <RegionalRevenue :currentService="currentService" style="margin-top: 20px;" />
<!-- 多业态收入 -->
<MultiIndustryIncome style="margin-top: 34px;" :currentService="currentService" />
<!-- 业态结构占比 --> <!-- 业态结构占比 -->
<BusinessStructure :currentService="currentService" style="margin-top: 30px;" /> <BusinessStructure :currentService="currentService" style="margin-top: 22px;" />
</div>
<NewBigTitleBox :title="'节假日营收分析'" style="margin-top: 22px;" />
<!-- 节假日营收分析 -->
<FestivalRevenue :currentService="currentService" />
</template>
<template v-if="selectPageTab === 3">
<NewBigTitleBox :title="'应收账款'" style="margin-top: 20px;" />
<div style="width: 100%;box-sizing: border-box;padding: 16px 11px 0;">
<!-- 签约客户 -->
<SignedClients />
<!-- 应收总额完成度 -->
<TotalAccountsReceivable style="margin-top: 35px;" />
<!-- 年度应收总额完成度 -->
<AnnualAccountsReceivable style="margin-top: 35px;" />
<!-- 详细款项完成进度 -->
<DetailedPayment style="margin-top: 35px;" />
</div>
</template>
</div> </div>
</div> </div>
<div class="pageBottom" v-if="selectPageTab === 1 || selectPageTab === 3">
</div> </div>
<!-- 分区二 --> <!-- 分区二 -->
<div class="content1692st" v-if="selectPageTab === 2"> <div class="content1692st" v-if="selectPageTab === 2">
<div class="content1692stLeft"> <div class="content1692stLeft">
<!-- 消息轮播框 --> <!-- 消息轮播框 -->
<NoticeListBox style="margin-top: 20px;" /> <NoticeListBox style="margin-top: 20px;width: 50%;" />
<!-- 核心经营数据 --> <!-- 核心经营数据 -->
<modalTitle :title="'核心经营数据'" style="margin-top: 20px;" /> <!-- <modalTitle :title="'核心经营数据'" style="margin-top: 20px;" /> -->
<CoreBusinessData style="position: relative;z-index: 9;" :noTitle="true" /> <!-- <CoreBusinessData style="position: relative;z-index: 9;" :noTitle="true" /> -->
<!-- 客群画像分析 --> <!-- 客群画像分析 -->
<modalTitle :title="'客群画像分析'" style="margin-top: 20px;" /> <NewBigTitleBox :title="'客群画像分析'" :type="2" style="margin-top: 20px" />
<div class="leftBottomContent"> <div class="leftBottomContent">
<!-- 年龄 --> <!-- 年龄 -->
@ -186,7 +244,7 @@ const handleChangePageTab = (value: number) => {
<GenderCustomerGroup style="margin-left: 20px;margin-top: 20px;" /> <GenderCustomerGroup style="margin-left: 20px;margin-top: 20px;" />
<!-- 停留时长 --> <!-- 停留时长 -->
<CustomerGroupStay style="margin-left: 20px;margin-top: 20px;" /> <!-- <CustomerGroupStay style="margin-left: 20px;margin-top: 20px;" /> -->
<!-- 偏好类型 --> <!-- 偏好类型 -->
<PreferenceType style="margin-left: 20px;margin-top: 20px;" /> <PreferenceType style="margin-left: 20px;margin-top: 20px;" />
@ -204,60 +262,105 @@ const handleChangePageTab = (value: number) => {
</div> </div>
<div class="left3stBottomItem"> <div class="left3stBottomItem">
<!-- 品牌消费水平 --> <!-- 消费时段分析 -->
<BrandConsumptionLevel style="margin-top: 20px;" /> <ConsumptionPeriod style="margin-top: 11px;" />
</div> </div>
<div class="left3stBottomItem"> <div class="left3stBottomItem">
<!-- 消费时段分析 --> <!-- 品牌消费水平 -->
<ConsumptionPeriod style="margin-top: 20px;" /> <BrandConsumptionLevel style="margin-top: 11px;" />
</div>
<div class="left3stBottomItem">
<!-- 客群特征分析 -->
<CustomerGroup style="margin-top: 15px;" />
</div>
<div class="left3stBottomItem">
<!-- 客群消费偏好 -->
<CustomerConsumptionPreferences style="margin-top: 15px;" />
</div> </div>
</div> </div>
</div> </div>
<div class="content1692stCenter"> <div class="content1692stCenter">
<modalTitle :title="'应收账款'" /> <NewBigTitleBox :title="'月度经营情况'" />
<div class="left4stContent">
<div style="width: 100%;box-sizing: border-box;padding: 20px 11px 0;">
<!-- 经营数据同比分析 -->
<BusinessCase :currentService="currentService" />
</div>
<!-- <modalTitle :title="'应收账款'" /> -->
<!-- <div class="left4stContent"> -->
<!-- 收款完成进度 --> <!-- 收款完成进度 -->
<PaymentProgress /> <!-- <PaymentProgress /> -->
<!-- 应收总额完成度 --> <!-- 应收总额完成度 -->
<TotalAccountsReceivable style="margin-top: 33px;" /> <!-- <TotalAccountsReceivable style="margin-top: 33px;" /> -->
<!-- 收款预警 --> <!-- 收款预警 -->
<AccountsReceivableWarning style="margin-top: 44px;" /> <!-- <AccountsReceivableWarning style="margin-top: 44px;" /> -->
</div> <!-- </div> -->
</div> </div>
<div class="content1692stRight"> <div class="content1692stRight">
<!-- 时间天气等内容 --> <!-- 时间天气等内容 -->
<BasicMessageBox style="margin-top: 19px;" /> <BasicMessageBox style="margin-top: 19px;" />
<!-- 电商模块 -->
<modalTitle :title="'电商模块'" style="margin-top: 20px;" />
<div class="left5stContent"> <NewBigTitleBox title="流量趋势" style="margin-top: 24px;" />
<div class="left5stCenter">
<!-- 线上线下销售额对比 --> <div class="content169LeftContent" style="margin-top: 21px;">
<SalesComparison /> <div class="leftContentBoxItem">
<!-- 退货率 --> <!-- 车流断面趋势 -->
<ReturnRate /> <TrendOfTrafficFlow :currentService="currentService" />
</div> </div>
<div class="leftContentBoxItem" style="margin-top: 23px;">
<!-- 入区车辆趋势 -->
<VehiclesEntering :currentService="currentService" />
</div>
<div class="leftContentBoxItem" style="margin-top: 30px;">
<!-- 客流变化 -->
<PassengerFlowChanges :currentService="currentService" />
</div>
<div class="leftContentBoxItem" style="margin-top: 33px;">
<!-- 车型停留分析 / 日均 -->
<VehicleModelStay />
</div>
</div>
<!-- 电商模块 -->
<!-- <modalTitle :title="'电商模块'" style="margin-top: 20px;" /> -->
<!-- <div class="left5stContent"> -->
<!-- <div class="left5stCenter"> -->
<!-- 线上线下销售额对比 -->
<!-- <SalesComparison /> -->
<!-- 退货率 -->
<!-- <ReturnRate /> -->
<!-- </div> -->
<!-- 热门商品榜单 --> <!-- 热门商品榜单 -->
<HotProductList style="margin-top: 30px;" :pageType="pageType" /> <!-- <HotProductList style="margin-top: 30px;" :pageType="pageType" /> -->
<!-- 服务区繁忙排行 交易排行 --> <!-- 服务区繁忙排行 交易排行 -->
<BusyTradingRanking style="margin-top: 24px;" /> <!-- <BusyTradingRanking style="margin-top: 24px;" /> -->
</div> <!-- </div> -->
</div> </div>
</div> </div>
<!-- 分区三 --> <!-- 分区三 -->
<div class="content1693st" v-if="selectPageTab === 3"> <div class="content1693st" v-if="selectPageTab === 99">
<div class="content1693stItem"> <div class="content1693stItem">
<!-- 消息轮播框 --> <!-- 消息轮播框 -->
<NoticeListBox /> <NoticeListBox />
<modalTitle :title="'供应商'" style="margin-top: 20px;" /> <modalTitle :title="'供应商'" style="margin-top: 20px;" />
<SupplierListBox /> <SupplierListBox />
<!-- 品牌 --> <!-- 品牌 -->
@ -301,44 +404,86 @@ const handleChangePageTab = (value: number) => {
</div> </div>
<div class="content1693stItem"> <div class="content1693stItem">
<!-- 经营数据同比分析 -->
<BusinessCase :currentService="currentService" />
</div> </div>
</div> </div>
<!-- 分区四 --> <!-- 分区四 -->
<div class="content1694st" v-if="selectPageTab === 4"> <div class="content1694st" v-if="selectPageTab === 4">
<div class="content1694stItem"> <div class="content1694stItem">
<!-- 消息轮播框 -->
<NoticeListBox style="margin-top: 20px;" />
<NewBigTitleBox :title="'管理运营监控'" style="margin-top: 29px;" />
<div style="width: 100%;box-sizing: border-box;padding: 20px 11px 0;">
<!-- 日常巡检(蓝湖的设备完好率) -->
<DailyInspection />
<!-- 考核打分排行榜 -->
<AssessmentScoringRanking style="margin-top: 19px;" />
<!-- 热门商品榜单 -->
<HotProductList style="margin-top: 20px;" :pageType="'left'" />
</div>
<!-- 客群特征分析 --> <!-- 客群特征分析 -->
<CustomerGroup /> <!-- <CustomerGroup /> -->
<!-- 客群消费偏好 --> <!-- 客群消费偏好 -->
<CustomerConsumptionPreferences style="margin-top: 140px;" /> <!-- <CustomerConsumptionPreferences style="margin-top: 140px;" /> -->
<!-- 车型停留分析/日均 --> <!-- 车型停留分析/日均 -->
<VehicleStayAnalysis style="margin-top: 130px;" /> <!-- <VehicleStayAnalysis style="margin-top: 130px;" /> -->
</div> </div>
<div class="content1694stItem"> <div class="content1694stItem">
<NewBigTitleBox :title="'品牌'" style="margin-top: 74px;" />
<!-- 商户类别比例图 下面的列表 --> <!-- 商户类别比例图 下面的列表 -->
<BrandDetail /> <BrandDetail />
</div> </div>
<div class="content1694stItem"> <div class="content1694stItem">
<NewBigTitleBox :title="'供应商'" style="margin-top: 74px;" />
<SupplierListBox />
<!-- 在线服务区和在线收银机 --> <!-- 在线服务区和在线收银机 -->
<TodayTrend /> <!-- <TodayTrend /> -->
<!-- 交易预警 --> <!-- 交易预警 -->
<TradingAlert /> <!-- <TradingAlert /> -->
<!-- 考核打分排行榜 --> <!-- 考核打分排行榜 -->
<AssessmentScoring style="margin-top: 130px;" /> <!-- <AssessmentScoring style="margin-top: 130px;" /> -->
</div> </div>
<div class="content1694stItem"> <div class="content1694stItem">
<!-- 时间天气等内容 -->
<BasicMessageBox style="margin-top: 19px;" />
<!-- 服务区概况 --> <NewBigTitleBox :title="'电商模块'" style="margin-top: 28px;" />
<OverviewOfServiceArea />
<!-- 商城订单统计 -->
<MallOrderStatistics style="margin-top: 20px;" />
<NewBigTitleBox :title="'商户生态结构图谱'" style="margin-top: 28px;" />
<!-- 本月福利金发送额度 -->
<ThisMonthBenefits style="margin-top: 10px;" />
<!-- 核心品类占比 -->
<CoreCategory style="margin-top: 10px;" />
<NewBigTitleBox :title="'商户生态结构图谱'" style="margin-top: 28px;" />
<!-- 商户评分排行榜 -->
<MerchantRatingRanking style="margin-top: 16px;" />
</div> </div>
</div> </div>

View File

@ -377,3 +377,51 @@ export async function handleGetMonthAnalysis(params: any) {
} }
return data.Result_Data.List return data.Result_Data.List
} }
// 车流停留分析/日均
export async function handleGetBayonetSTAnalysis(params: any) {
const data: any = await requestCode.get('/Revenue/GetBayonetSTAnalysis', params)
if (data.Result_Code !== 100) {
return data
}
return data.Result_Data.List
}
// 获取节假日各类项目所有天数对客分析/日均
export async function handleGetHolidayDailyAnalysis(params: any) {
const data: any = await requestCode.get('/Revenue/GetHolidayDailyAnalysis', params)
if (data.Result_Code !== 100) {
return data
}
return data.Result_Data.List
}
// 获取年度应收总额完成度
export async function handleGetProjectYearlyArrearageList(params: any) {
const data: any = await request.get('/Contract/GetProjectYearlyArrearageList', params)
if (data.Result_Code !== 100) {
return data
}
return data.Result_Data
}
// 获取日常巡检的数据
export async function handleGetPatrolAnalysis(params: any) {
const data: any = await requestCode.get('/Examine/GetPatrolAnalysis', params)
if (data.Result_Code !== 100) {
return data
}
return data.Result_Data
}
// 考核考评的数据
export async function handleGetExamineResultList(params: any) {
const data: any = await requestCode.get('/Examine/GetExamineResultList', params)
if (data.Result_Code !== 100) {
return data
}
return data.Result_Data.List
}

View File

@ -255,23 +255,27 @@
} }
.content169 { .content169 {
width: 100%; // width: 100%;
// height: calc(100% - 48px); // height: calc(100% - 86px);
height: calc(100% - 86px); width: 100vw;
height: calc(100vh - 48px);
box-sizing: border-box; box-sizing: border-box;
// padding: 0 20px 35px; // padding: 0 20px 35px;
padding: 0 35px; // padding: 0 35px;
display: flex; display: flex;
align-items: center; align-items: center;
justify-content: space-between; justify-content: space-between;
.content169Left { .content169Left {
width: calc((100% - 105px) / 4); width: calc((100% - 90px) / 4);
height: 100%; height: 100%;
position: relative; position: relative;
z-index: 9; z-index: 9;
box-sizing: border-box; box-sizing: border-box;
padding-top: 21px; padding-top: 21px;
padding-left: 35px;
background: linear-gradient(90deg, rgba(3, 22, 38, 0.7) 0%, rgba(3, 22, 38, 0) 100%);
// padding-top: 20px; // padding-top: 20px;
.content169LeftContent { .content169LeftContent {
@ -309,7 +313,7 @@
} }
.content169Center { .content169Center {
width: calc((100% - 105px) / 4 * 2 + 35px); width: calc((100% - 90px) / 4 * 2 + 30px);
height: 100%; height: 100%;
box-sizing: border-box; box-sizing: border-box;
padding-top: 66px; padding-top: 66px;
@ -318,18 +322,20 @@
} }
.content169Right { .content169Right {
width: calc((100% - 105px) / 4); width: calc((100% - 90px) / 4);
height: 100%; height: 100%;
position: relative; position: relative;
z-index: 9; z-index: 9;
box-sizing: border-box; box-sizing: border-box;
padding-top: 21px; padding-top: 21px;
padding-right: 35px;
background: linear-gradient(270deg, rgba(3, 22, 38, 0.7) 0%, rgba(3, 22, 38, 0) 100%);
.rightContentBox { .rightContentBox {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 20px 11px 0; padding: 0 11px 0;
background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%); // background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
// backdrop-filter: blur(10px); // backdrop-filter: blur(10px);
/* 高斯模糊效果 */ /* 高斯模糊效果 */
// -webkit-backdrop-filter: blur(10px); // -webkit-backdrop-filter: blur(10px);
@ -340,6 +346,18 @@
} }
.pageBottom {
width: 100vw;
height: 72px;
// background: linear-gradient(0deg, rgba(3, 22, 38, 0.7) 0%, rgba(3, 22, 38, 0) 100%);
background-image: url('../../assets/image/pageBottomBg.png');
background-repeat: no-repeat;
background-size: 100% 100%;
position: relative;
z-index: 9;
transform: translateY(-72px);
}
.content1692st { .content1692st {
width: 100%; width: 100%;
height: calc(100% - 48px); height: calc(100% - 48px);
@ -350,7 +368,8 @@
justify-content: space-between; justify-content: space-between;
.content1692stLeft { .content1692stLeft {
width: 47%; // width: 47%;
width: calc((100% - 90px) / 4 * 2 + 30px);
height: 100%; height: 100%;
.leftBottomContent { .leftBottomContent {
@ -447,9 +466,9 @@
justify-content: space-between; justify-content: space-between;
.content1694stItem { .content1694stItem {
width: 22%; width: calc((100% - 90px) / 4);
height: 100%; height: 100%;
box-sizing: border-box;
} }
} }

View File

@ -1 +1 @@
{"root":["./src/main.ts","./src/shims-vue.d.ts","./src/vite-env.d.ts","./src/options/serveice.ts","./src/page/index/service.ts","./src/request/newrequest.ts","./src/request/request.ts","./src/request/requestcode.ts","./src/request/requestconfig.ts","./src/request/requestlocal.ts","./src/request/requestpos.ts","./src/request/requesttest.ts","./src/router/index.ts","./src/stores/counter.ts","./src/app.vue","./src/page/index/index.vue","./src/page/index/components/accountsreceivablewarning/accountsreceivablewarning.vue","./src/page/index/components/announcementtopic/announcementtopic.vue","./src/page/index/components/basicmessagebox/basicmessagebox.vue","./src/page/index/components/brandconsumptionlevel/brandconsumptionlevel.vue","./src/page/index/components/brandlisttbox/brandlisttbox.vue","./src/page/index/components/businessstructure/businessstructure.vue","./src/page/index/components/busytradingranking/busytradingranking.vue","./src/page/index/components/centertitle/centertitle.vue","./src/page/index/components/consumptionconversion/consumptionconversion.vue","./src/page/index/components/consumptionlevel/consumptionlevel.vue","./src/page/index/components/consumptionperiod/consumptionperiod.vue","./src/page/index/components/corebusinessdata/corebusinessdata.vue","./src/page/index/components/corecategory/corecategory.vue","./src/page/index/components/customeragegroup/customeragegroup.vue","./src/page/index/components/customergroupstay/customergroupstay.vue","./src/page/index/components/deductiontype/deductiontype.vue","./src/page/index/components/festivalrevenue/festivalrevenue.vue","./src/page/index/components/gendercustomergroup/gendercustomergroup.vue","./src/page/index/components/highqualitymerchants/highqualitymerchants.vue","./src/page/index/components/hotproductlist/hotproductlist.vue","./src/page/index/components/mallorderstatistics/mallorderstatistics.vue","./src/page/index/components/merchantcategory/merchantcategory.vue","./src/page/index/components/merchantratingranking/merchantratingranking.vue","./src/page/index/components/multiindustryincome/multiindustryincome.vue","./src/page/index/components/pagemap/pagemap.vue","./src/page/index/components/passengerflowchanges/passengerflowchanges.vue","./src/page/index/components/paymentprogress/paymentprogress.vue","./src/page/index/components/preferencetype/preferencetype.vue","./src/page/index/components/privaterideservice/privaterideservice.vue","./src/page/index/components/regionalrevenue/regionalrevenue.vue","./src/page/index/components/returnrate/returnrate.vue","./src/page/index/components/salescomparison/salescomparison.vue","./src/page/index/components/thismonthbenefits/thismonthbenefits.vue","./src/page/index/components/todaytrend/todaytrend.vue","./src/page/index/components/totalaccountsreceivable/totalaccountsreceivable.vue","./src/page/index/components/tradingalert/tradingalert.vue","./src/page/index/components/trendoftrafficflow/trendoftrafficflow.vue","./src/page/index/components/vehiclesentering/vehiclesentering.vue","./src/page/index/components/modaltitle/modaltitle.vue","./src/page/index/components/noticelistbox/noticelistbox.vue","./src/page/index/components/pagetop/pagetop.vue","./src/page/index/components/smalltitle/smalltitle.vue","./src/page/index/components/supplierlistbox/supplierlistbox.vue"],"version":"5.6.3"} {"root":["./src/main.ts","./src/shims-vue.d.ts","./src/vite-env.d.ts","./src/options/serveice.ts","./src/page/index/service.ts","./src/request/newrequest.ts","./src/request/request.ts","./src/request/requestcode.ts","./src/request/requestconfig.ts","./src/request/requestlocal.ts","./src/request/requestpos.ts","./src/request/requesttest.ts","./src/router/index.ts","./src/stores/counter.ts","./src/app.vue","./src/page/index/index.vue","./src/page/index/components/accountsreceivablewarning/accountsreceivablewarning.vue","./src/page/index/components/announcementtopic/announcementtopic.vue","./src/page/index/components/assessmentscoring/assessmentscoring.vue","./src/page/index/components/basicmessagebox/basicmessagebox.vue","./src/page/index/components/brandconsumptionlevel/brandconsumptionlevel.vue","./src/page/index/components/branddetail/branddetail.vue","./src/page/index/components/brandlisttbox/brandlisttbox.vue","./src/page/index/components/businesscase/businesscase.vue","./src/page/index/components/businessstructure/businessstructure.vue","./src/page/index/components/busytradingranking/busytradingranking.vue","./src/page/index/components/centertitle/centertitle.vue","./src/page/index/components/consumptionconversion/consumptionconversion.vue","./src/page/index/components/consumptionlevel/consumptionlevel.vue","./src/page/index/components/consumptionperiod/consumptionperiod.vue","./src/page/index/components/corebusinessdata/corebusinessdata.vue","./src/page/index/components/corecategory/corecategory.vue","./src/page/index/components/customeragegroup/customeragegroup.vue","./src/page/index/components/customerconsumptionpreferences/customerconsumptionpreferences.vue","./src/page/index/components/customergroup/customergroup.vue","./src/page/index/components/customergroupstay/customergroupstay.vue","./src/page/index/components/deductiontype/deductiontype.vue","./src/page/index/components/festivalrevenue/festivalrevenue.vue","./src/page/index/components/gendercustomergroup/gendercustomergroup.vue","./src/page/index/components/highqualitymerchants/highqualitymerchants.vue","./src/page/index/components/hotproductlist/hotproductlist.vue","./src/page/index/components/mallorderstatistics/mallorderstatistics.vue","./src/page/index/components/merchantcategory/merchantcategory.vue","./src/page/index/components/merchantratingranking/merchantratingranking.vue","./src/page/index/components/multiindustryincome/multiindustryincome.vue","./src/page/index/components/overviewofservicearea/overviewofservicearea.vue","./src/page/index/components/pagemap/pagemap.vue","./src/page/index/components/passengerflowchanges/passengerflowchanges.vue","./src/page/index/components/paymentprogress/paymentprogress.vue","./src/page/index/components/preferencetype/preferencetype.vue","./src/page/index/components/privaterideservice/privaterideservice.vue","./src/page/index/components/regionalrevenue/regionalrevenue.vue","./src/page/index/components/returnrate/returnrate.vue","./src/page/index/components/salescomparison/salescomparison.vue","./src/page/index/components/thismonthbenefits/thismonthbenefits.vue","./src/page/index/components/todaytrend/todaytrend.vue","./src/page/index/components/totalaccountsreceivable/totalaccountsreceivable.vue","./src/page/index/components/tradingalert/tradingalert.vue","./src/page/index/components/trendoftrafficflow/trendoftrafficflow.vue","./src/page/index/components/vehiclestayanalysis/vehiclestayanalysis.vue","./src/page/index/components/vehiclesentering/vehiclesentering.vue","./src/page/index/components/modaltitle/modaltitle.vue","./src/page/index/components/newbigtitlebox/newbigtitlebox.vue","./src/page/index/components/noticelistbox/noticelistbox.vue","./src/page/index/components/pagetop/pagetop.vue","./src/page/index/components/smalltitle/smalltitle.vue","./src/page/index/components/supplierlistbox/supplierlistbox.vue"],"version":"5.6.3"}