This commit is contained in:
ylj20011123 2025-06-16 19:42:57 +08:00
parent b02851d456
commit 56d45a0f28
27 changed files with 792 additions and 157 deletions

BIN
src/assets/image/AIIcon.png Normal file

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.3 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 930 B

Binary file not shown.

After

Width:  |  Height:  |  Size: 3.1 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

View File

@ -264,7 +264,6 @@
.featureAnalysisBox {
width: 100%;
height: 300px;
margin-top: 18px;
}
.featureAnalysisBottom {

View File

@ -70,7 +70,7 @@ watch(
onMounted(async () => {
// tab
await handleGetData()
await handleGetBottomData()
// await handleGetBottomData()
})
@ -249,11 +249,12 @@ const handleShowData = async (value: number) => {
show: false // 线线
},
axisLabel: {
width: '60',
color: '#fff'
},
nameTextStyle: {
color: '#fff', //
padding: [0, 0, 0, 20] //
padding: [0, 0, 0, 30] //
}
},
series: [{
@ -417,7 +418,9 @@ onBeforeUnmount(() => {
<template>
<div class="BusinessCaseBox">
<SmallTitle style="padding-left: 0;">
<SmallTitle title="营收特征分析" />
<SmallTitle style="padding-left: 0;margin-top: 38px;">
<template #extra>
<div class="BusinessCaseTabBox">
<div :class="selectTab === item.value ? 'BusinessCaseItem selectBusinessCaseItem' : 'BusinessCaseItem'"
@ -430,7 +433,7 @@ onBeforeUnmount(() => {
<!-- 营收同比 -->
<div class="BusinessCaseRevenueYOY">
<div class="BusinessCaseRevenueYOY" v-if="false">
<div class="BusinessCaseLeftItem">
<img class="BusinessIcon" :src="RevenueYOYIcon" />
</div>
@ -496,13 +499,13 @@ onBeforeUnmount(() => {
<!-- 营收特征分析 -->
<div class="featureAnalysis">
<SmallTitle title="营收特征分析" />
<!-- <SmallTitle title="营收特征分析" /> -->
<div class="featureAnalysisBox" id="featureAnalysis"></div>
<SmallTitle title="营收同比分析" style="margin-top: 31px;" />
<!-- <SmallTitle title="营收同比分析" style="margin-top: 31px;" />
<div class="featureAnalysisBottom" id="featureAnalysisBottom"></div>
<div class="featureAnalysisBottom" id="featureAnalysisBottom"></div> -->
</div>
</div>

View File

@ -153,12 +153,17 @@ onMounted(async () => {
type: 'line' // 线
},
formatter: function (params: any) {
return `<div>
console.log('paramsparams', params);
let str: string = ''
if (params && params.length > 0) {
params.forEach((item: any) => {
str += item.seriesName + item.value + '%'
})
}
return `
<div>${params[0].name}</div>
<div>车流量${params[0]?.value}</div>
<div>客单量${params[1]?.value}</div>
</div>`
${str}
`
// let toolStr: string[] = []
// if (params && params.length > 0) {

View File

@ -32,7 +32,7 @@
}
.CustomerAgeGroup {
width: 190px;
width: 100%;
height: 154px;
}

View File

@ -42,15 +42,15 @@ onMounted(async () => {
const option = {
tooltip: { // tooltip
trigger: 'item', //
trigger: 'axis', //
confine: true, // tooltip
// axisPointer: { //
// type: 'shadow' //
// },
formatter: function (params: any) { //
return `<div>
<div>男性${res.seriesDataMan[params.dataIndex]}%</div>
<div>女性${res.seriesDataWoman[params.dataIndex]}%</div>
<div>男性${res.seriesDataMan[params[0].dataIndex]}%</div>
<div>女性${res.seriesDataWoman[params[1].dataIndex]}%</div>
</div>`
// return `
// <div style="font-weight:bold">${params.data.name} ${params?.percent}% ${res.realData[params.dataIndex].toLocaleString()}</div>
@ -93,7 +93,7 @@ onMounted(async () => {
grid: {
left: '10', //
right: '10', //
bottom: '30',
bottom: '20',
top: '30',
containLabel: true
},
@ -105,7 +105,7 @@ onMounted(async () => {
// realData: res.realData,
type: 'bar',
barWidth: '6',
showBackground: true,
// showBackground: true,
backgroundStyle: {
borderRadius: [4, 4, 0, 0],
// color: 'rgba(23, 42, 70, 1)'
@ -133,7 +133,7 @@ onMounted(async () => {
// realData: res.realData,
type: 'bar',
barWidth: '6',
showBackground: true,
// showBackground: true,
backgroundStyle: {
borderRadius: [4, 4, 0, 0],
// color: 'rgba(23, 42, 70, 1)'
@ -211,7 +211,8 @@ const handleGetData = async () => {
let res: any = {
category: ["25以下", "25-35", "35-45", "45以上"],// x
// category: ["25", "25-35", "35-45", "45"],// x
category: ["20岁", "30岁", "40岁", "50以上"],// x
seriesDataMan: seriesDataMan,//
seriesDataWoman: seriesDataWoman//
}

View File

@ -59,7 +59,7 @@ const handleGoMounted = async () => {
type: 'category',
data: res.category,
axisLabel: {
width: 40, // 60px
width: 80, // 60px
overflow: 'truncate', //
ellipsis: '...', //
interval: 0 //
@ -75,7 +75,7 @@ const handleGoMounted = async () => {
},
yAxis: {
type: 'value',
name: "客单占比(%)",
name: "%",
axisLine: {
show: true,
lineStyle: {
@ -83,7 +83,7 @@ const handleGoMounted = async () => {
}
},
nameTextStyle: {
padding: [0, 0, 0, 30]
padding: [0, 20, 0, 0]
},
splitLine: { show: false } // 线
},
@ -178,7 +178,7 @@ const handleGetData = async () => {
if (data.CustomerSaleList && data.CustomerSaleList.length > 0) {
let list = data.CustomerSaleList.slice(0, 10)
let list = data.CustomerSaleList.slice(0, 15)
list.forEach((item: any) => {
category.push(item.BusinessTradeName)
seriesData.push(item.TotalRatio)

View File

@ -90,11 +90,14 @@ const handleShowCharts = async () => {
},
yAxis: {
type: 'value',
name: '交易额()',
name: '元',
axisLabel: {
color: '#fff',
formatter: '{value}'
},
nameTextStyle: {
padding: [0, 20, 0, 0]
},
axisTick: {
show: false // 线
},

View File

@ -0,0 +1,19 @@
.FestivalRevenueSumInfoBox {
width: 100%;
// height: 250px;
box-sizing: border-box;
padding: 20px 11px 0;
// padding: 35px 20px 40px; // 老的
// padding: 20px 10px 30px;
// background: linear-gradient(0deg, rgba(0, 148, 255, 0.1) 0%, rgba(0, 148, 255, 0) 100%);
// backdrop-filter: blur(10px);
/* 高斯模糊效果 */
// -webkit-backdrop-filter: blur(10px);
/* Safari 兼容 */
.FestivalRevenueSumInfo {
width: 100%;
height: 260px;
// margin-top: 20px;
}
}

View File

@ -0,0 +1,155 @@
<script setup lang="ts">
import { onBeforeUnmount, onMounted, watch } from 'vue';
import './FestivalRevenueSumInfo.less'
import * as echarts from 'echarts/core';
import { LineChart } from 'echarts/charts';
import {
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent
} from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers';
//
echarts.use([
LineChart,
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent,
CanvasRenderer
]);
let myChart: echarts.ECharts;
onMounted(async () => {
await handleGoMounted()
})
//
const props = defineProps<{
currentService?: any;
FestivalValue?: number
}>();
//
watch(
() => props.currentService,
(newVal, oldVal) => {
handleGoMounted()
},
{ deep: true }
);
//
watch(
() => props.FestivalValue,
(newVal, oldVal) => {
handleGoMounted()
},
{ deep: true }
);
//
const handleGoMounted = async () => {
const res = await handleGetRealData()
const chartDom = document.getElementById('FestivalRevenueSumInfo');
if (!chartDom) return;
myChart = echarts.init(chartDom);
const option = {
tooltip: {
trigger: 'item',
formatter: '{a} <br/>{b}: {c} ({d}%)'
},
legend: [ // 使legend
//
{
data: ['A类', 'B类', 'C类', 'D类'].map(name => ({
name,
icon: 'circle'
})),
orient: 'horizontal',
top: 'bottom',
left: 'center',
padding: [0, 0, 30, 0], //
textStyle: { color: '#fff' }
},
//
{
data: ['子类1', '子类2', '子类3'].map(name => ({
name,
icon: 'rect'
})),
orient: 'horizontal',
top: 'bottom',
left: 'center',
textStyle: { color: '#fff' }
}
],
series: [
//
{
name: '外圈数据',
type: 'pie',
radius: ['50%', '70%'],
center: ['50%', '45%'], //
data: [
{ value: 335, name: 'A类' },
{ value: 310, name: 'B类' },
{ value: 234, name: 'C类' },
{ value: 135, name: 'D类' }
],
label: { show: false }
},
//
{
name: '内圈数据',
type: 'pie',
radius: ['0%', '30%'],
center: ['50%', '45%'], //
data: [
{ value: 100, name: '子类1' },
{ value: 200, name: '子类2' },
{ value: 300, name: '子类3' }
],
label: { show: false }
}
]
};
myChart.setOption(option);
myChart.resize();
window.addEventListener('resize', resizeChart);
}
//
const handleGetRealData = async () => {
}
const resizeChart = () => {
myChart?.resize();
};
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart);
myChart?.dispose();
});
</script>
<template>
<div class="FestivalRevenueSumInfoBox">
<div class="FestivalRevenueSumInfo" id="FestivalRevenueSumInfo"></div>
</div>
</template>

View File

@ -29,7 +29,7 @@
height: 145px;
.GenderCustomerGroup {
width: 106px;
width: 100%;
height: 145px;
}

View File

@ -37,6 +37,15 @@ onMounted(async () => {
myChart = echarts.init(chartDom);
const rect = chartDom.getBoundingClientRect();
const width = rect.width;
const height = rect.height;
// center20%50%
const centerX = width * 0.5;
const centerY = height * 0.4;
const option = {
tooltip: {
trigger: 'item',
@ -48,8 +57,9 @@ onMounted(async () => {
},
formatter: function (params: any) {
return `
<div style="font-weight:bold">${params.name} ${params.value}%</div>
<div style="font-weight:bold">${params.name}</div>
`;
// ${params.value}%
}
},
graphic: { //
@ -61,8 +71,8 @@ onMounted(async () => {
width: 43,
height: 43
},
left: 'center',
top: '21',
left: centerX - 21.5,
top: centerY - 21.5,
z: 10
}
]
@ -71,8 +81,8 @@ onMounted(async () => {
{
name: 'Access From',
type: 'pie',
radius: ['60%', '80%'],
center: ['50%', '30%'], // [, ]
radius: ['55%', '70%'],
center: ['50%', '40%'], // [, ]
avoidLabelOverlap: false,
itemStyle: {
color: function (params: any) {
@ -92,17 +102,14 @@ onMounted(async () => {
}
],
legend: {
data: ['男性', '女性'],
data: res.legendData,
bottom: 0,
left: 0,
left: 'center',
orient: 'horizontal', //
itemWidth: 12,
itemHeight: 12,
itemGap: 10, //
textStyle: {
color: '#fff'
},
},
}
};
@ -123,18 +130,23 @@ const handleGetSectionFlowCount = async () => {
let seriesData: any = []
let realData: any = []
let legendData: any = []
if (data && data.length > 0) {
data.forEach((item: any) => {
if (item.name === '男性' || item.name === '女性') {
seriesData.push({ name: item.name, value: item.data[0] })
seriesData.push({ name: `${item.name} ${item.data[0]}%`, value: item.data[0] })
legendData.push({ name: `${item.name} ${item.data[0]}%` })
}
})
}
console.log('legendData', legendData)
let res: any = {
seriesData: seriesData,// y
realData: realData//
realData: realData,//
legendData: legendData
}
return res
}

View File

@ -1,5 +1,5 @@
<script setup lang="ts">
import { onMounted, reactive, ref } from 'vue';
import { onMounted, reactive, ref, watch } from 'vue';
import './PageMap.less'
import { GaodeMap, LineLayer, PointLayer, Scene } from '@antv/l7';
import { handleGetServerpartList, handleGetServerPartListJava } from '../../service';
@ -27,8 +27,26 @@ let SPREGIONTYPECOLORList = reactive<any>([]);
let SPREGIONTYPECOLOR = ref<any>();
//
const hoverPoint = ref<any>();
//
let currentService = ref<any>()
const props = defineProps<{
selectPointServicePart?: any
}>();
watch(
() => props.selectPointServicePart,
(newVal, oldVal) => {
if (newVal && newVal.length > 0) {
//
handleHighLightServerpartIds(newVal)
}
},
{ deep: true }
);
onMounted(async () => {
scene.value = new Scene({
id: "map",
@ -162,8 +180,9 @@ const handleAllServiceMarkedPoint = async () => {
//
pointLayer.on("unclick", () => {
handleDeleteLayer("lightPointLayer");
emit("handleGetCurrentService", null)
handleLayerToDefault();
});
@ -202,15 +221,63 @@ const handlePointHover = () => {
return el;
};
//
const handleHighLightServerpartIds = (idList: number[]) => {
handleDeleteLayer("lightPointLayer");
handleAllPonitToGray()
let selectServerpartDetailList: any = []
if (defaultServerPartList && defaultServerPartList.length > 0) {
defaultServerPartList.forEach((item: any) => {
if (idList.indexOf(item.SERVERPART_ID) !== -1) {
selectServerpartDetailList.push(item)
}
})
}
handleAddSelect(selectServerpartDetailList)
}
//
const handleAllPonitToGray = () => {
let current: any = handleGetThisLayer("pointLayer");
current.color("#dededd");
current.render();
}
//
const handleGetThisLayer = (name: string) => {
let res: any;
let allLayers: any = scene.value.getLayers();
if (allLayers && allLayers.length > 0) {
allLayers.forEach((item: any) => {
if (item.name === name) {
res = item;
}
});
}
if (res) {
return res;
}
};
//
const handleClickPointLayer = async (detail: any) => {
handleAddSelect(detail)
if (detail.SERVERPART_ID === currentService.value?.SERVERPART_ID) {
} else {
handleDeleteLayer("lightPointLayer");
handleAddSelect(detail)
}
}
//
const handleAddSelect = (detail: any) => {
let allLayers: any = scene.value.getLayers();
emit("handleGetCurrentService", detail)
if (Array.isArray(detail)) {
} else {
currentService.value = detail
emit("handleGetCurrentService", detail)
}
const lightPointLayer = new PointLayer({});
lightPointLayer.name = "lightPointLayer";
@ -220,7 +287,7 @@ const handleAddSelect = (detail: any) => {
lightPointLayer.style({
opacity: 0.6,
});
lightPointLayer.source([detail], {
lightPointLayer.source(Array.isArray(detail) ? detail : [detail], {
parser: {
type: "json",
x: "SERVERPART_X",
@ -228,22 +295,61 @@ const handleAddSelect = (detail: any) => {
},
});
scene.value.addLayer(lightPointLayer);
let allLayers: any = scene.value.getLayers();
}
//
const handleDeleteLayer = (name: string) => {
let allLayers: any = scene.value.getLayers();
if (allLayers && allLayers.length > 0) {
allLayers.forEach((item: any) => {
if (item.name === name) {
scene.value.removeLayer(item);
}
});
//
const layerToRemove = allLayers.find((layer: any) => layer.name === name);
if (layerToRemove) {
// 使 scene removeLayer
scene.value.removeLayer(layerToRemove);
//
scene.value.render();
}
}
};
//
const handleLayerToDefault = () => {
emit("handleGetCurrentService", null)
emit("handleMapToChangeNotice")
handleDeleteLayer("lightPointLayer");
let allLayers: any = scene.value.getLayers();
let current: any = handleGetThisLayer("pointLayer");
if (current) {
//
current.color("SPREGIONTYPETYPE", (value: any) => {
return colorList1[value];
});
//
current.style({
opacity: 0.6,
});
//
current.render();
//
scene.value.render();
}
}
const emit = defineEmits<{
(e: "handleGetCurrentService", obj: any): void;
(e: "handleMapToChangeNotice"): void;
}>();

View File

@ -81,42 +81,51 @@ const handleGoMounted = async () => {
padding: [0, 30, 0, 0] //
},
axisLabel: {
width: 60,
color: '#fff',
formatter: '{value}' //
},
axisLine: {
show: true, // y 线
lineStyle: {
color: '#fff' // y 线
}
},
splitLine: { show: false }
splitLine: { show: false },
splitNumber: 5
},
series: [
{
name: `${res.currentYear}年断面流量`,
// data: [120, 200, 150, 80, 70, 110, 130],
data: res.seriesData,
realData: res.realData,
type: 'bar',
barWidth: '6',
showBackground: true,
barWidth: 5,
smooth: true,
backgroundStyle: {
borderRadius: [4, 4, 0, 0],
// color: 'rgba(23, 42, 70, 1)'
color: 'rgba(0, 148, 255, 0.1)'
},
itemStyle: {
borderRadius: [4, 4, 0, 0],
//
color: function (params: any) {
return new echarts.graphic.LinearGradient(
0, 0, 0, 1,
[
{ offset: 0, color: '#018FFF' }, //
{ offset: 1, color: '#00F4FF' } //
]
);
}
borderRadius: [3, 3, 0, 0]
},
label: {
show: true,
position: 'top',
formatter: function (params: any) {
//
return res.addRateList && res.addRateList[params.dataIndex] ? `${res.addRateList[params.dataIndex]}%` : '';
},
color: '#fff', //
fontSize: 10 //
}
},
{
name: `${res.yesYear}年断面流量`,
data: res.yesSeriesData,
realData: res.yesRealData,
type: 'bar',
barWidth: 5,
smooth: true,
itemStyle: {
borderRadius: [3, 3, 0, 0]
}
},
],
@ -124,7 +133,7 @@ const handleGoMounted = async () => {
left: '0', //
right: '0', //
bottom: '0', //
top: '30', //
top: '40', //
containLabel: true // grid
},
tooltip: { // tooltip
@ -134,15 +143,24 @@ const handleGoMounted = async () => {
},
formatter: function (params: any) { //
// params hover
const data = params[0];
let realData = res.realData[params[0].dataIndex]
return `
<div style="font-weight:bold">${data.name}</div>
<div>车流量${realData ? realData + '辆' : data.value + '万辆'} </div>
`;
return `<div>
<div>${params[0].seriesName}${res?.realData[params[0]?.dataIndex].toLocaleString()}</div>
<div>${params[1].seriesName}${res?.yesRealData[params[1]?.dataIndex].toLocaleString()}</div>
</div>`
}
},
color: ['#008CFF', '#69BCFF', '#FF5E5E', '#FF9500'],
legend: {
data: [`${res.currentYear}年断面流量`, `${res.yesYear}年断面流量`],
textStyle: {
color: '#fff',
fontSize: 12 // 12px
},
right: '4%',
top: '0%',
orient: 'horizontal',
type: 'scroll' //
},
};
@ -171,18 +189,51 @@ const handleGetSectionFlowCount = async () => {
console.log('fdjisfhhusahfdskf', data);
const yesReq: any = {
ProvinceCode: '530000',
StatisticsDate: moment().subtract(1, 'y').endOf('M').format('YYYY-MM-DD'),
StartDate: moment().subtract(1, 'y').startOf('y').format('YYYY-MM-DD'),
EndDate: moment().subtract(1, 'y').endOf('M').format('YYYY-MM-DD'),
}
let yesData = await handleGetMonthAnalysis(yesReq)
console.log('yesDatayesDatayesDatayesData', yesData);
// let list = data.slice(0, 5)
let category: string[] = []
let seriesData: number[] = []
let realData: string[] = []
let realData: number[] = []
if (data && data.length > 0) {
data.forEach((item: any) => {
category.push(`${item.Statistics_Month}`)
seriesData.push(Number((item.SectionFlow_Count / 10000).toFixed(2)))
realData.push(item.SectionFlow_Count)
})
}
let yesSeriesData: number[] = []
let yesRealData: number[] = []
if (yesData && yesData.length > 0) {
yesData.forEach((item: any) => {
yesSeriesData.push(Number((item.SectionFlow_Count / 10000).toFixed(2)))
yesRealData.push(item.SectionFlow_Count)
})
}
//
let addRateList: string[] = []
for (let i = 0; i < category.length; i++) {
let currentValue: number = realData[i]
let yesValue: number = yesRealData[i]
let add = ""
if (yesValue > 0 && currentValue > 0) {
add = (((currentValue - yesValue) / yesValue) * 100).toFixed(2)
}
addRateList.push(add)
}
// list.forEach((item: any) => {
// category.push(item.Serverpart_Name.split('')[0])
@ -193,7 +244,12 @@ const handleGetSectionFlowCount = async () => {
let res = {
category: category,// x
seriesData: seriesData,// y
realData: realData
realData: realData,
yesSeriesData: yesSeriesData,
yesRealData: yesRealData,
currentYear: moment().format('YYYY'),
yesYear: moment().subtract(1, 'y').format('YYYY'),
addRateList: addRateList
}
return res
@ -211,7 +267,7 @@ onBeforeUnmount(() => {
<template>
<div class="TrendOfTrafficFlowBox">
<SmallTitle :title="`断面流量趋势`" />
<SmallTitle :title="`断面流量`" />
<div class="TrendOfTrafficFlowCharts">
<div class="TrendOfTrafficFlow" id="TrendOfTrafficFlow"></div>

View File

@ -81,7 +81,7 @@ const handleGoMounted = async () => {
yAxis: [
{
type: 'value',
name: '营收金额(万元)',
name: '万元',
splitLine: {
show: false
},
@ -96,15 +96,16 @@ const handleGoMounted = async () => {
}
},
axisLabel: {
width: 60,
color: '#fff', // y
formatter: '{value}' //
}
}
],
grid: {
left: '10', //
right: '10', //
bottom: '10',
left: '0', //
right: '0', //
bottom: '0',
top: '50',
containLabel: true
},
@ -117,6 +118,16 @@ const handleGoMounted = async () => {
itemStyle: {
borderRadius: [3, 3, 0, 0],
color: '#008CFF' //
},
label: {
show: true,
position: 'top',
formatter: function (params: any) {
//
return res.addList && res.addList[params.dataIndex] ? `${res.addList[params.dataIndex]}%` : '';
},
color: '#fff', //
fontSize: 10 //
}
},
{
@ -138,7 +149,7 @@ const handleGoMounted = async () => {
formatter: function (params: any) {
let result = params[0].axisValue + '<br/>';
params.forEach((item: any, index: number) => {
result += `${item.marker} ${item.seriesName}: ${index === 0 ? res?.realData[item.dataIndex] : res?.realDataLastYear[item.dataIndex]}元<br/>`;
result += `${item.marker} ${item.seriesName}: ${index === 0 ? res?.realData[item.dataIndex].toLocaleString() : res?.realDataLastYear[item.dataIndex].toLocaleString()}元<br/>`;
});
return result;
}
@ -166,9 +177,9 @@ const handleGoMounted = async () => {
const handleGetData = async () => {
let category: number[] = []
let seriesData: number[] = []
let realData: string[] = []
let realData: number[] = []
let seriesDataLastYear: number[] = []
let realDataLastYear: string[] = []
let realDataLastYear: number[] = []
const req: any = {
@ -183,7 +194,7 @@ const handleGetData = async () => {
data.forEach((item: any) => {
category.push(item.name)
seriesData.push(Number((Number(item.value) / 10000).toFixed(2)))
realData.push(Number(item.value).toLocaleString())
realData.push(Number(item.value))
})
}
@ -198,7 +209,7 @@ const handleGetData = async () => {
if (lastYearData && lastYearData.length > 0) {
lastYearData.forEach((item: any) => {
seriesDataLastYear.push(Number((Number(item.value) / 10000).toFixed(2)))
realDataLastYear.push(Number(item.value).toLocaleString())
realDataLastYear.push(Number(item.value))
})
}
@ -206,6 +217,19 @@ const handleGetData = async () => {
console.log('lastYearDatalastYearDatalastYearDatalastYearDatalastYearData', lastYearData);
let addList: string[] = []
if (category && category.length > 0) {
for (let i = 0; i < category.length; i++) {
let current: number = realData[i]
let yes: number = realDataLastYear[i]
let add: string = ""
if (current > 0 && yes > 0) {
add = (((current - yes) / yes) * 100).toFixed(2)
}
addList.push(add)
}
}
let res: any = {
category: category,// x
seriesData: seriesData,//
@ -213,7 +237,8 @@ const handleGetData = async () => {
seriesDataLastYear: seriesDataLastYear,//
realDataLastYear: realDataLastYear,//
currentYear: moment().format('YYYY'),
lastYear: moment().subtract(1, 'y').format('YYYY')
lastYear: moment().subtract(1, 'y').format('YYYY'),
addList: addList
}
return res
}
@ -234,7 +259,7 @@ onBeforeUnmount(() => {
<template>
<div class="VehicleModelStayBox">
<!-- <SmallTitle :title="`车型停留分析/日均${searchTime ? `(${searchTime}月)` : ''}`"></SmallTitle> -->
<SmallTitle :title="`经营效益趋势`"></SmallTitle>
<SmallTitle :title="`经营效益`"></SmallTitle>
<div class="VehicleModelStayCharts" style="margin-top:15px">
<div class="VehicleModelStay" id="VehicleModelStay"></div>

View File

@ -86,10 +86,10 @@ const handleGoMounted = async () => {
type: 'scroll' //
},
grid: {
left: '3%',
right: '4%',
bottom: '3%',
top: '40%',
left: '0',
right: '0',
bottom: '0',
top: '40',
containLabel: true
},
xAxis: {
@ -118,15 +118,18 @@ const handleGoMounted = async () => {
padding: [0, 30, 0, 0] //
},
axisLabel: {
width: 60,
color: '#fff',
formatter: '{value}' //
},
axisLine: {
show: true, // y 线
lineStyle: {
color: '#fff' // y 线
}
},
splitLine: { show: false }
splitLine: { show: false },
splitNumber: 5,
},
// {
// type: 'value',
@ -148,6 +151,16 @@ const handleGoMounted = async () => {
yAxisIndex: 0,
itemStyle: {
borderRadius: [3, 3, 0, 0]
},
label: {
show: true,
position: 'top',
formatter: function (params: any) {
//
return res.carAdd && res.carAdd[params.dataIndex] ? `${res.carAdd[params.dataIndex]}%` : '';
},
color: '#fff', //
fontSize: 10 //
}
},
{
@ -239,18 +252,20 @@ const handleGoMounted = async () => {
yAxis: [
{
type: 'value',
name: '交易金额(万元)',
name: '万元',
splitLine: { show: false },
splitNumber: 4,
nameTextStyle: {
color: '#fff',
padding: [0, 0, 0, 10] //
padding: [0, 0, 0, 0] //
},
axisLabel: {
width: 60,
color: '#fff',
formatter: '{value}' //
},
axisLine: {
show: true, // y 线
lineStyle: {
color: '#fff' // y 线
}
@ -266,6 +281,16 @@ const handleGoMounted = async () => {
symbolSize: 6,
lineStyle: {
width: 2
},
label: {
show: true,
position: 'top',
formatter: function (params: any) {
//
return res.revenueAdd && res.revenueAdd[params.dataIndex] ? `${res.revenueAdd[params.dataIndex]}%` : '';
},
color: '#fff', //
fontSize: 10 //
}
},
{
@ -305,14 +330,16 @@ const handleGetSectionFlowCount = async () => {
const req: any = {
StartDate: moment().startOf('y').format('YYYY-MM-DD'),
EndDate: moment().subtract(1, 'd').format('YYYY-MM-DD'),
Serverpart_ID: props.currentService?.SERVERPART_ID || "1143,1144,1186,1188,1189,1190,1191,1192,1193,979,999,1023,1029,1030,1031,1033,1037,1041,1078,1087,1095,1137,1141,1147,1157,1159,1164,1165,1170,1174,981,985,987,994,1007,1009,1010,1012,1016,971,996,1002,1017,1018,1022,1027,1032,1073,1076,1099,1118,1122,1140,1142,1150,1171,970,969,978,1001,1005,1015,1050,1051,1052,1053,1064,1066,1096,1097,1101,1103,1104,1105,1106,1109,1112,1114,1115,1116,1117,991,995,1039,1080,1094,1100,1107,1123,1127,1133,1154,1155,1161,1163,1179,1180,1019,1021,1048,1049,1056,1059,1062,1063,1069,1093,1067,1228,1008,1070,1072,1166,1113,1148,1153,986,1086,1075,1182,1068,1226,1218,1088,1090,1058,1044,1084,1077,1089,1081,1091,1083,1162,1036,1092,988,993,1111,1158,1194,1202,1230,1198,1207,1216,1221,1203,1206,1209,1215,1227,1201,1205,1208,1214,1217,1229,1212,1065,1085,1055,1071,982,1168,1185,1110,977,1169,973,974,1011,1151,1121,1046,1045,1172,1146,976,1187,1156,1181,1136,1138,1211,983,1195,1131,1176,1167,1223,997,1252,1225,1043,1129,992,1149,975,1382,989,1047,1197,1025,1199,1183,1222,1178,1003,1013,1224,1139,1125,1173,1135,1038,1177,1060,1175,1184,1035,1026,1028,1079,1119,1120,1489"
ProvinceCode: 530000
// Serverpart_ID: props.currentService?.SERVERPART_ID || "1143,1144,1186,1188,1189,1190,1191,1192,1193,979,999,1023,1029,1030,1031,1033,1037,1041,1078,1087,1095,1137,1141,1147,1157,1159,1164,1165,1170,1174,981,985,987,994,1007,1009,1010,1012,1016,971,996,1002,1017,1018,1022,1027,1032,1073,1076,1099,1118,1122,1140,1142,1150,1171,970,969,978,1001,1005,1015,1050,1051,1052,1053,1064,1066,1096,1097,1101,1103,1104,1105,1106,1109,1112,1114,1115,1116,1117,991,995,1039,1080,1094,1100,1107,1123,1127,1133,1154,1155,1161,1163,1179,1180,1019,1021,1048,1049,1056,1059,1062,1063,1069,1093,1067,1228,1008,1070,1072,1166,1113,1148,1153,986,1086,1075,1182,1068,1226,1218,1088,1090,1058,1044,1084,1077,1089,1081,1091,1083,1162,1036,1092,988,993,1111,1158,1194,1202,1230,1198,1207,1216,1221,1203,1206,1209,1215,1227,1201,1205,1208,1214,1217,1229,1212,1065,1085,1055,1071,982,1168,1185,1110,977,1169,973,974,1011,1151,1121,1046,1045,1172,1146,976,1187,1156,1181,1136,1138,1211,983,1195,1131,1176,1167,1223,997,1252,1225,1043,1129,992,1149,975,1382,989,1047,1197,1025,1199,1183,1222,1178,1003,1013,1224,1139,1125,1173,1135,1038,1177,1060,1175,1184,1035,1026,1028,1079,1119,1120,1489"
}
const data = await handleGetMonthAnalysis(req)
const yesReq: any = {
StartDate: moment().subtract(1, 'y').startOf('y').format('YYYY-MM-DD'),
EndDate: moment().subtract(1, 'y').endOf('y').format('YYYY-MM-DD'),
Serverpart_ID: props.currentService?.SERVERPART_ID || "1143,1144,1186,1188,1189,1190,1191,1192,1193,979,999,1023,1029,1030,1031,1033,1037,1041,1078,1087,1095,1137,1141,1147,1157,1159,1164,1165,1170,1174,981,985,987,994,1007,1009,1010,1012,1016,971,996,1002,1017,1018,1022,1027,1032,1073,1076,1099,1118,1122,1140,1142,1150,1171,970,969,978,1001,1005,1015,1050,1051,1052,1053,1064,1066,1096,1097,1101,1103,1104,1105,1106,1109,1112,1114,1115,1116,1117,991,995,1039,1080,1094,1100,1107,1123,1127,1133,1154,1155,1161,1163,1179,1180,1019,1021,1048,1049,1056,1059,1062,1063,1069,1093,1067,1228,1008,1070,1072,1166,1113,1148,1153,986,1086,1075,1182,1068,1226,1218,1088,1090,1058,1044,1084,1077,1089,1081,1091,1083,1162,1036,1092,988,993,1111,1158,1194,1202,1230,1198,1207,1216,1221,1203,1206,1209,1215,1227,1201,1205,1208,1214,1217,1229,1212,1065,1085,1055,1071,982,1168,1185,1110,977,1169,973,974,1011,1151,1121,1046,1045,1172,1146,976,1187,1156,1181,1136,1138,1211,983,1195,1131,1176,1167,1223,997,1252,1225,1043,1129,992,1149,975,1382,989,1047,1197,1025,1199,1183,1222,1178,1003,1013,1224,1139,1125,1173,1135,1038,1177,1060,1175,1184,1035,1026,1028,1079,1119,1120,1489"
ProvinceCode: 530000
// Serverpart_ID: props.currentService?.SERVERPART_ID || "1143,1144,1186,1188,1189,1190,1191,1192,1193,979,999,1023,1029,1030,1031,1033,1037,1041,1078,1087,1095,1137,1141,1147,1157,1159,1164,1165,1170,1174,981,985,987,994,1007,1009,1010,1012,1016,971,996,1002,1017,1018,1022,1027,1032,1073,1076,1099,1118,1122,1140,1142,1150,1171,970,969,978,1001,1005,1015,1050,1051,1052,1053,1064,1066,1096,1097,1101,1103,1104,1105,1106,1109,1112,1114,1115,1116,1117,991,995,1039,1080,1094,1100,1107,1123,1127,1133,1154,1155,1161,1163,1179,1180,1019,1021,1048,1049,1056,1059,1062,1063,1069,1093,1067,1228,1008,1070,1072,1166,1113,1148,1153,986,1086,1075,1182,1068,1226,1218,1088,1090,1058,1044,1084,1077,1089,1081,1091,1083,1162,1036,1092,988,993,1111,1158,1194,1202,1230,1198,1207,1216,1221,1203,1206,1209,1215,1227,1201,1205,1208,1214,1217,1229,1212,1065,1085,1055,1071,982,1168,1185,1110,977,1169,973,974,1011,1151,1121,1046,1045,1172,1146,976,1187,1156,1181,1136,1138,1211,983,1195,1131,1176,1167,1223,997,1252,1225,1043,1129,992,1149,975,1382,989,1047,1197,1025,1199,1183,1222,1178,1003,1013,1224,1139,1125,1173,1135,1038,1177,1060,1175,1184,1035,1026,1028,1079,1119,1120,1489"
}
const yesData = await handleGetMonthAnalysis(yesReq)
@ -349,6 +376,29 @@ const handleGetSectionFlowCount = async () => {
}
let carAdd: string[] = []
let revenueAdd: string[] = []
if (category && category.length > 0) {
for (let i = 0; i < category.length; i++) {
let currentCar: number = realDataCar[i]
let yesCar: number = yesRealDataCar[i]
let add: string = ''
if (currentCar > 0 && yesCar > 0) {
add = (((currentCar - yesCar) / yesCar) * 100).toFixed(2)
}
carAdd.push(add)
let addRenvenue: string = ""
let currentRevenue: number = realDataRevenue[i]
let yesRevenue: number = yesRealDataRevenue[i]
if (currentRevenue > 0 && yesRevenue > 0) {
addRenvenue = (((currentRevenue - yesRevenue) / yesRevenue) * 100).toFixed(2)
}
revenueAdd.push(addRenvenue)
}
}
let res: any = {
category: category,// x
@ -361,7 +411,9 @@ const handleGetSectionFlowCount = async () => {
yesRealDataCar: yesRealDataCar,//
yesRealDataRevenue: yesRealDataRevenue,//
currentYear: moment().format('YYYY'), //
yesYear: moment().subtract(1, 'y').format('YYYY')//
yesYear: moment().subtract(1, 'y').format('YYYY'),//
carAdd: carAdd,//
revenueAdd: revenueAdd,//
}
console.log('fdshufahsudifhasdjkfh', res);
@ -391,7 +443,7 @@ onBeforeUnmount(() => {
<template>
<div class="VehiclesEnteringBox">
<SmallTitle :title="'入区车流趋势'">
<SmallTitle :title="'入区车流'">
<!-- <template #extra>
<div class="legendBox" style="display: flex;align-items: center;">
<div class="legendItem" style="display: flex;align-items: center;margin-right: 20px;">
@ -422,7 +474,7 @@ onBeforeUnmount(() => {
</div>
<SmallTitle :title="'对客营收趋势'" style="margin-top: 23px;" />
<SmallTitle :title="'对客营收'" style="margin-top: 23px;" />
<div class="TrendCustomerRevenueCharts">
<div class="TrendCustomerRevenue" id="TrendCustomerRevenue"></div>

View File

@ -20,5 +20,8 @@
.newBigTitleBoxLong {
background-image: url(../../../../assets/image/newTitleLongBg.png);
}
.newThreeBigTitleBoxLong {
background-image: url(../../../../assets/image/titleThreeBg.png);
}

View File

@ -13,7 +13,8 @@ const props = defineProps<{
<template>
<div :class="type === 2 ? 'newBigTitleBox newBigTitleBoxLong' : 'newBigTitleBox'">
<div
:class="type === 2 ? 'newBigTitleBox newBigTitleBoxLong' : type === 3 ? 'newBigTitleBox newThreeBigTitleBoxLong' : 'newBigTitleBox'">
{{ props?.title || "" }}
<slot name="extra"></slot>
</div>

View File

@ -8,6 +8,7 @@
align-items: center;
padding: 0 10px;
box-sizing: border-box;
cursor: pointer;
.noticeIcon {
width: 18px;

View File

@ -13,6 +13,8 @@ let currentIndex = ref<number>(0)
let scrollInterval = ref<any>(null)
let isScrolling = ref<boolean>(false);
let scrollDuration = ref('10s'); //
// id
let serverpartId = ref<number[]>([])
onMounted(async () => {
//
@ -26,6 +28,11 @@ const props = defineProps<{
selectPageTab?: number
}>();
//
const emit = defineEmits<{
(e: "handelGetNoticeListAllId", idList: number[]): void; //
}>();
//
watch(
() => props.currentService,
@ -61,10 +68,62 @@ const handleGetNoticeList = async () => {
appId: "wxee018fb96955552a"
}
const data = await handleGetGDNearServiceList(req)
let list: any = data
// let list: any = data
console.log('listlistlistlist', data);
let list: any = [
{
NOTICEINFO_TITLE: "云南省蒙新高速蒙自服务区(下行)招商信息公告",
SERVERPART_ID: 1187
},
{
NOTICEINFO_TITLE: "云南省景海高速景洪服务区(双侧)招商信息公告",
SERVERPART_ID: 1176
},
{
NOTICEINFO_TITLE: "云南省景海高速勐海服务区(双侧)招商信息公告",
SERVERPART_ID: 1177
},
{
NOTICEINFO_TITLE: "云南省大南高速大仓服务区(双侧)招商信息公告",
SERVERPART_ID: 971
},
{
NOTICEINFO_TITLE: "云南省大南高速巍山服务区(双侧)招商信息公告",
SERVERPART_ID: 973
},
{
NOTICEINFO_TITLE: "云南省南景高速拥翠服务区(双侧)招商信息公告",
SERVERPART_ID: 970
},
{
NOTICEINFO_TITLE: "云南省南景高速三岔河服务区(双侧)招商信息公告",
SERVERPART_ID: 1109
},
{
NOTICEINFO_TITLE: "云南省南景高速景东北停车区(双侧)招商信息公告",
SERVERPART_ID: 1110
},
{
NOTICEINFO_TITLE: "云南省思澜高速龙潭服务区(双侧)招商信息公告",
SERVERPART_ID: 1161
},
{
NOTICEINFO_TITLE: "云南省思澜高速糯扎渡服务区(双侧)招商信息公告",
SERVERPART_ID: 1163
}
]
let allServerpartId: number[] = []
noticeList.length = 0;
list && list.forEach((item: any) => noticeList.push(item));
list && list.forEach((item: any) => {
noticeList.push(item)
allServerpartId.push(item.SERVERPART_ID)
});
serverpartId.value = allServerpartId
console.log('noticeList:', noticeList); //
nextTick(() => {
//
@ -132,6 +191,12 @@ const stopScrolling = () => {
// }
}
//
const handleClickBigBox = () => {
console.log('serverpartId.valueserverpartId.valueserverpartId.value', serverpartId.value);
emit('handelGetNoticeListAllId', serverpartId.value)
}
onUnmounted(() => {
// //
// if (scrollTimer) {
@ -151,7 +216,7 @@ onUnmounted(() => {
<template>
<!-- 横向滚动 -->
<div class="noticeListBigBox">
<div class="noticeListBigBox" @click="handleClickBigBox">
<img class="noticeIcon" :src="noticeIcon" />
<div class="noticeListBox">
<div :class="['noticeList', `noticeList${props.selectPageTab}`, { 'scrolling': isScrolling }]"

View File

@ -127,7 +127,6 @@ const handleGetNowWeather = async () => {
const emit = defineEmits<{
(e: "handleChangePageType"): void; //
(e: "handleChangePageTab", value: number): void; //
}>();
const handleChangePageType = () => {

View File

@ -58,7 +58,8 @@ import DetailedPayment from './components/DetailedPayment/DetailedPayment.vue';
import DailyInspection from './components/DailyInspection/DailyInspection.vue';
import AssessmentScoringRanking from './components/AssessmentScoringRanking/AssessmentScoringRanking.vue';
import SmallTitle from './components/smallTitle/smallTitle.vue';
import FestivalRevenueSumInfo from './components/FestivalRevenueSumInfo/FestivalRevenueSumInfo.vue'
import AIIcon from '../../assets/image/AIIcon.png'
//
let pageType = ref<string>("center")
@ -80,6 +81,14 @@ let FestivalValue = ref<number>(5)
let currentService = ref<any>({})
// tab
let selectPageTab = ref<number>(1)
// id
let noticeAllServicePartId = ref<number[]>([])
//
let showDialogBox = ref<boolean>(false)
//
let searchText = ref<string>('')
//
let isPrinting = ref<boolean>(false)
//
@ -93,7 +102,7 @@ const handleChangePageType = () => {
//
const handleGetCurrentService = (obj: any) => {
currentService.value = obj
// currentService.value = obj
}
// tab
@ -102,6 +111,30 @@ const handleChangePageTab = (value: number) => {
currentService.value = null
}
// id
const handelGetNoticeListAllId = (idList: number[]) => {
noticeAllServicePartId.value = idList
}
//
const handleMapToChangeNotice = () => {
noticeAllServicePartId.value = []
}
// AI
const handleClickAIBox = () => {
showDialogBox.value = !showDialogBox.value
}
//
const handleSubmit = () => {
}
//
const handleStopPrint = () => {
}
</script>
<template>
@ -114,11 +147,11 @@ const handleChangePageTab = (value: number) => {
</div>
<!-- 分区一 -->
<div class="content169" v-show="selectPageTab === 1 || selectPageTab === 3">
<div class="content169" v-show="selectPageTab === 1">
<div class="content169Left">
<!-- 消息轮播框 -->
<NoticeListBox v-if="selectPageTab === 1" :currentService="currentService"
:selectPageTab="selectPageTab" />
:selectPageTab="selectPageTab" @handelGetNoticeListAllId="handelGetNoticeListAllId" />
<!-- <modalTitle :title="'流量趋势'" style="margin-top: 20px;" /> -->
@ -140,7 +173,7 @@ const handleChangePageTab = (value: number) => {
</div>
</div>
<div v-if="selectPageTab === 3">
<div v-if="false">
<NewBigTitleBox title="应收账款" style="margin-top: 20px;" />
<div style="width: 100%;box-sizing: border-box;padding: 20px 11px;">
<!-- 合同信息 -->
@ -162,19 +195,39 @@ const handleChangePageTab = (value: number) => {
<!-- 核心经营数据 -->
<CoreBusinessData :currentService="currentService" style="position: relative;z-index: 9;" />
<div v-show="selectPageTab === 1 && !showDialogBox">
<!-- 地图 -->
<PageMap @handleGetCurrentService="handleGetCurrentService"
:selectPointServicePart="noticeAllServicePartId"
@handleMapToChangeNotice="handleMapToChangeNotice" />
</div>
<div class="AIDialogBox" v-show="selectPageTab === 1 && showDialogBox">
<div class="dialogBox"></div>
<div class="inputBox">
<el-input class="searchText" placeholder="Hi,您好!请输入您想了解的内容..." v-model="searchText"
@keyup.enter="handleSubmit()" />
<img v-if="isPrinting" class="searchIcon" src="../../assets/image/stopIcon.png"
@click="handleStopPrint()" />
<img v-if="!isPrinting" class="searchIcon" src="../../assets/image/searchIconBlue.png"
@click="handleSubmit()" />
</div>
</div>
<!-- 地图 -->
<PageMap @handleGetCurrentService="handleGetCurrentService" />
<!-- 公告主题 -->
<!-- <AnnouncementTopic style="position: relative;z-index: 9;" /> -->
<!-- AI图标对话 -->
<div class="AIBox" @click="handleClickAIBox">
<img class="AIIcon" :src="AIIcon" />
</div>
</div>
<div class="content169Right">
<!-- 时间天气等内容 -->
<BasicMessageBox :currentService="currentService" />
<div v-show="selectPageTab === 1">
<div v-if="selectPageTab === 1">
<NewBigTitleBox title="流量趋势" style="margin-top: 24px;" />
<div class="content169LeftContent" style="margin-top: 21px;">
@ -201,7 +254,7 @@ const handleChangePageTab = (value: number) => {
</div>
</div>
<div v-if="selectPageTab === 3">
<div v-if="false">
<NewBigTitleBox :title="'应收账款'" style="margin-top: 20px;" />
<div style="width: 100%;box-sizing: border-box;padding: 16px 11px 0;">
<!-- 签约客户 -->
@ -230,69 +283,80 @@ const handleChangePageTab = (value: number) => {
<div class="content1692st" v-if="selectPageTab === 2">
<div class="content1692stLeft">
<!-- 消息轮播框 -->
<NoticeListBox style="margin-top: 20px;width: 50%;" :selectPageTab="selectPageTab" />
<NoticeListBox style="margin-top: 20px;width: calc(100% / 3);" :selectPageTab="selectPageTab" />
<!-- 核心经营数据 -->
<!-- <modalTitle :title="'核心经营数据'" style="margin-top: 20px;" /> -->
<!-- <CoreBusinessData style="position: relative;z-index: 9;" :noTitle="true" /> -->
<!-- 客群画像分析 -->
<NewBigTitleBox :title="'客群画像分析'" :type="2" style="margin-top: 20px" />
<NewBigTitleBox :title="'客群画像分析'" :type="3" style="margin-top: 20px" />
<div class="leftBottomContent">
<!-- 年龄 -->
<CustomerAgeGroup style="margin-top: 20px;" />
<CustomerAgeGroup style="margin-top: 20px;width: calc(100% / 3);" />
<!-- 性别 -->
<GenderCustomerGroup style="margin-left: 20px;margin-top: 20px;" />
<GenderCustomerGroup style="margin-left: 20px;margin-top: 20px;width: calc(100% / 3);" />
<!-- 停留时长 -->
<!-- <CustomerGroupStay style="margin-left: 20px;margin-top: 20px;" /> -->
<!-- 偏好类型 -->
<PreferenceType style="margin-left: 20px;margin-top: 20px;" />
<PreferenceType style="margin-left: 20px;margin-top: 20px;width: calc(100% / 3);" />
</div>
<div class="left3stBottom" style="margin-top: 0;">
<div class="left3stBottom"
style="margin-top: 0;display: flex;justify-content: space-between;flex-wrap: wrap;">
<div class="left3stBottomItem">
<div class="left3stBottomItem" style="width: calc(100% / 3);">
<!-- 客群特征分析 -->
<CustomerGroup style="margin-top: 15px;" />
</div>
<div class="left3stBottomItem">
<div class="left3stBottomItem" style="width: calc(100% / 3 * 2);">
<!-- 客群消费偏好 -->
<CustomerConsumptionPreferences style="margin-top: 15px;" />
</div>
<!-- <div class="left3stBottomItem">
</div> -->
</div>
<!-- 交易画像分析 -->
<NewBigTitleBox title="交易画像分析" :type="2" style="margin-top: 15px;" />
<NewBigTitleBox title="交易画像分析" :type="3" style="margin-top: 15px;" />
<div class="left3stBottom" style="margin-top: 0;">
<div class="left3stBottomItem">
<!-- 消费转化率对比图 -->
<ConsumptionConversion style="margin-top: 15px;" />
<div class="left3stBottomItemLeft">
<div class="left3stBottomItem">
<!-- 消费转化率对比图 -->
<ConsumptionConversion style="margin-top: 15px;" />
</div>
<div class="left3stBottomItem">
<!-- 消费水平 -->
<ConsumptionLevel style="margin-top: 15px;" />
</div>
<div class="left3stBottomItem">
<!-- 消费时段分析 -->
<ConsumptionPeriod style="margin-top: 15px;" />
</div>
<div class="left3stBottomItem">
<!-- 品牌消费水平 -->
<BrandConsumptionLevel style="margin-top: 15px;" />
</div>
</div>
<div class="left3stBottomItem">
<!-- 消费水平 -->
<ConsumptionLevel style="margin-top: 15px;" />
<div class="left3stBottomItemRight">
<BusinessCase :currentService="currentService" />
</div>
<div class="left3stBottomItem">
<!-- 消费时段分析 -->
<ConsumptionPeriod style="margin-top: 15px;" />
</div>
<div class="left3stBottomItem">
<!-- 品牌消费水平 -->
<BrandConsumptionLevel style="margin-top: 15px;" />
</div>
</div>
</div>
<div class="content1692stCenter">
<div class="content1692stCenter" v-if="false">
<NewBigTitleBox :title="'月度经营情况'" />
<div style="width: 100%;box-sizing: border-box;padding: 20px 11px 0;">
@ -339,8 +403,8 @@ const handleChangePageTab = (value: number) => {
</template>
</NewBigTitleBox>
<!-- 节假日营收分析 -->
<FestivalRevenue :currentService="currentService" :FestivalValue="FestivalValue" />
<!-- <FestivalRevenue :currentService="currentService" :FestivalValue="FestivalValue" /> -->
<FestivalRevenueSumInfo :currentService="currentService" :FestivalValue="FestivalValue" />
@ -366,7 +430,7 @@ const handleChangePageTab = (value: number) => {
<!-- 分区三 -->
<div class="content1693st" v-if="selectPageTab === 99999">
<div class="content1693st" v-if="selectPageTab === 3">
<div class="content1693stItem">
<!-- 消息轮播框 -->
<NoticeListBox :currentService="currentService" :selectPageTab="selectPageTab" />

View File

@ -319,6 +319,60 @@
padding-top: 66px;
display: flex;
flex-direction: column;
.AIBox {
position: absolute;
bottom: 100px;
right: calc((100% - 90px) / 4 + 30px);
z-index: 10;
cursor: pointer;
.AIIcon {
width: 40px;
height: 40px;
}
}
.AIDialogBox {
width: 100%;
height: calc(100% - 108px);
box-sizing: border-box;
padding: 32px 32px 32px 8px;
.dialogBox {
width: 100%;
height: calc(100% - 80px);
margin-bottom: 20px;
}
.inputBox {
width: 100%;
box-sizing: border-box;
padding: 12px;
display: flex;
align-items: center;
.searchText {
width: calc(100% - 50px);
.el-input__wrapper {
background-color: transparent !important;
.el-input__inner {
color: #fff !important;
}
}
}
.searchIcon {
width: 24px;
height: 24px;
margin-left: 6px;
cursor: pointer;
}
}
}
}
.content169Right {
@ -385,7 +439,8 @@
.content1692stLeft {
// width: 47%;
width: calc((100% - 90px) / 4 * 2 + 30px);
// width: calc((100% - 90px) / 4 * 2 + 30px);
width: calc((100% - 30px) / 4 * 3);
height: 100%;
.leftBottomContent {
@ -402,14 +457,24 @@
margin-top: 20px;
box-sizing: border-box;
padding: 0 26px;
display: flex;
justify-content: space-between;
flex-wrap: wrap;
.left3stBottomItem {
width: calc((100% - 30px) / 2);
// width: calc((100% - 56px) / 2);
height: 214px;
.left3stBottomItemLeft {
width: calc(100% / 3 * 2);
display: inline-flex;
justify-content: space-between;
flex-wrap: wrap;
.left3stBottomItem {
width: 50%;
// width: calc((100% - 30px) / 2);
// width: calc((100% - 56px) / 2);
height: 214px;
}
}
.left3stBottomItemRight {
width: calc(100% / 3);
display: inline-flex;
}
}
}
@ -428,7 +493,8 @@
}
.content1692stRight {
width: 22%;
// width: 22%;
width: calc((100% - 30px) / 4);
height: 100%;
.left5stContent {

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/annualaccountsreceivable/annualaccountsreceivable.vue","./src/page/index/components/assessmentscoring/assessmentscoring.vue","./src/page/index/components/assessmentscoringranking/assessmentscoringranking.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/contractinformation/contractinformation.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/dailyinspection/dailyinspection.vue","./src/page/index/components/deductiontype/deductiontype.vue","./src/page/index/components/detailedpayment/detailedpayment.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/signedclients/signedclients.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/vehiclemodelstay/vehiclemodelstay.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"}
{"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/annualaccountsreceivable/annualaccountsreceivable.vue","./src/page/index/components/assessmentscoring/assessmentscoring.vue","./src/page/index/components/assessmentscoringranking/assessmentscoringranking.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/contractinformation/contractinformation.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/dailyinspection/dailyinspection.vue","./src/page/index/components/deductiontype/deductiontype.vue","./src/page/index/components/detailedpayment/detailedpayment.vue","./src/page/index/components/festivalrevenue/festivalrevenue.vue","./src/page/index/components/festivalrevenuesuminfo/festivalrevenuesuminfo.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/signedclients/signedclients.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/vehiclemodelstay/vehiclemodelstay.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"}