This commit is contained in:
ylj20011123 2025-06-12 17:33:07 +08:00
parent 77aa9d2251
commit 8d08edf247
29 changed files with 1324 additions and 504 deletions

View File

@ -37,6 +37,8 @@ const tabList = [
// tab // tab
let selectTab = ref<number>(1) let selectTab = ref<number>(1)
// //
let AccountsReceivableWarning2 = ref<any>()
//
let AccountsReceivableWarning = ref<any>() let AccountsReceivableWarning = ref<any>()
// //
let legendList = ref<any>([]) let legendList = ref<any>([])
@ -50,7 +52,7 @@ onMounted(async () => {
// //
const handleGetData = async () => { const handleGetData = async () => {
let category: string[] = [] let category: string[] = []
let seriesData: number[] = [] let seriesData: any = []
let realData: string[] = [] let realData: string[] = []
const req: any = { const req: any = {
@ -63,14 +65,15 @@ const handleGetData = async () => {
// //
let ArrearageList = data.ArrearageList let ArrearageList = data.ArrearageList
data.Arrearage_Amount = Number(data.Arrearage_Amount.toFixed(2)).toLocaleString()
AccountsReceivableWarning.value = data AccountsReceivableWarning2.value = data
if (ArrearageList && ArrearageList.length > 0) { if (ArrearageList && ArrearageList.length > 0) {
ArrearageList.forEach((item: any) => { ArrearageList.forEach((item: any) => {
category.push(item.Overdue_Situation) category.push(item.Overdue_Situation)
seriesData.push(item.Arrearage_Amount) // seriesData.push(item.ArrearageContract_Count)
seriesData.push({ name: item.Overdue_Situation, value: item.ArrearageContract_Count })
}) })
} }
@ -111,7 +114,7 @@ const handleHaveFirstPie = async () => {
}, },
formatter: function (params: any) { formatter: function (params: any) {
return ` return `
<div style="font-weight:bold">${params.name} ${params.value}%</div> <div style="font-weight:bold">${params.name} ${params.value}</div>
`; `;
} }
}, },
@ -259,16 +262,18 @@ const handleHaveSecond = async () => {
myChart2.setOption(option); myChart2.setOption(option);
myChart2.resize(); myChart2.resize();
window.addEventListener('resize', resizeChart); window.addEventListener('resize', resizeChart2);
} }
const resizeChart = () => { const resizeChart = () => {
myChart?.resize(); myChart?.resize();
};
const resizeChart2 = () => {
myChart2?.resize(); myChart2?.resize();
}; };
onBeforeUnmount(() => { onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart); window.removeEventListener('resize', resizeChart);
window.removeEventListener('resize', resizeChart2);
myChart?.dispose(); myChart?.dispose();
myChart2?.dispose(); myChart2?.dispose();
}); });
@ -298,7 +303,7 @@ onBeforeUnmount(() => {
<div class="progressPieTopItemLabel">应收欠款(全部)</div> <div class="progressPieTopItemLabel">应收欠款(全部)</div>
<div class="progressPieTopItemValueBox"> <div class="progressPieTopItemValueBox">
<span class="progressPieTopItemValue">{{ <span class="progressPieTopItemValue">{{
AccountsReceivableWarning?.Arrearage_Amount || '-' }}</span> AccountsReceivableWarning2?.Arrearage_Amount || '-' }}</span>
<span class="progressPieTopItemUnit">万元</span> <span class="progressPieTopItemUnit">万元</span>
</div> </div>
</div> </div>
@ -306,7 +311,7 @@ onBeforeUnmount(() => {
<div class="progressPieTopItemLabel">欠款合同</div> <div class="progressPieTopItemLabel">欠款合同</div>
<div class="progressPieTopItemValueBox"> <div class="progressPieTopItemValueBox">
<span class="progressPieTopItemValue">{{ <span class="progressPieTopItemValue">{{
AccountsReceivableWarning?.ArrearageContract_Count || '-' }}</span> AccountsReceivableWarning2?.ArrearageContract_Count || '-' }}</span>
<span class="progressPieTopItemUnit"></span> <span class="progressPieTopItemUnit"></span>
</div> </div>
</div> </div>

View File

@ -6,7 +6,7 @@ import { handleGetExamineResultList } from '../../service';
// //
let rankList: any = ref<any>([{}, {}, {}, {}, {}]) let rankList: any = ref<any>([])
onMounted(async () => { onMounted(async () => {
await handleGetData() await handleGetData()
@ -19,7 +19,7 @@ const handleGetData = async () => {
DataType: 1, DataType: 1,
StartMonth: "202501", StartMonth: "202501",
EndMonth: "202501", EndMonth: "202501",
provinceCode: "340000", provinceCode: "530000",
} }
const data = await handleGetExamineResultList(req) const data = await handleGetExamineResultList(req)

View File

@ -36,10 +36,10 @@ onMounted(async () => {
const option = { const option = {
legend: { legend: {
selectedMode: false, // selectedMode: false,
right: 0, right: 0,
textStyle: { textStyle: {
color: '#666', color: '#fff',
fontSize: 12, fontSize: 12,
padding: [0, 0, 0, 5] padding: [0, 0, 0, 5]
}, },

View File

@ -72,11 +72,10 @@ const handleGoMounted = async () => {
itemWidth: 12, // itemWidth: 12, //
itemHeight: 12, // itemHeight: 12, //
textStyle: { textStyle: {
color: '#666', // color: '#fff', //
rich: { rich: {
// //
value: { value: {
color: '#333',
fontWeight: 'bold', fontWeight: 'bold',
padding: [0, 0, 0, 5] // padding: [0, 0, 0, 5] //
} }

View File

@ -67,11 +67,13 @@
.BusinessCaseRightItem { .BusinessCaseRightItem {
flex: 1; flex: 1;
display: flex;
align-items: flex-end;
justify-content: space-between;
.rightItemLeft { .BusinessCaseRightItemTop {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.rightItemTitle { .rightItemTitle {
font-family: Microsoft YaHei, Microsoft YaHei; font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400; font-weight: 400;
@ -82,10 +84,26 @@
margin-top: 5px; margin-top: 5px;
} }
.rightItemBottom { .rightItemUpdate {
margin-top: 8px; font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #78828E;
text-align: left;
font-style: normal;
}
}
.BusinessCaseRightItemBottom {
width: 100%;
display: flex;
align-items: flex-end;
justify-content: space-between;
margin-top: 8px;
.BusinessCaseItemBottomLeft {
display: flex; display: flex;
align-items: center; align-items: flex-end;
.compareTitle { .compareTitle {
font-family: Inter, Inter; font-family: Inter, Inter;
@ -98,50 +116,142 @@
.changeBox { .changeBox {
margin-left: 5px; margin-left: 5px;
display: flex;
align-items: center;
.changeIcon { .changeIcon {
width: 6px; width: 6px;
height: 8px; height: 8px;
margin-right: 2px; margin-right: 2px;
display: block;
} }
.changeText { .changeText {
font-family: Microsoft YaHei, Microsoft YaHei; font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400; font-weight: 400;
font-size: 10px; font-size: 12px;
color: #00FF00; color: #00FF00;
text-align: left; text-align: left;
font-style: normal; font-style: normal;
} }
} }
} }
}
.BusinessCaseItemBottomRight {
display: flex;
align-items: flex-end;
.rightItemRight { .BusinessCaseRevenueValue {
display: flex; font-family: Impact, Impact;
align-items: center; font-weight: 400;
font-size: 25px;
color: #FFFFFF;
letter-spacing: 2px;
text-align: right;
font-style: normal;
}
.BusinessCaseRevenueValue { .BusinessCaseRevenueUnit {
font-family: Impact, Impact; font-family: Inter, Inter;
font-weight: 400; font-weight: 400;
font-size: 25px; font-size: 12px;
color: #FFFFFF; color: #788390;
letter-spacing: 2px; text-align: right;
text-align: right; font-style: normal;
font-style: normal; margin-left: 10px;
} }
.BusinessCaseRevenueUnit {
font-family: Inter, Inter;
font-weight: 400;
font-size: 12px;
color: #788390;
text-align: right;
font-style: normal;
margin-left: 10px;
} }
} }
// .rightItemLeft {
// .rightItemTitleBox {
// width: 100%;
// display: flex;
// align-items: center;
// justify-content: space-between;
// .rightItemTitle {
// font-family: Microsoft YaHei, Microsoft YaHei;
// font-weight: 400;
// font-size: 14px;
// color: #FFFFFF;
// text-align: left;
// font-style: normal;
// margin-top: 5px;
// }
// .rightItemUpdate {
// font-family: Inter, Inter;
// font-weight: 400;
// font-size: 12px;
// color: #FFFFFF;
// text-align: left;
// font-style: normal;
// }
// }
// .rightItemBottom {
// margin-top: 8px;
// display: flex;
// align-items: center;
// .compareTitle {
// font-family: Inter, Inter;
// font-weight: 400;
// font-size: 12px;
// color: #78828E;
// text-align: left;
// font-style: normal;
// }
// .changeBox {
// margin-left: 5px;
// .changeIcon {
// width: 6px;
// height: 8px;
// margin-right: 2px;
// }
// .changeText {
// font-family: Microsoft YaHei, Microsoft YaHei;
// font-weight: 400;
// font-size: 10px;
// color: #00FF00;
// text-align: left;
// font-style: normal;
// }
// }
// }
// }
// .rightItemRight {
// display: flex;
// align-items: center;
// .BusinessCaseRevenueValue {
// font-family: Impact, Impact;
// font-weight: 400;
// font-size: 25px;
// color: #FFFFFF;
// letter-spacing: 2px;
// text-align: right;
// font-style: normal;
// }
// .BusinessCaseRevenueUnit {
// font-family: Inter, Inter;
// font-weight: 400;
// font-size: 12px;
// color: #788390;
// text-align: right;
// font-style: normal;
// margin-left: 10px;
// }
// }
} }
} }

View File

@ -16,6 +16,8 @@ import {
TransformComponent // 使 dataset.source TransformComponent // 使 dataset.source
} from 'echarts/components'; } from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers'; import { CanvasRenderer } from 'echarts/renderers';
import addIcon from '../../../../assets/image/addIcon.png'
import reduce from '../../../../assets/image/reduce.png'
@ -47,6 +49,8 @@ let selectTab = ref<number>(1)
// //
let realData = ref<any>() let realData = ref<any>()
//
let getAllData = ref<any>()
// //
const props = defineProps<{ const props = defineProps<{
@ -78,7 +82,6 @@ const handleChangeTab = async (value: number) => {
// //
const handleGetData = async () => { const handleGetData = async () => {
const req: any = { const req: any = {
ProvinceCode: "340000", ProvinceCode: "340000",
StatisticsDate: moment().subtract(1, 'd').format('YYYY-MM-DD'), StatisticsDate: moment().subtract(1, 'd').format('YYYY-MM-DD'),
@ -88,6 +91,8 @@ const handleGetData = async () => {
const data = await handleCodeGetRevenueCompare(req) const data = await handleCodeGetRevenueCompare(req)
console.log('djsakjdaskldjasoifioad', data); console.log('djsakjdaskldjasoifioad', data);
getAllData.value = data
// //
let category: any = ['product'] let category: any = ['product']
let monthList: number[] = [] let monthList: number[] = []
@ -110,7 +115,7 @@ const handleGetData = async () => {
let list: any = [`${item}`] let list: any = [`${item}`]
data.RevenueAmountList.forEach((subItem: any) => { data.RevenueAmountList.forEach((subItem: any) => {
let newData: any = subItem.data let newData: any = subItem.data
list.push(newData[item - 1][1]) list.push(Number(((newData[item - 1][1]) / 10000).toFixed(2)))
}) })
res.push(list) res.push(list)
}) })
@ -123,7 +128,7 @@ const handleGetData = async () => {
let list: any = [`${item}`] let list: any = [`${item}`]
data.TicketCountList.forEach((subItem: any) => { data.TicketCountList.forEach((subItem: any) => {
let newData: any = subItem.data let newData: any = subItem.data
list.push(newData[item - 1][1]) list.push(Number(((newData[item - 1][1]) / 10000).toFixed(2)))
}) })
res2.push(list) res2.push(list)
}) })
@ -180,13 +185,13 @@ const handleGetBottomData = async () => {
if (data && data.length > 0) { if (data && data.length > 0) {
data.forEach((item: any) => { data.forEach((item: any) => {
currentYear.push(item.value) currentYear.push(Number((Number(item.value) / 10000).toFixed(2)))
}) })
} }
if (yesData && yesData.length > 0) { if (yesData && yesData.length > 0) {
yesData.forEach((item: any) => { yesData.forEach((item: any) => {
lastYear.push(item.value) lastYear.push(Number((Number(item.value) / 10000).toFixed(2)))
}) })
} }
@ -202,6 +207,9 @@ const handleGetBottomData = async () => {
const handleShowData = async (value: number) => { const handleShowData = async (value: number) => {
let data = realData.value[value] let data = realData.value[value]
console.log('fjidufasdhfsdjfsdn', data);
const chartDom = document.getElementById('featureAnalysis'); const chartDom = document.getElementById('featureAnalysis');
if (!chartDom) return; if (!chartDom) return;
@ -221,16 +229,36 @@ const handleShowData = async (value: number) => {
type: 'category', type: 'category',
axisLabel: { axisLabel: {
interval: 0, interval: 0,
color: '#fff',
formatter: '{value}' //
},
axisLine: {
lineStyle: {
color: '#fff' // y 线
}
}, },
axisTick: { axisTick: {
show: false // 线 show: false // 线
} }
}, },
yAxis: { yAxis: {
splitLine: { show: false }, name: `${selectTab.value === 1 ? '营收金额(万元)' : selectTab.value === 2 ? '客单量(万笔)' : selectTab.value === 3 ? '客单均价(元)' : ''}`,
splitLine: { show: false }, // 线
axisLine: {
show: true, // Y线
lineStyle: {
color: '#fff' // 线
}
},
axisTick: {
show: false // 线线
},
axisLabel: { axisLabel: {
width: 40, color: '#fff'
overflow: 'truncate', },
nameTextStyle: {
color: '#fff', //
padding: [0, 0, 0, 20] //
} }
}, },
series: [{ series: [{
@ -288,26 +316,42 @@ const handleShowBottomData = async (res: any) => {
boundaryGap: true, boundaryGap: true,
axisLabel: { axisLabel: {
interval: 0, interval: 0,
lineStyle: {
color: '#fff' // y 线
}
},
axisLine: {
lineStyle: {
color: '#fff' // y 线
}
}, },
axisTick: { axisTick: {
show: false // 线 show: false // 线
} }
}, },
yAxis: { yAxis: {
name: `${selectTab.value === 1 ? '营收金额(万元)' : selectTab.value === 2 ? '客单量(万笔)' : selectTab.value === 3 ? '客单均价(元)' : ''}`,
type: 'value', type: 'value',
name: '万元',
splitLine: { show: false }, splitLine: { show: false },
axisLine: { axisLine: {
show: true, show: true,
lineStyle: {
color: '#fff' // y 线
}
}, },
axisLabel: { axisLabel: {
color: '#fff',
},
nameTextStyle: {
color: '#fff', //
padding: [0, 0, 0, 20] //
} }
}, },
grid: { grid: {
left: '10', // left: '10', //
right: '10', // right: '10', //
bottom: '0', bottom: '0',
top: '10', top: '30',
containLabel: true containLabel: true
}, },
series: [ series: [
@ -342,10 +386,9 @@ const handleShowBottomData = async (res: any) => {
type: 'line' // 线 type: 'line' // 线
}, },
formatter: function (params: any) { formatter: function (params: any) {
console.log('paramsparamsparams', params);
return `${params.map((item: any) => { return `${params.map((item: any) => {
return `<div> return `<div>
${item.seriesName}${item.value} ${item.seriesName}${item.value}
</div>` </div>`
}).join("")}` }).join("")}`
} }
@ -398,22 +441,60 @@ onBeforeUnmount(() => {
</div> </div>
<div class="BusinessCaseRightItem"> <div class="BusinessCaseRightItem">
<div class="rightItemLeft"> <div class="BusinessCaseRightItemTop">
<div class="rightItemTitle">营收同比</div> <div class="rightItemTitle">营收同比</div>
<div class="rightItemUpdate">{{ moment().subtract(1, 'd').format('YYYY-MM-DD') }}</div>
</div>
<div class="BusinessCaseRightItemBottom">
<div class="BusinessCaseItemBottomLeft">
<div class="compareTitle">相比去年同日</div>
<div class="changeBox">
<img class="changeIcon" :src="selectTab === 1 ? getAllData?.RevenueAmountYOYRate > 0 ? addIcon : reduce :
selectTab === 2 ? getAllData?.TicketCountYOYRate > 0 ? addIcon : reduce :
selectTab === 3 ? getAllData?.AvgTicketAmountRate > 0 ? addIcon : reduce : ''
" />
<div class="changeText" :style="{
color: selectTab === 1 ? getAllData?.RevenueAmountYOYRate > 0 ? '#00FF00' : '#D24343' :
selectTab === 2 ? getAllData?.TicketCountYOYRate > 0 ? '#00FF00' : '#D24343' :
selectTab === 3 ? getAllData?.AvgTicketAmountRate > 0 ? '#00FF00' : '#D24343' : ''
}">{{
selectTab === 1 ? getAllData?.RevenueAmountYOYRate :
selectTab === 2 ? getAllData?.TicketCountYOYRate :
selectTab === 3 ? getAllData?.AvgTicketAmountRate : ''
}}%</div>
</div>
</div>
<div class="BusinessCaseItemBottomRight">
<div class="BusinessCaseRevenueValue">{{ selectTab === 1 ?
getAllData?.RevenueAmount.toLocaleString() :
selectTab
=== 2 ?
getAllData?.TicketCount.toLocaleString() : selectTab === 3 ?
getAllData?.AvgTicketAmount.toLocaleString() : ''
}}</div>
<div class="BusinessCaseRevenueUnit">{{ selectTab===2?'笔':'元' }}</div>
</div>
</div>
<!-- <div class="rightItemLeft">
<div class="rightItemTitleBox">
<div class="rightItemTitle">营收同比</div>
<div class="rightItemUpdate">{{ moment().subtract(1, 'd').format('YYYY-MM-DD') }}</div>
</div>
<div class="rightItemBottom"> <div class="rightItemBottom">
<div class="compareTitle">相比去年同日</div> <div class="compareTitle">相比去年同日</div>
<div class="changeBox"> <div class="changeBox">
<img class="changeIcon" /> <img class="changeIcon" />
<!-- >0 #00FF00 <0 #FF0000 -->
<div class="changeText"></div> <div class="changeText"></div>
</div> </div>
</div> </div>
</div> </div> -->
<div class="rightItemRight"> <!-- <div class="rightItemRight">
<div class="BusinessCaseRevenueValue">3,329,828.91</div> <div class="BusinessCaseRevenueValue"></div>
<div class="BusinessCaseRevenueUnit"></div> <div class="BusinessCaseRevenueUnit"></div>
</div> </div> -->
</div> </div>
</div> </div>

View File

@ -61,9 +61,10 @@ onMounted(async () => {
yAxis: [ yAxis: [
{ {
type: 'value', type: 'value',
name: '车流量', name: '车流量(辆)',
nameTextStyle: { nameTextStyle: {
color: '#ffffff' // Y color: '#ffffff', // Y
padding: [0, 0, 0, 20]
}, },
splitLine: { show: false }, splitLine: { show: false },
axisLine: { axisLine: {
@ -73,15 +74,18 @@ onMounted(async () => {
} }
}, },
axisLabel: { axisLabel: {
color: '#00F6FF', color: '#fff',
formatter: '{value}' // formatter: '{value}' //
} },
offset: 0, // Y
splitNumber: 4,
}, },
{ {
type: 'value', type: 'value',
name: '客单量', name: '客单量(笔)',
nameTextStyle: { nameTextStyle: {
color: '#ffffff' // Y color: '#ffffff', // Y
padding: [0, 0, 0, 0]
}, },
splitLine: { show: false }, splitLine: { show: false },
position: 'right', position: 'right',
@ -94,7 +98,8 @@ onMounted(async () => {
axisLabel: { axisLabel: {
color: '#ffffff', color: '#ffffff',
}, },
offset: 0 // Y offset: 0, // Y
splitNumber: 4,
} }
], ],
grid: { grid: {
@ -148,25 +153,31 @@ onMounted(async () => {
type: 'line' // 线 type: 'line' // 线
}, },
formatter: function (params: any) { formatter: function (params: any) {
console.log('paramsparamsparams', params); console.log('paramsparamsparamsparams', params);
console.log('resresresres', res);
let toolStr: string[] = []
if (params && params.length > 0) {
params.forEach((item: any) => {
toolStr.push(
`${item.seriesName}${item.value}`
)
})
}
return ` return `<div>
<div> <div>${params[0].name}</div>
<div>${res.category[params[0].dataIndex]}</div> <div>车流量${params[0]?.value}</div>
${toolStr.map((item: string) => { <div>客单量${params[1]?.value}</div>
return `<div>${item}</div>` </div>`
})}
</div> // let toolStr: string[] = []
` // if (params && params.length > 0) {
// params.forEach((item: any) => {
// toolStr.push(
// `${item.seriesName}${item.value}`
// )
// })
// }
// return `
// <div>
// <div>${res.category[params[0].dataIndex]}</div>
// ${toolStr.map((item: string) => {
// return `<div>${item}</div>`
// })}
// </div>
// `
} }
} }
}; };
@ -187,10 +198,13 @@ const handleGetData = async () => {
const req: any = { const req: any = {
Province_Code: '530000', Province_Code: '530000',
// Province_Code: '340000',
Statistics_Date: moment().subtract(1, 'd').format('YYYY-MM-DD'), Statistics_Date: moment().subtract(1, 'd').format('YYYY-MM-DD'),
Serverpart_ID: '' Serverpart_ID: ''
} }
const data = await handleGetTransactionConvert(req) const data = await handleGetTransactionConvert(req)
console.log('jfidsafuidsopfjsdflksjdfds', data);
let carList = data.BayonetList.data let carList = data.BayonetList.data
@ -198,7 +212,7 @@ const handleGetData = async () => {
if (carList && carList.length > 0) { if (carList && carList.length > 0) {
carList.forEach((item: any) => { carList.forEach((item: any) => {
carResList.push((item[1]).toLocaleString()) carResList.push((item[1]))
carRealResList.push(item[1]) carRealResList.push(item[1])
}) })
} }
@ -206,7 +220,7 @@ const handleGetData = async () => {
if (orderList && orderList.length > 0) { if (orderList && orderList.length > 0) {
orderList.forEach((item: any) => { orderList.forEach((item: any) => {
category.push(item[0]) category.push(item[0])
orderResList.push((item[1]).toLocaleString()) orderResList.push((item[1]))
orderRealResList.push(item[1]) orderRealResList.push(item[1])
}) })
} }
@ -220,6 +234,9 @@ const handleGetData = async () => {
orderResList: orderResList, orderResList: orderResList,
orderRealResList: orderRealResList orderRealResList: orderRealResList
} }
console.log('resresresresres', res);
return res return res
} }

View File

@ -37,10 +37,9 @@ onMounted(async () => {
const option = { const option = {
legend: { legend: {
selectedMode: false,
right: 0, right: 0,
textStyle: { textStyle: {
color: '#666', color: '#fff',
fontSize: 12, fontSize: 12,
padding: [0, 0, 0, 5] padding: [0, 0, 0, 5]
}, },
@ -55,14 +54,36 @@ onMounted(async () => {
yAxis: { yAxis: {
type: 'value', type: 'value',
name: "%", name: "%",
splitLine: { show: false } // 线 show: true, // Y 使
nameTextStyle: {
color: '#fff', //
padding: [0, 0, 0, 0] //
},
splitLine: { show: false },
axisLabel: {
color: '#fff',
interval: 0,
show: true //
},
axisLine: {
show: true, // 线
lineStyle: {
color: '#fff'
}
}
}, },
xAxis: { xAxis: {
type: 'category', type: 'category',
data: res.category, data: res.category,
axisLabel: { axisLabel: {
color: '#fff',
interval: 0 // interval: 0 //
} },
axisLine: {
lineStyle: {
color: '#fff' // y 线
}
},
}, },
series: res.seriesData, series: res.seriesData,
tooltip: { tooltip: {

View File

@ -58,7 +58,8 @@ onMounted(async () => {
type: 'value', type: 'value',
name: '客单占比(%)', name: '客单占比(%)',
nameTextStyle: { nameTextStyle: {
color: '#fff' // Y color: '#fff', // Y
padding: [0, 0, 0, 20]
}, },
splitLine: { show: false }, splitLine: { show: false },
axisLine: { axisLine: {

View File

@ -48,8 +48,6 @@ onMounted(async () => {
// type: 'shadow' // // type: 'shadow' //
// }, // },
formatter: function (params: any) { // formatter: function (params: any) { //
console.log('params', params);
return `<div> return `<div>
<div>男性${res.seriesDataMan[params.dataIndex]}%</div> <div>男性${res.seriesDataMan[params.dataIndex]}%</div>
<div>女性${res.seriesDataWoman[params.dataIndex]}%</div> <div>女性${res.seriesDataWoman[params.dataIndex]}%</div>
@ -65,6 +63,13 @@ onMounted(async () => {
axisLabel: { axisLabel: {
interval: 0, // interval: 0, //
hideOverlap: false, // hideOverlap: false, //
color: '#fff',
},
axisLine: {
show: true,
lineStyle: {
color: '#fff' // y 线
}
}, },
axisTick: { axisTick: {
alignWithLabel: true // 线 alignWithLabel: true // 线
@ -76,6 +81,12 @@ onMounted(async () => {
splitLine: { show: false }, splitLine: { show: false },
axisLine: { axisLine: {
show: true, show: true,
lineStyle: {
color: '#fff' // y 线
}
},
axisLabel: {
color: '#fff',
}, },
splitNumber: 4 splitNumber: 4
}, },

View File

@ -62,7 +62,7 @@ const handleShowCharts = async () => {
left: '0', left: '0',
right: '10', right: '10',
bottom: '0', bottom: '0',
top: '10', top: '30',
containLabel: true containLabel: true
}, },
xAxis: { xAxis: {
@ -89,6 +89,7 @@ const handleShowCharts = async () => {
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
name: '交易额(元)',
axisLabel: { axisLabel: {
color: '#fff', color: '#fff',
formatter: '{value}' formatter: '{value}'

View File

@ -44,6 +44,15 @@ watch(
{ deep: true } { deep: true }
); );
//
watch(
() => props.FestivalValue,
(newVal, oldVal) => {
handleGoMounted()
},
{ deep: true }
);
// //
const handleGoMounted = async () => { const handleGoMounted = async () => {
const res: any = await handleGetData() const res: any = await handleGetData()
@ -52,7 +61,6 @@ const handleGoMounted = async () => {
if (!chartDom) return; if (!chartDom) return;
myChart = echarts.init(chartDom); myChart = echarts.init(chartDom);
const option = { const option = {
legend: { legend: {
data: ['今年', '去年'], // series name data: ['今年', '去年'], // series name
@ -68,14 +76,31 @@ const handleGoMounted = async () => {
type: 'category', type: 'category',
data: res.category, data: res.category,
boundaryGap: true, boundaryGap: true,
axisLabel: {
color: '#fff',
formatter: '{value}' //
},
axisLine: {
lineStyle: {
color: '#fff' // y 线
}
},
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
name: '万元', name: '万元',
splitLine: { show: false }, splitLine: { show: false },
axisLabel: {
color: '#fff',
formatter: '{value}' //
},
axisLine: { axisLine: {
show: true, show: true,
} lineStyle: {
color: '#fff' // y 线
}
},
}, },
grid: { grid: {
left: '10', // left: '10', //

View File

@ -11,7 +11,7 @@
background-repeat: no-repeat; background-repeat: no-repeat;
background-size: 100% 100%; background-size: 100% 100%;
box-sizing: border-box; box-sizing: border-box;
padding: 20px 64px 18px; padding: 20px 54px 18px;
.GenderCustomerGroupUnit { .GenderCustomerGroupUnit {
font-family: "Microsoft YaHei"; font-family: "Microsoft YaHei";
@ -29,8 +29,8 @@
height: 145px; height: 145px;
.GenderCustomerGroup { .GenderCustomerGroup {
width: 86px; width: 106px;
height: 86px; height: 145px;
} }
.legendBox { .legendBox {

View File

@ -62,7 +62,7 @@ onMounted(async () => {
height: 43 height: 43
}, },
left: 'center', left: 'center',
top: 'center', top: '21',
z: 10 z: 10
} }
] ]
@ -71,10 +71,9 @@ onMounted(async () => {
{ {
name: 'Access From', name: 'Access From',
type: 'pie', type: 'pie',
radius: ['80%', '100%'], radius: ['60%', '80%'],
center: ['50%', '50%'], // [, ] center: ['50%', '30%'], // [, ]
avoidLabelOverlap: false, avoidLabelOverlap: false,
itemStyle: { itemStyle: {
color: function (params: any) { color: function (params: any) {
// //
@ -91,7 +90,19 @@ onMounted(async () => {
}, },
data: res.seriesData data: res.seriesData
} }
] ],
legend: {
data: ['男性', '女性'],
bottom: 0,
left: 0,
orient: 'horizontal', //
itemWidth: 12,
itemHeight: 12,
itemGap: 10, //
textStyle: {
color: '#fff'
},
},
}; };
@ -153,7 +164,7 @@ onBeforeUnmount(() => {
<div class="GenderCustomerGroup" id="GenderCustomerGroup"></div> <div class="GenderCustomerGroup" id="GenderCustomerGroup"></div>
<div class="legendBox"> <!-- <div class="legendBox">
<div class="legendBoxContent"> <div class="legendBoxContent">
<div class="legendItem"> <div class="legendItem">
<div class="legendIcon" style="background-color: #0094FF;"></div> <div class="legendIcon" style="background-color: #0094FF;"></div>
@ -164,7 +175,7 @@ onBeforeUnmount(() => {
<div class="legendName">女性</div> <div class="legendName">女性</div>
</div> </div>
</div> </div>
</div> </div> -->
</div> </div>
</div> </div>

View File

@ -3,7 +3,7 @@ import { onBeforeUnmount, onMounted, ref } from 'vue';
import SmallTitle from '../smallTitle/smallTitle.vue' import SmallTitle from '../smallTitle/smallTitle.vue'
import './MallOrderStatistics.less' import './MallOrderStatistics.less'
import * as echarts from 'echarts/core'; import * as echarts from 'echarts/core';
import { BarChart } from 'echarts/charts'; import { LineChart } from 'echarts/charts';
import { import {
GridComponent, GridComponent,
TitleComponent, TitleComponent,
@ -12,13 +12,14 @@ import {
} from 'echarts/components'; } from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers'; import { CanvasRenderer } from 'echarts/renderers';
import moment from 'moment'; import moment from 'moment';
import { handleGetMallOrderSummary } from '../../service';
// //
let selectType = ref<number>(1) let selectType = ref<number>(1)
// //
echarts.use([ echarts.use([
BarChart, LineChart,
GridComponent, GridComponent,
TitleComponent, TitleComponent,
TooltipComponent, TooltipComponent,
@ -39,55 +40,98 @@ onMounted(async () => {
const option = { const option = {
xAxis: { xAxis: {
type: 'category', type: 'category',
data: ["00:00", "01:00", "02:00", "03:00", "04:00", "05:00", "06:00", "07:00", "08:00", "09:00", "10:00", "11:00", "12:00", "13:00", "14:00", "15:00", "16:00", "17:00", "18:00", "19:00", "20:00", "21:00", "22:00", "23:00", "24:00"], data: res.category,
boundaryGap: true, axisLine: {
lineStyle: {
color: '#fff' // X线
}
},
axisLabel: { axisLabel: {
interval: 3, // 2 0,3,6... 0 color: '#fff', // X
showMinLabel: true, // interval: 0,
showMaxLabel: true // },
},
yAxis: [
{
type: 'value',
name: '交易笔数(笔)',
position: 'left',
splitLine: { show: false },
axisLine: {
show: true,
lineStyle: {
color: '#fff' // Y线线
}
},
axisLabel: {
color: '#fff' // Y
},
nameTextStyle: {
color: '#fff', // Y
padding: [0, 0, 0, 20]
}
},
{
type: 'value',
name: '交易金额(元)',
position: 'right',
splitLine: { show: false },
axisLine: {
show: true,
lineStyle: {
color: '#fff' // Y线线
}
},
axisLabel: {
color: '#fff' // Y
},
nameTextStyle: {
color: '#fff', // Y
padding: [0, 0, 0, 0]
}
} }
}, ],
yAxis: {
type: 'value',
splitLine: { show: false } // 线
},
grid: { grid: {
left: '10', // left: '0', // Y
right: '10', // right: '10', // Y
bottom: '0', // bottom: '0',
top: '10', // top: '50',
containLabel: true // grid containLabel: true
}, },
series: [ series: [
{ {
data: [10, 20, 30, 40, 50, 60, 70, 80, 90, 180, 200, 210, 300, 200, 180, 160, 30, 80, 90, 70, 45, 35, 67, 12].map((value: any, index: any) => { name: '交易笔数',
return {
value: value,
// symbol
symbol: index % 3 === 0 ? 'circle' : 'none',
symbolSize: 6
}
}),
realData: res.realData,
type: 'line', type: 'line',
color: '#FF9500' yAxisIndex: 0, // Y
data: res.TicketCountData,
},
{
name: '交易金额',
type: 'line',
yAxisIndex: 1, // Y
data: res.SellAmountData,
} }
], ],
tooltip: { // tooltip tooltip: {
trigger: 'axis', // trigger: 'axis',
axisPointer: { // formatter: function (params: any) {
type: 'shadow' //
},
formatter: function (params: any) { //
// params hover
const data = params[0];
let realData = res.realData[params[0].dataIndex]
return ` return `
<div style="font-weight:bold">${data.name}</div> <div style="font-weight:bold">${params[0].name}</div>
<div>车流量${realData + '单'} </div> <div >${params[0].seriesName}: ${params[0].value}</div>
<div >${params[1].seriesName}: ${params[1].value}</div>
`; `;
} }
}, },
legend: {
data: ['交易笔数', '交易金额'],
top: 0,
right: 0,
textStyle: {
color: '#fff'
}
},
color: ['#FF5E5E', '#FF9500']
}; };
@ -105,14 +149,35 @@ const handleChangeType = async (value: number) => {
const handleGetData = async () => { const handleGetData = async () => {
let category: string[] = [] let category: string[] = []
let seriesData: number[] = [] let TicketCountData: number[] = [] //
let realData: string[] = [] let SellAmountData: string[] = [] //
const req: any = {
DataType: 2,// 1 2
ProvinceCode: '530000',
StartMonth: moment().startOf('y').format('YYYYMM'),
EndMonth: moment().subtract(1, 'M').format('YYYYMM'),
}
console.log('dkosajdaihfysudafhs', req);
const data = await handleGetMallOrderSummary(req)
console.log('gjisayudshfsdafdfdasfasd', data);
if (data && data.length > 0) {
data.forEach((item: any) => {
category.push(item.StatisticsMonth)
TicketCountData.push(item.TicketCount)
SellAmountData.push(item.SellAmount)
})
}
let res: any = { let res: any = {
category: category,// x category: category,// x
seriesData: seriesData,// y TicketCountData: TicketCountData,//
realData: realData// SellAmountData: SellAmountData//
} }
return res return res
} }
@ -132,16 +197,14 @@ onBeforeUnmount(() => {
<template> <template>
<div class="MallOrderStatisticsBox"> <div class="MallOrderStatisticsBox">
<SmallTitle :title="'商城订单统计'"> <SmallTitle :title="'商城订单统计'">
<template #extra> <!-- <template #extra>
<div class="changeTypeBox"> <div class="changeTypeBox">
<div :class="selectType === 1 ? 'changeTypeItem selectChangeTypeItem' : 'changeTypeItem'" <div :class="selectType === 1 ? 'changeTypeItem selectChangeTypeItem' : 'changeTypeItem'"
@click="handleChangeType(1)"></div> @click="handleChangeType(1)"></div>
<div :class="selectType === 2 ? 'changeTypeItem selectChangeTypeItem' : 'changeTypeItem'" <div :class="selectType === 2 ? 'changeTypeItem selectChangeTypeItem' : 'changeTypeItem'"
@click="handleChangeType(2)"></div> @click="handleChangeType(2)"></div>
<div :class="selectType === 3 ? 'changeTypeItem selectChangeTypeItem' : 'changeTypeItem'"
@click="handleChangeType(3)"></div>
</div> </div>
</template> </template> -->
</SmallTitle> </SmallTitle>

View File

@ -27,7 +27,7 @@
display: flex; display: flex;
align-items: center; align-items: center;
.MerchantRatingRankingItemTopLeftIndex { .MerchantRatingRankingItemIndex {
font-family: Impact, Impact; font-family: Impact, Impact;
font-weight: 400; font-weight: 400;
font-size: 15px; font-size: 15px;
@ -35,9 +35,16 @@
letter-spacing: 1px; letter-spacing: 1px;
text-align: center; text-align: center;
font-style: normal; font-style: normal;
display: inline-block; box-sizing: border-box;
padding: 1px 8px 2px 4px; padding: 1px 8px 2px 4px;
margin-right: 5px; margin-right: 5px;
background-image: url('../../../../assets/image/threeStBg.png');
background-repeat: no-repeat;
background-size: 100% 100%;
}
.MerchantRatingRankingItemIndexAfter {
background-image: url('../../../../assets/image/otherStBg.png');
} }
.MerchantRatingRankingItemTopLeftName { .MerchantRatingRankingItemTopLeftName {

View File

@ -12,7 +12,7 @@ import {
import { CanvasRenderer } from 'echarts/renderers'; import { CanvasRenderer } from 'echarts/renderers';
import './MerchantRatingRanking.less' import './MerchantRatingRanking.less'
import moment from 'moment'; import moment from 'moment';
import { handleGetProvinceMonthAnalysis, handleGetSalesRank } from '../../service'; import { handleGetEvaluateResList, handleGetProvinceMonthAnalysis, handleGetSalesRank } from '../../service';
// //
echarts.use([ echarts.use([
@ -126,22 +126,32 @@ onMounted(async () => {
// //
const handleGetData = async () => { const handleGetData = async () => {
const req: any = {
let category: string[] = ["商品1", "商品2", "商品3", "商品4", "商品5"]; ProvinceCode: '530000',
let seriesData: number[] = [8.8, 7.5, 6.3, 5.2, 4.1]; RoleType: 1,
let realData: string[] = [] StatisticsMonth: moment().subtract(1, 'M').format('YYYYMM')
let res = {
category: category,// x
seriesData: seriesData,// y
realData: realData
} }
const data = await handleGetEvaluateResList(req)
console.log('djsauhdusahcjksdahvasjkdf', data);
return res rankList.value = data
// let category: string[] = ["1", "2", "3", "4", "5"];
// let seriesData: number[] = [8.8, 7.5, 6.3, 5.2, 4.1];
// let realData: string[] = []
// let res = {
// category: category,// x
// seriesData: seriesData,// y
// realData: realData
// }
// return res
} }
// const resizeChart = () => { // const resizeChart = () => {
@ -161,21 +171,24 @@ const handleGetData = async () => {
<!-- <div class="MerchantRatingRankingCharts" id="MerchantRatingRanking"> <!-- <div class="MerchantRatingRankingCharts" id="MerchantRatingRanking">
</div> --> </div> -->
<div class="MerchantRatingRankingList"> <div class="MerchantRatingRankingList" style="margin-top: 15px;">
<div class="MerchantRatingRankingItem" v-for="(item, index) in rankList" :key="index"> <div class="MerchantRatingRankingItem" v-for="(item, index) in rankList" :key="index">
<div class="MerchantRatingRankingItemTop"> <div class="MerchantRatingRankingItemTop">
<div class="MerchantRatingRankingItemTopLeft"> <div class="MerchantRatingRankingItemTopLeft">
<div class="MerchantRatingRankingItemTopLeftIndex"></div> <div
<div class="MerchantRatingRankingItemTopLeftName"></div> :class="index + 1 > 3 ? 'MerchantRatingRankingItemIndex MerchantRatingRankingItemIndexAfter' : 'MerchantRatingRankingItemIndex '">
{{ index + 1 }}</div>
<div class="MerchantRatingRankingItemTopLeftName">{{ item.UnitName }}</div>
</div> </div>
<div class="MerchantRatingRankingItemTopRight"> <div class="MerchantRatingRankingItemTopRight">
{{ item.EvaluateScore }}
</div> </div>
</div> </div>
<div class="MerchantRatingRankingItemBottom"> <div class="MerchantRatingRankingItemBottom">
<div class="MerchantRatingRankingItemBottomAllProgress"> <div class="MerchantRatingRankingItemBottomAllProgress">
<div class="MerchantRatingRankingItemBottomHaveProgress"></div> <div class="MerchantRatingRankingItemBottomHaveProgress"
:style="{ width: item.EvaluateScore + '%' }"></div>
</div> </div>
</div> </div>

View File

@ -1,7 +1,7 @@
.ThisMonthBenefitsBox { .ThisMonthBenefitsBox {
width: 100%; width: 100%;
box-sizing: border-box; box-sizing: border-box;
// padding: 20px 11px 0; padding: 10px 11px 0;
.ThisMonthBenefitsContent { .ThisMonthBenefitsContent {
width: 100%; width: 100%;
@ -56,4 +56,19 @@
} }
} }
.CoreCategoryBox {
width: 100%;
margin-top: 13px;
.CoreCategoryCharts {
width: 100%;
margin-top: 26px;
.CoreCategory {
width: 100%;
height: 132px;
}
}
}
} }

View File

@ -1,8 +1,171 @@
<script setup lang="ts"> <script setup lang="ts">
import './ThisMonthBenefits.less' import './ThisMonthBenefits.less'
import bussinessIcon from '../../../../assets/image/bussinessIcon.png' import bussinessIcon from '../../../../assets/image/bussinessIcon.png'
import { onBeforeUnmount, onMounted, ref } from 'vue';
import { handleGetWelFareSummary } from '../../service';
import SmallTitle from '../smallTitle/smallTitle.vue';
import moment from 'moment';
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 businessFormatCenterIcon from '../../../../assets/image/businessFormatCenterIcon.png'
//
echarts.use([
PieChart,
GridComponent,
TitleComponent,
TooltipComponent,
LegendComponent,
GraphicComponent,
CanvasRenderer
]);
let myChart: echarts.ECharts;
//
const colorList = ['#FF9500', '#00FFB7', '#0094FF', '#7D4CD2', '#69BCFF'];
//
let allRealData = ref<any>()
onMounted(async () => {
const res: any = await handleGetData()
const chartDom = document.getElementById('CoreCategory');
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>
`;
}
},
legend: { //
show: true, //
orient: 'vertical', //
left: '40%', //
top: 0, //
// type: 'scroll',
textStyle: { //
color: '#fff', //
fontSize: 12 //
},
formatter: function (name: string) { //
// res.seriesData
const dataItem = res.seriesData.find((item: any) => item.name === name);
// " ()"
return `${name} (${dataItem?.percent || 0}%)`;
// 使
// return `${name}: ${res.realData[res.seriesData.findIndex(item => item.name === name)]}`;
}
},
graphic: { //
elements: [
{
type: 'image',
style: {
image: businessFormatCenterIcon,
width: 83,
height: 83
},
left: '25',
top: '25',
z: 10
}
]
},
series: [
{
name: 'Access From',
type: 'pie',
radius: ['85%', '100%'],
center: ['20%', '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 resizeChart = () => {
myChart?.resize();
};
onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart);
myChart?.dispose();
});
const handleGetData = async () => {
const req: any = {
ProvinceCode: '530000',
StatisticsMonth: moment().subtract(1, 'M').format('YYYYMM')
}
const data = await handleGetWelFareSummary(req)
console.log('fjidsfhasjfasdfdsf', data);
let seriesData: any = []
let realData: any = []
let category: any = []
allRealData.value = data
let list: any = data.WelFareGoodsTypeList.slice(0, 5)
if (list && list.length > 0) {
let sum: number = 0
list.forEach((item: any) => {
sum += item.GoodsCount
})
list.forEach((item: any) => {
category.push(item.GoodsTypeName)
seriesData.push({ name: item.GoodsTypeName, value: item.GoodsCount, percent: ((item.GoodsCount / sum) * 100).toFixed(2) })
})
}
let res: any = {
category: category,// x
seriesData: seriesData,// y
realData: realData//
}
return res
}
</script> </script>
@ -16,9 +179,18 @@ import bussinessIcon from '../../../../assets/image/bussinessIcon.png'
</div> </div>
<div class="ThisMonthBenefitsContentRight"> <div class="ThisMonthBenefitsContentRight">
<span class="thisMonthValue">8888</span> <span class="thisMonthValue">{{ allRealData?.value.distributeAmount || '0' }}</span>
<span class="thisMonthUnit"></span> <span class="thisMonthUnit"></span>
</div> </div>
</div> </div>
<div class="CoreCategoryBox">
<SmallTitle title="核心品类占比" />
<div class="CoreCategoryCharts">
<div class="CoreCategory" id="CoreCategory"></div>
</div>
</div>
</div> </div>
</template> </template>

View File

@ -4,6 +4,54 @@
// padding: 0 20px; // padding: 0 20px;
// margin-top: 20px; // margin-top: 20px;
.TradingAlertBox {
width: 100%;
display: flex;
align-items: center;
justify-content: space-between;
.TradingAlertItem {
width: calc((100% - 10px)/2);
box-sizing: border-box;
padding: 10px 15px;
display: flex;
align-items: center;
.TradingAlertItemLeft {
width: 46px;
height: 46px;
margin-right: 10px;
.TradingAlertItemLeftIcon {
width: 46px;
height: 46px;
}
}
.TradingAlertItemRight {
flex: 1;
.TradingAlertItemRightLabel {
font-family: Microsoft YaHei, Microsoft YaHei;
font-weight: 400;
font-size: 14px;
color: #FFFFFF;
text-align: left;
font-style: normal;
}
.TradingAlertItemRightValue {
font-family: Impact, Impact;
font-weight: 400;
font-size: 25px;
color: #FFFFFF;
letter-spacing: 2px;
text-align: right;
font-style: normal;
}
}
}
}
.TradingAlertListBox { .TradingAlertListBox {
width: 100%; width: 100%;

View File

@ -1,14 +1,15 @@
<script setup lang="ts"> <script setup lang="ts">
import './TradingAlert.less' import './TradingAlert.less'
import SmallTitle from '../smallTitle/smallTitle.vue' import SmallTitle from '../smallTitle/smallTitle.vue'
import { onMounted, reactive } from 'vue'; import { onMounted, reactive, ref } from 'vue';
import { handleGetCurrentEarlyWarning, handleGetEarlyWarning } from '../../service'; import { handleGetCurrentEarlyWarning, handleGetEarlyWarning } from '../../service';
// //
let TradingAlertList = reactive<any>([]) let TradingAlertList = reactive<any>([])
//
let TradingOtherData = ref<any>()
onMounted(async () => { onMounted(async () => {
// //
await handleGetData() await handleGetData()
@ -28,10 +29,12 @@ const handleGetData = async () => {
} }
const data = await handleGetCurrentEarlyWarning(req) const data = await handleGetCurrentEarlyWarning(req)
console.log('skodpijasidjaslfddfas', data);
if (data && data.length > 0) { TradingOtherData.value = data.OtherData
let list = data.slice(0, 5)
if (data.List && data.List.length > 0) {
let list = data.List.slice(0, 10)
TradingAlertList.length = 0; TradingAlertList.length = 0;
list && list.forEach((item: any) => TradingAlertList.push(item)); list && list.forEach((item: any) => TradingAlertList.push(item));
} else { } else {
@ -46,6 +49,29 @@ const handleGetData = async () => {
<div class="TradingAlertBox"> <div class="TradingAlertBox">
<SmallTitle :title="'交易预警'"></SmallTitle> <SmallTitle :title="'交易预警'"></SmallTitle>
<div class="TradingAlertBox">
<div class="TradingAlertItem">
<div class="TradingAlertItemLeft">
<div class="TradingAlertItemLeftIcon"></div>
</div>
<div class="TradingAlertItemRight">
<div class="TradingAlertItemRightLabel">必查项</div>
<div class="TradingAlertItemRightValue">{{ TradingOtherData?.value || '' }}</div>
</div>
</div>
<div class="TradingAlertItem">
<div class="TradingAlertItemLeft">
<div class=""></div>
</div>
<div class="TradingAlertItemRight">
<div class="TradingAlertItemRightLabel">抽查项</div>
<div class="TradingAlertItemRightValue">{{ TradingOtherData?.data || '' }}</div>
</div>
</div>
</div>
<div class="TradingAlertListBox"> <div class="TradingAlertListBox">
<div class="TradingAlertItem" v-for="(item, index) in TradingAlertList" :key="index" <div class="TradingAlertItem" v-for="(item, index) in TradingAlertList" :key="index"
:style="{ backgroundColor: index % 2 === 0 ? 'rgba(22, 28, 47, 1)' : 'rgba(0, 0, 0, 0.2)' }"> :style="{ backgroundColor: index % 2 === 0 ? 'rgba(22, 28, 47, 1)' : 'rgba(0, 0, 0, 0.2)' }">

View File

@ -12,7 +12,7 @@ import {
import { CanvasRenderer } from 'echarts/renderers'; import { CanvasRenderer } from 'echarts/renderers';
import './TrendOfTrafficFlow.less' import './TrendOfTrafficFlow.less'
import moment from 'moment'; import moment from 'moment';
import { handleGetProvinceMonthAnalysis } from '../../service'; import { handleGetMonthAnalysis, handleGetProvinceMonthAnalysis } from '../../service';
// //
echarts.use([ echarts.use([
@ -60,23 +60,35 @@ const handleGoMounted = async () => {
type: 'category', type: 'category',
data: res.category, data: res.category,
axisLabel: { axisLabel: {
color: '#fff',
overflow: 'truncate', // overflow: 'truncate', //
ellipsis: '...', // ellipsis: '...', //
interval: 0 // interval: 0 //
// rotate: 30, // 30 // rotate: 30, // 30
}, },
axisLine: {
lineStyle: {
color: '#fff' // x 线
}
}
// data: res.category // data: res.category
}, },
yAxis: { yAxis: {
type: 'value', type: 'value',
name: '万辆', // name: '万辆', //
nameTextStyle: { nameTextStyle: {
color: '#666', color: '#fff',
padding: [0, 30, 0, 0] // padding: [0, 30, 0, 0] //
}, },
axisLabel: { axisLabel: {
color: '#fff',
formatter: '{value}' // formatter: '{value}' //
}, },
axisLine: {
lineStyle: {
color: '#fff' // y 线
}
},
splitLine: { show: false } splitLine: { show: false }
}, },
series: [ series: [
@ -97,27 +109,13 @@ const handleGoMounted = async () => {
borderRadius: [4, 4, 0, 0], borderRadius: [4, 4, 0, 0],
// //
color: function (params: any) { color: function (params: any) {
const index = params.dataIndex; // return new echarts.graphic.LinearGradient(
// 3Mon, Tue, Wed使1 0, 0, 0, 1,
if (index < 3) { [
return new echarts.graphic.LinearGradient( { offset: 0, color: '#018FFF' }, //
0, 0, 0, 1, // { offset: 1, color: '#00F4FF' } //
[ ]
{ offset: 0, color: '#FF4F00' }, // );
{ offset: 1, color: '#D3B70E' } //
]
);
}
// 3Thu, Fri, Sat使2
else {
return new echarts.graphic.LinearGradient(
0, 0, 0, 1,
[
{ offset: 0, color: '#018FFF' }, //
{ offset: 1, color: '#00F4FF' } //
]
);
}
} }
} }
}, },
@ -154,25 +152,43 @@ const handleGoMounted = async () => {
// //
const handleGetSectionFlowCount = async () => { const handleGetSectionFlowCount = async () => {
const req: any = { // const req: any = {
// StatisticsMonth: moment().subtract(1, 'M').format('YYYYMM'), // // StatisticsMonth: moment().subtract(1, 'M').format('YYYYMM'),
StatisticsMonth: "202504", // StatisticsMonth: "202504",
Serverpart_ID: props.currentService?.SERVERPART_ID || "", // Serverpart_ID: props.currentService?.SERVERPART_ID || "",
SortStr: "SectionFlow_Count desc", // SortStr: "SectionFlow_Count desc",
ProvinceCode: "530000" // ProvinceCode: "530000"
} // }
let data = await handleGetProvinceMonthAnalysis(req) // let data = await handleGetProvinceMonthAnalysis(req)
let list = data.slice(0, 5) const req: any = {
ProvinceCode: '530000',
StatisticsDate: moment().format('YYYY-MM-DD'),
StartDate: moment().startOf('y').format('YYYY-MM-DD'),
EndDate: moment().endOf('M').format('YYYY-MM-DD'),
}
let data = await handleGetMonthAnalysis(req)
console.log('fdjisfhhusahfdskf', data);
// let list = data.slice(0, 5)
let category: string[] = [] let category: string[] = []
let seriesData: number[] = [] let seriesData: number[] = []
let realData: string[] = [] let realData: string[] = []
list.forEach((item: any) => { if (data && data.length > 0) {
category.push(item.Serverpart_Name.split('服务区')[0]) data.forEach((item: any) => {
seriesData.push(Number((item.SectionFlow_Count / 10000).toFixed(2))) category.push(`${item.Statistics_Month}`)
realData.push(item.SectionFlow_Count.toLocaleString()) seriesData.push(Number((item.SectionFlow_Count / 10000).toFixed(2)))
}) })
}
// list.forEach((item: any) => {
// category.push(item.Serverpart_Name.split('')[0])
// seriesData.push(Number((item.SectionFlow_Count / 10000).toFixed(2)))
// realData.push(item.SectionFlow_Count.toLocaleString())
// })
let res = { let res = {
category: category,// x category: category,// x
@ -181,7 +197,6 @@ const handleGetSectionFlowCount = async () => {
} }
return res return res
} }
const resizeChart = () => { const resizeChart = () => {
@ -196,7 +211,7 @@ onBeforeUnmount(() => {
<template> <template>
<div class="TrendOfTrafficFlowBox"> <div class="TrendOfTrafficFlowBox">
<SmallTitle :title="`车流断面趋势(04月)`" /> <SmallTitle :title="`断面流量趋势`" />
<div class="TrendOfTrafficFlowCharts"> <div class="TrendOfTrafficFlowCharts">
<div class="TrendOfTrafficFlow" id="TrendOfTrafficFlow"></div> <div class="TrendOfTrafficFlow" id="TrendOfTrafficFlow"></div>

View File

@ -3,7 +3,7 @@ import SmallTitle from '../smallTitle/smallTitle.vue'
import './VehicleModelStay.less' import './VehicleModelStay.less'
import { onMounted, onBeforeUnmount, watch, ref } 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 { BarChart } from 'echarts/charts';
import { import {
GridComponent, GridComponent,
TitleComponent, TitleComponent,
@ -12,11 +12,11 @@ import {
} from 'echarts/components'; } from 'echarts/components';
import { CanvasRenderer } from 'echarts/renderers'; import { CanvasRenderer } from 'echarts/renderers';
import moment from 'moment'; import moment from 'moment';
import { handleGetBayonetSTAnalysis, handleGetTransactionConvert, handleGetTransactionTimeAnalysis } from '../../service'; import { handleGetBayonetSTAnalysis, handleGetRevenueTrend, handleGetTransactionConvert, handleGetTransactionTimeAnalysis } from '../../service';
// //
echarts.use([ echarts.use([
LineChart, BarChart,
GridComponent, GridComponent,
TitleComponent, TitleComponent,
TooltipComponent, TooltipComponent,
@ -63,20 +63,40 @@ const handleGoMounted = async () => {
type: 'category', type: 'category',
data: res.category, data: res.category,
axisLabel: { axisLabel: {
interval: 1, // 113 interval: 0, // 0
showMinLabel: true, showMinLabel: true,
showMaxLabel: true showMaxLabel: true,
color: '#fff', // x
fontSize: 12 //
},
axisLine: {
lineStyle: {
color: '#fff' // x线
}
},
axisTick: {
alignWithLabel: true // 线
} }
}, },
yAxis: [ yAxis: [
{ {
type: 'value', type: 'value',
name: '停留时长', name: '营收金额(万元)',
splitLine: { show: false }, splitLine: {
show: false
},
nameTextStyle: {
color: '#fff',
padding: [0, 30, 0, 0] //
},
axisLine: { axisLine: {
show: true show: true,
lineStyle: {
color: '#fff' // y线
}
}, },
axisLabel: { axisLabel: {
color: '#fff', // y
formatter: '{value}' // formatter: '{value}' //
} }
} }
@ -90,74 +110,50 @@ const handleGoMounted = async () => {
}, },
series: [ series: [
{ {
name: '小型车', name: `${res.currentYear}年营收`,
data: res?.smallCarData && res?.smallCarData.map((value: any, index: any) => ({ data: res?.seriesData || [],
value: value, type: 'bar',
symbol: index % 2 === 0 ? 'circle' : 'none', // barWidth: 5,
symbolSize: 6, itemStyle: {
itemStyle: { borderRadius: [3, 3, 0, 0],
color: '#0094FF', // color: '#008CFF' //
borderWidth: 0 // }
}
})),
type: 'line',
// smooth: true,
lineStyle: {
width: 2,
color: '#0094FF'
},
}, },
{ {
name: '中型车', name: `${res.lastYear}年营收`,
data: res?.middleCarData && res?.middleCarData.map((value: any, index: any) => ({ data: res?.seriesDataLastYear || [],
value: value, type: 'bar',
symbol: index % 2 === 0 ? 'circle' : 'none', // barWidth: 5,
symbolSize: 6, itemStyle: {
itemStyle: { borderRadius: [3, 3, 0, 0],
color: '#7D4CD2', // color: '#69BCFF' //
borderWidth: 0 // }
}
})),
type: 'line',
// smooth: true,
lineStyle: {
width: 2,
color: '#7D4CD2'
},
},
{
name: '大型车',
data: res?.bigCarData && res?.bigCarData.map((value: any, index: any) => ({
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: { tooltip: {
trigger: 'axis', trigger: 'axis',
axisPointer: { axisPointer: {
type: 'line' // 线 type: 'shadow' //
}, },
formatter: function (params: any) { 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/>`;
});
return result;
} }
}, },
legend: { legend: {
data: ['小型车', '中型车', '大型车'], //
textStyle: { color: '#fff' }, // data: [`${res.currentYear}年营收`, `${res.lastYear}年营收`], // 使
right: '0', // 4% textStyle: {
top: '0', color: '#fff', //
} fontSize: 12
},
right: '0', // 10px
top: '0', // 10px
},
color: ['#008CFF', '#69BCFF'] //
}; };
myChart.setOption(option); myChart.setOption(option);
@ -168,57 +164,54 @@ const handleGoMounted = async () => {
// //
const handleGetData = async () => { 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 category: number[] = []
// let seriesData: number[] = [] let seriesData: number[] = []
// let realData: string[] = [] let realData: string[] = []
let smallCarData: number[] = [] let seriesDataLastYear: number[] = []
let middleCarData: number[] = [] let realDataLastYear: string[] = []
let bigCarData: number[] = []
const req: any = { const req: any = {
StartMonth: moment().subtract(1, 'd').format('YYYYMM'), StatisticsDate: moment().format('YYYY'),
EndMonth: moment().subtract(1, 'd').format('YYYYMM'), ProvinceCode: '340000',
Province_Code: '340000', StatisticsType: 4,
TimeSpan: 1,
} }
console.log('reqreqreqreqreq', req); const data = await handleGetRevenueTrend(req)
searchTime.value = moment(req.StartMonth).format('MM')
const data = await handleGetBayonetSTAnalysis(req)
console.log('fdsjifjasifjdsnafsdvbhcav', data);
if (data && data.length > 0) { if (data && data.length > 0) {
data.forEach((item: any) => { data.forEach((item: any) => {
if (item.name === '小型车') { category.push(item.name)
if (item.data && item.data.length > 0) { seriesData.push(Number((Number(item.value) / 10000).toFixed(2)))
item.data.forEach((subItem: any) => { realData.push(Number(item.value).toLocaleString())
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])
})
}
}
}) })
} }
const lastYearReq: any = {
StatisticsDate: moment().subtract(1, 'y').format('YYYY'),
ProvinceCode: '340000',
StatisticsType: 4,
}
const lastYearData = await handleGetRevenueTrend(lastYearReq)
if (lastYearData && lastYearData.length > 0) {
lastYearData.forEach((item: any) => {
seriesDataLastYear.push(Number((Number(item.value) / 10000).toFixed(2)))
realDataLastYear.push(Number(item.value).toLocaleString())
})
}
console.log('datadatadatadatadatadatadata', data);
console.log('lastYearDatalastYearDatalastYearDatalastYearDatalastYearData', lastYearData);
let res: any = { let res: any = {
category: category,// x category: category,// x
// seriesData: seriesData,// y seriesData: seriesData,//
// realData: realData// realData: realData,//
smallCarData: smallCarData, seriesDataLastYear: seriesDataLastYear,//
middleCarData: middleCarData, realDataLastYear: realDataLastYear,//
bigCarData: bigCarData, currentYear: moment().format('YYYY'),
lastYear: moment().subtract(1, 'y').format('YYYY')
} }
return res return res
} }
@ -238,7 +231,8 @@ onBeforeUnmount(() => {
<template> <template>
<div class="VehicleModelStayBox"> <div class="VehicleModelStayBox">
<SmallTitle :title="`车型停留分析/日均${searchTime ? `(${searchTime}月)` : ''}`"></SmallTitle> <!-- <SmallTitle :title="`车型停留分析/日均${searchTime ? `(${searchTime}月)` : ''}`"></SmallTitle> -->
<SmallTitle :title="`经营效益趋势`"></SmallTitle>
<div class="VehicleModelStayCharts" style="margin-top:15px"> <div class="VehicleModelStayCharts" style="margin-top:15px">
<div class="VehicleModelStay" id="VehicleModelStay"></div> <div class="VehicleModelStay" id="VehicleModelStay"></div>

View File

@ -15,7 +15,8 @@
font-style: normal; font-style: normal;
padding-left: 8px; padding-left: 8px;
position: absolute; position: absolute;
top: -10px;right: 0; top: -10px;
right: 0;
} }
.VehiclesEntering { .VehiclesEntering {
@ -24,4 +25,16 @@
height: 190px; height: 190px;
} }
} }
.TrendCustomerRevenueCharts {
width: 100%;
margin-top: 10px;
.TrendCustomerRevenue {
width: 100%;
height: 140px;
}
}
} }

View File

@ -26,6 +26,7 @@ echarts.use([
]); ]);
let myChart: echarts.ECharts; let myChart: echarts.ECharts;
let myChart2: echarts.ECharts;
onMounted(async () => { onMounted(async () => {
await handleGoMounted() await handleGoMounted()
@ -52,15 +53,25 @@ const handleGoMounted = async () => {
if (!chartDom) return; if (!chartDom) return;
myChart = echarts.init(chartDom); myChart = echarts.init(chartDom);
const chartDom2 = document.getElementById('TrendCustomerRevenue');
if (!chartDom2) return;
myChart2 = echarts.init(chartDom2);
const option = { const option = {
tooltip: { tooltip: {
trigger: 'axis', trigger: 'axis', //
axisPointer: { axisPointer: { //
type: 'cross', type: 'shadow' //
crossStyle: { },
color: '#999' formatter: function (params: any) { //
} return `<div>
<div>${params[0].seriesName}${res?.realDataCar[params[0]?.dataIndex].toLocaleString()}</div>
<div>${params[1].seriesName}${res?.yesRealDataCar[params[1]?.dataIndex].toLocaleString()}</div>
</div>`
// return `
// <div>${realData ? realData + '' : data.value + ''} </div>
// `;
} }
}, },
legend: { legend: {
@ -87,29 +98,46 @@ const handleGoMounted = async () => {
data: res.category, data: res.category,
axisPointer: { axisPointer: {
type: 'shadow' type: 'shadow'
} },
axisLabel: {
color: '#fff',
formatter: '{value}' //
},
axisLine: {
lineStyle: {
color: '#fff' // y 线
}
},
}, },
yAxis: [ yAxis: [
{ {
type: 'value', type: 'value',
name: '车流量(万辆)', name: '万辆', //
splitLine: { show: false },
nameTextStyle: { nameTextStyle: {
color: '#666', color: '#fff',
padding: [0, 30, 0, 0] // padding: [0, 30, 0, 0] //
}, },
splitNumber: 4, axisLabel: {
}, color: '#fff',
{ formatter: '{value}' //
type: 'value',
name: '交易金额(万元)',
splitLine: { show: false },
nameTextStyle: {
color: '#666',
padding: [0, 0, 0, 30] //
}, },
splitNumber: 4, axisLine: {
} lineStyle: {
color: '#fff' // y 线
}
},
splitLine: { show: false }
},
// {
// type: 'value',
// name: '()',
// splitLine: { show: false },
// nameTextStyle: {
// color: '#666',
// padding: [0, 0, 0, 30] //
// },
// splitNumber: 4,
// }
], ],
series: [ series: [
{ {
@ -133,11 +161,107 @@ const handleGoMounted = async () => {
borderRadius: [3, 3, 0, 0] borderRadius: [3, 3, 0, 0]
} }
}, },
// {
// name: `${res.currentYear}`,
// type: 'line',
// data: res.seriesDataRevenue,
// yAxisIndex: 1,
// symbol: 'circle',
// symbolSize: 6,
// lineStyle: {
// width: 2
// }
// },
// {
// name: `${res.yesYear}`,
// type: 'line',
// data: res.yesSeriesDataRevenue,
// yAxisIndex: 1,
// symbol: 'circle',
// symbolSize: 6,
// lineStyle: {
// width: 2
// }
// }
],
color: ['#008CFF', '#69BCFF', '#FF5E5E', '#FF9500'] // Custom colors for each series
};
const option2 = {
tooltip: {
trigger: 'axis', //
axisPointer: { //
type: 'shadow' //
},
formatter: function (params: any) { //
return `<div>
<div>${params[0].seriesName}${res?.realDataRevenue[params[0]?.dataIndex].toLocaleString()}</div>
<div>${params[1].seriesName}${res?.yesRealDataRevenue[params[1]?.dataIndex].toLocaleString()}</div>
</div>`
}
},
legend: {
data: [`${res.currentYear}年交易额`, `${res.yesYear}年交易额`],
textStyle: {
color: '#fff',
fontSize: 12 // 12px
},
right: '4%',
top: '0%',
orient: 'horizontal',
type: 'scroll' //
},
grid: {
left: '0',
right: '0',
bottom: '0',
top: '30',
containLabel: true
},
xAxis: {
type: 'category',
boundaryGap: true,
data: res.category,
axisPointer: {
type: 'shadow'
},
axisLabel: {
color: '#fff',
formatter: '{value}' //
},
axisLine: {
lineStyle: {
color: '#fff' // y 线
}
},
},
yAxis: [
{
type: 'value',
name: '交易金额(万元)',
splitLine: { show: false },
splitNumber: 4,
nameTextStyle: {
color: '#fff',
padding: [0, 0, 0, 10] //
},
axisLabel: {
color: '#fff',
formatter: '{value}' //
},
axisLine: {
lineStyle: {
color: '#fff' // y 线
}
},
}
],
series: [
{ {
name: `${res.currentYear}年交易额`, name: `${res.currentYear}年交易额`,
type: 'line', type: 'line',
data: res.seriesDataRevenue, data: res.seriesDataRevenue,
yAxisIndex: 1,
symbol: 'circle', symbol: 'circle',
symbolSize: 6, symbolSize: 6,
lineStyle: { lineStyle: {
@ -148,7 +272,6 @@ const handleGoMounted = async () => {
name: `${res.yesYear}年交易额`, name: `${res.yesYear}年交易额`,
type: 'line', type: 'line',
data: res.yesSeriesDataRevenue, data: res.yesSeriesDataRevenue,
yAxisIndex: 1,
symbol: 'circle', symbol: 'circle',
symbolSize: 6, symbolSize: 6,
lineStyle: { lineStyle: {
@ -156,11 +279,17 @@ const handleGoMounted = async () => {
} }
} }
], ],
color: ['#008CFF', '#69BCFF', '#FF5E5E', '#FF9500'] // Custom colors for each series color: ['#FF5E5E', '#FF9500']
}; }
myChart.setOption(option); myChart.setOption(option);
myChart2.setOption(option2);
myChart.resize(); myChart.resize();
myChart2.resize();
window.addEventListener('resize', resizeChart); window.addEventListener('resize', resizeChart);
window.addEventListener('resize', resizeChart2);
} }
// //
@ -197,7 +326,7 @@ const handleGetSectionFlowCount = async () => {
console.log('dnasfhuaidhsdaghsakjlhsldk', data); console.log('dnasfhuaidhsdaghsakjlhsldk', data);
if (data && data.length > 0) { if (data && data.length > 0) {
data.forEach((item: any) => { data.forEach((item: any) => {
category.push(`${item.Statistics_Month < 10 ? '0' + item.Statistics_Month : item.Statistics_Month}`) category.push(`${item.Statistics_Month < 10 ? '0' + item.Statistics_Month : item.Statistics_Month}`)
seriesDataCar.push(Number((item.Vehicle_Count / 10000).toFixed(2))) seriesDataCar.push(Number((item.Vehicle_Count / 10000).toFixed(2)))
realDataCar.push(item.Vehicle_Count) realDataCar.push(item.Vehicle_Count)
seriesDataRevenue.push(Number((item.RevenueAmount / 10000).toFixed(2))) seriesDataRevenue.push(Number((item.RevenueAmount / 10000).toFixed(2)))
@ -246,10 +375,13 @@ const handleGetSectionFlowCount = async () => {
const resizeChart = () => { const resizeChart = () => {
myChart?.resize(); myChart?.resize();
}; };
const resizeChart2 = () => {
myChart2?.resize();
};
onBeforeUnmount(() => { onBeforeUnmount(() => {
window.removeEventListener('resize', resizeChart); window.removeEventListener('resize', resizeChart);
myChart?.dispose(); myChart?.dispose();
myChart2?.dispose();
}); });
</script> </script>
@ -259,7 +391,7 @@ onBeforeUnmount(() => {
<template> <template>
<div class="VehiclesEnteringBox"> <div class="VehiclesEnteringBox">
<SmallTitle :title="'月度车流累计'"> <SmallTitle :title="'入区车流趋势'">
<!-- <template #extra> <!-- <template #extra>
<div class="legendBox" style="display: flex;align-items: center;"> <div class="legendBox" style="display: flex;align-items: center;">
<div class="legendItem" style="display: flex;align-items: center;margin-right: 20px;"> <div class="legendItem" style="display: flex;align-items: center;margin-right: 20px;">
@ -288,5 +420,13 @@ onBeforeUnmount(() => {
<!-- <div class="VehiclesEnteringUnit"></div> --> <!-- <div class="VehiclesEnteringUnit"></div> -->
<div class="VehiclesEntering" id="VehiclesEntering"></div> <div class="VehiclesEntering" id="VehiclesEntering"></div>
</div> </div>
<SmallTitle :title="'对客营收趋势'" style="margin-top: 23px;" />
<div class="TrendCustomerRevenueCharts">
<div class="TrendCustomerRevenue" id="TrendCustomerRevenue"></div>
</div>
</div> </div>
</template> </template>

View File

@ -206,7 +206,8 @@ 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> <div :class="selectPageTab === 4 ? 'pageTopTabItem selectPageTopTabItem' : 'pageTopTabItem'"
@click="handleChangePageTab(4)">彩云驿出行</div>
<!-- @click="handleChangePageTab(4)" --> <!-- @click="handleChangePageTab(4)" -->
</div> </div>

View File

@ -2,7 +2,7 @@
import { onMounted, ref } from 'vue'; import { onMounted, ref } from 'vue';
import './supplierListBox.less' import './supplierListBox.less'
import shopIcon from '../../../../assets/image/shopIcon.png' import shopIcon from '../../../../assets/image/shopIcon.png'
import { handleGetSupplierList } from '../../service'; import { handleGetSupplierList, handleGetSupplierListChain } from '../../service';
// //
@ -20,7 +20,9 @@ const handleGetData = async () => {
ProvinceCode: "530000", ProvinceCode: "530000",
StatisticsMonth: "202505" StatisticsMonth: "202505"
} }
const data = await handleGetSupplierList(req) const data = await handleGetSupplierListChain(req)
console.log('handleGetSupplierListChainhandleGetSupplierListChain', data);
supplierList.value = data.slice(0, 9) supplierList.value = data.slice(0, 9)
} }

View File

@ -57,6 +57,7 @@ import AnnualAccountsReceivable from './components/AnnualAccountsReceivable/Annu
import DetailedPayment from './components/DetailedPayment/DetailedPayment.vue'; import DetailedPayment from './components/DetailedPayment/DetailedPayment.vue';
import DailyInspection from './components/DailyInspection/DailyInspection.vue'; import DailyInspection from './components/DailyInspection/DailyInspection.vue';
import AssessmentScoringRanking from './components/AssessmentScoringRanking/AssessmentScoringRanking.vue'; import AssessmentScoringRanking from './components/AssessmentScoringRanking/AssessmentScoringRanking.vue';
import SmallTitle from './components/smallTitle/smallTitle.vue';
// //
@ -113,52 +114,27 @@ const handleChangePageTab = (value: number) => {
</div> </div>
<!-- 分区一 --> <!-- 分区一 -->
<div class="content169" v-if="selectPageTab === 1 || selectPageTab === 3"> <div class="content169" v-show="selectPageTab === 1">
<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;" /> --> <div class="content169LeftContent">
<div class="content169LeftContent"> <!-- 服务区概况 -->
<!-- 服务区概况 --> <OverviewOfServiceArea />
<OverviewOfServiceArea />
<NewBigTitleBox :title="'管理运营监控'" style="margin-top: 15px;" />
<!-- 今日走势图 -->
<TodayTrend />
<!-- 服务区繁忙排行 交易排行 -->
<BusyTradingRanking style="margin-top: 11px;" />
<!-- 交易预警 -->
<!-- <TradingAlert style="margin-top: 11px;" /> -->
</div>
</template>
<template v-if="selectPageTab === 3">
<NewBigTitleBox title="应收账款" style="margin-top: 20px;" />
<div style="width: 100%;box-sizing: border-box;padding: 20px 11px;">
<!-- 合同信息 -->
<ContractInformation />
<!-- 收款完成进度 -->
<PaymentProgress style="margin-top: 24px;" />
<!-- 收款预警 -->
<AccountsReceivableWarning style="margin-top: 24px;" />
</div>
</template>
<NewBigTitleBox :title="'特情事件'" style="margin-top: 15px;" />
<!-- 今日走势图 -->
<!-- <TodayTrend /> -->
<!-- 服务区繁忙排行 交易排行 -->
<!-- <BusyTradingRanking style="margin-top: 11px;" /> -->
<!-- 交易预警 -->
<TradingAlert style="margin-top: 11px;" />
</div>
<!-- <modalTitle :title="'节假日营收分析'" style="margin-top: 20px;"> <!-- <modalTitle :title="'节假日营收分析'" style="margin-top: 20px;">
<template #extra> <template #extra>
@ -186,61 +162,38 @@ const handleChangePageTab = (value: number) => {
<!-- <AnnouncementTopic style="position: relative;z-index: 9;" /> --> <!-- <AnnouncementTopic style="position: relative;z-index: 9;" /> -->
</div> </div>
<div class="content169Right"> <div class="content169Right">
<!-- 时间天气等内容 --> <!-- 时间天气等内容 -->
<BasicMessageBox :currentService="currentService" /> <BasicMessageBox :currentService="currentService" />
<template v-if="selectPageTab === 1"> <NewBigTitleBox title="流量趋势" style="margin-top: 24px;" />
<NewBigTitleBox title="流量趋势" style="margin-top: 24px;" />
<div class="content169LeftContent" style="margin-top: 21px;"> <div class="content169LeftContent" style="margin-top: 21px;">
<div class="leftContentBoxItem"> <div class="leftContentBoxItem">
<!-- 车流断面趋势 --> <!-- 断面流量趋势 -->
<TrendOfTrafficFlow :currentService="currentService" /> <TrendOfTrafficFlow :currentService="currentService" />
</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> </div>
</template> <div class="leftContentBoxItem" style="margin-top: 23px;">
<!-- 入区车流趋势 -->
<VehiclesEntering :currentService="currentService" />
<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> </div>
</template>
<!-- <div class="leftContentBoxItem" style="margin-top: 30px;"> -->
<!-- 客流变化 -->
<!-- <PassengerFlowChanges :currentService="currentService" /> -->
<!-- </div> -->
<div class="leftContentBoxItem" style="margin-top: 33px;">
<!-- 经营效益趋势 -->
<VehicleModelStay />
</div>
</div>
</div> </div>
</div> </div>
<div class="pageBottom" v-if="selectPageTab === 1 || selectPageTab === 3"> <div class="pageBottom" v-if="selectPageTab === 1">
</div> </div>
@ -270,26 +223,7 @@ const handleChangePageTab = (value: number) => {
<PreferenceType style="margin-left: 20px;margin-top: 20px;" /> <PreferenceType style="margin-left: 20px;margin-top: 20px;" />
</div> </div>
<div class="left3stBottom"> <div class="left3stBottom" style="margin-top: 0;">
<div class="left3stBottomItem">
<!-- 消费转化率对比图 -->
<ConsumptionConversion />
</div>
<div class="left3stBottomItem">
<!-- 消费水平 -->
<ConsumptionLevel />
</div>
<div class="left3stBottomItem">
<!-- 消费时段分析 -->
<ConsumptionPeriod style="margin-top: 11px;" />
</div>
<div class="left3stBottomItem">
<!-- 品牌消费水平 -->
<BrandConsumptionLevel style="margin-top: 11px;" />
</div>
<div class="left3stBottomItem"> <div class="left3stBottomItem">
<!-- 客群特征分析 --> <!-- 客群特征分析 -->
@ -300,8 +234,34 @@ const handleChangePageTab = (value: number) => {
<!-- 客群消费偏好 --> <!-- 客群消费偏好 -->
<CustomerConsumptionPreferences style="margin-top: 15px;" /> <CustomerConsumptionPreferences style="margin-top: 15px;" />
</div> </div>
</div> </div>
<!-- 交易画像分析 -->
<NewBigTitleBox title="交易画像分析" :type="2" style="margin-top: 15px;" />
<div class="left3stBottom" style="margin-top: 0;">
<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> </div>
<div class="content1692stCenter"> <div class="content1692stCenter">
<NewBigTitleBox :title="'月度经营情况'" /> <NewBigTitleBox :title="'月度经营情况'" />
@ -323,10 +283,13 @@ const handleChangePageTab = (value: number) => {
<!-- </div> --> <!-- </div> -->
</div> </div>
<div class="content1692stRight"> <div class="content1692stRight">
<!-- 时间天气等内容 -->
<BasicMessageBox :currentService="currentService" style="margin-top: 20px;" />
<NewBigTitleBox :title="'经营业态月度情况'" style="margin-top: 20px;" /> <NewBigTitleBox :title="'经营业态月度情况'" style="margin-top: 20px;" />
<div class="rightContentBox"> <div class="rightContentBox">
<!-- 区域营收占比 --> <!-- 区域营收占比 -->
<RegionalRevenue :currentService="currentService" style="margin-top: 20px;" /> <RegionalRevenue :currentService="currentService" style="margin-top: 10px;" />
<!-- 多业态收入 --> <!-- 多业态收入 -->
<!-- <MultiIndustryIncome style="margin-top: 34px;" :currentService="currentService" /> --> <!-- <MultiIndustryIncome style="margin-top: 34px;" :currentService="currentService" /> -->
@ -373,55 +336,81 @@ const handleChangePageTab = (value: number) => {
</div> </div>
<!-- 分区三 --> <!-- 分区三 -->
<div class="content1693st" v-if="selectPageTab === 99"> <div class="content1693st" v-if="selectPageTab === 3">
<div class="content1693stItem"> <div class="content1693stItem">
<!-- 消息轮播框 --> <!-- 消息轮播框 -->
<NoticeListBox /> <NoticeListBox :currentService="currentService" />
<modalTitle :title="'供应商'" style="margin-top: 20px;" />
<SupplierListBox />
<!-- 品牌 --> <NewBigTitleBox title="应收账款" style="margin-top: 20px;" />
<modalTitle :title="'品牌'" style="margin-top: 20px;" /> <div style="width: 100%;box-sizing: border-box;padding: 20px 11px;">
<!-- 品牌列表 --> <!-- 合同信息 -->
<BrandListtBox /> <ContractInformation />
</div>
<div class="content1693stItem" style="padding-top: 46px;"> <!-- 收款完成进度 -->
<!-- 商户生态结构图谱 --> <PaymentProgress style="margin-top: 24px;" />
<modalTitle :title="'商户生态结构图谱'" />
<div class="content1693stItem2stContent"> <!-- 收款预警 -->
<!-- 商户类别 --> <AccountsReceivableWarning style="margin-top: 24px;" />
<MerchantCategory />
<!-- 扣分类型趋势 -->
<DeductionType style="margin-top: 30px;" />
<!-- 商户评分排行榜 -->
<MerchantRatingRanking style="margin-top: 16px;" />
<!-- 优质商户 -->
<HighQualityMerchants style="margin-top: 20px;" />
</div> </div>
</div> </div>
<div class="content1693stItem" style="padding-top: 46px;"> <div class="content1693stItem" style="padding-top: 46px;">
<!-- 员工福利与商城数据 --> <template>
<modalTitle :title="'员工福利与商城数据'" /> <!-- 商户生态结构图谱 -->
<div class="content1693stItem2stContent"> <modalTitle :title="'商户生态结构图谱'" />
<!-- 本月福利金发送额度 -->
<ThisMonthBenefits />
<!-- 核心品类占比 --> <div class="content1693stItem2stContent">
<CoreCategory style="margin-top: 20px;" /> <!-- 商户类别 -->
<MerchantCategory />
<!-- 热门商品榜单 --> <!-- 扣分类型趋势 -->
<HotProductList style="margin-top: 30px;" :pageType="'left'" /> <DeductionType style="margin-top: 30px;" />
</div>
<!-- 商户评分排行榜 -->
<MerchantRatingRanking style="margin-top: 16px;" />
<!-- 优质商户 -->
<HighQualityMerchants style="margin-top: 20px;" />
</div>
</template>
</div>
<div class="content1693stItem" style="padding-top: 46px;">
<template>
<!-- 员工福利与商城数据 -->
<modalTitle :title="'员工福利与商城数据'" />
<div class="content1693stItem2stContent">
<!-- 本月福利金发送额度 -->
<ThisMonthBenefits />
<!-- 核心品类占比 -->
<CoreCategory style="margin-top: 20px;" />
<!-- 热门商品榜单 -->
<HotProductList style="margin-top: 30px;" :pageType="'left'" />
</div>
</template>
</div> </div>
<div class="content1693stItem"> <div class="content1693stItem">
<!-- 时间天气等内容 -->
<BasicMessageBox :currentService="currentService" />
<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>
</div> </div>
</div> </div>
@ -429,7 +418,7 @@ const handleChangePageTab = (value: number) => {
<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;" /> <NoticeListBox />
<NewBigTitleBox :title="'管理运营监控'" style="margin-top: 29px;" /> <NewBigTitleBox :title="'管理运营监控'" style="margin-top: 29px;" />
@ -456,14 +445,14 @@ const handleChangePageTab = (value: number) => {
<div class="content1694stItem"> <div class="content1694stItem">
<NewBigTitleBox :title="'品牌'" style="margin-top: 74px;" /> <NewBigTitleBox :title="'品牌'" style="margin-top: 54px;" />
<!-- 商户类别比例图 下面的列表 --> <!-- 商户类别比例图 下面的列表 -->
<BrandDetail /> <BrandDetail />
</div> </div>
<div class="content1694stItem"> <div class="content1694stItem">
<NewBigTitleBox :title="'供应商'" style="margin-top: 74px;" /> <NewBigTitleBox :title="'供应商'" style="margin-top: 54px;" />
<SupplierListBox /> <SupplierListBox />
<!-- 在线服务区和在线收银机 --> <!-- 在线服务区和在线收银机 -->
<!-- <TodayTrend /> --> <!-- <TodayTrend /> -->
@ -476,7 +465,7 @@ const handleChangePageTab = (value: number) => {
</div> </div>
<div class="content1694stItem"> <div class="content1694stItem">
<!-- 时间天气等内容 --> <!-- 时间天气等内容 -->
<BasicMessageBox style="margin-top: 19px;" /> <BasicMessageBox :currentService="currentService" />
<NewBigTitleBox :title="'电商模块'" style="margin-top: 28px;" /> <NewBigTitleBox :title="'电商模块'" style="margin-top: 28px;" />
@ -489,7 +478,7 @@ const handleChangePageTab = (value: number) => {
<ThisMonthBenefits style="margin-top: 10px;" /> <ThisMonthBenefits style="margin-top: 10px;" />
<!-- 核心品类占比 --> <!-- 核心品类占比 -->
<CoreCategory style="margin-top: 10px;" /> <!-- <CoreCategory style="margin-top: 10px;" /> -->
<NewBigTitleBox :title="'商户生态结构图谱'" style="margin-top: 28px;" /> <NewBigTitleBox :title="'商户生态结构图谱'" style="margin-top: 28px;" />

View File

@ -114,7 +114,7 @@ export async function handleGetCurrentEarlyWarning(params: any) {
if (data.Result_Code !== 100) { if (data.Result_Code !== 100) {
return data return data
} }
return data.Result_Data.List return data.Result_Data
} }
@ -426,6 +426,15 @@ export async function handleGetExamineResultList(params: any) {
return data.Result_Data.List return data.Result_Data.List
} }
// 考核考评的数据 - 新的
export async function handleGetEvaluateResList(params: any) {
const data: any = await requestPos.post('/Examine/GetEvaluateResList', params)
if (data.Result_Code !== 100) {
return data
}
return data.Result_Data.List
}
// 获取服务区基础设施汇总数据 // 获取服务区基础设施汇总数据
export async function handleGetServerpartServiceSummary(params: any) { export async function handleGetServerpartServiceSummary(params: any) {
@ -454,3 +463,34 @@ export async function handleGetSupplierList(params: any) {
} }
return data.Result_Data.List return data.Result_Data.List
} }
// 获取供应商的列表数据
export async function handleGetSupplierListChain(params: any) {
const data: any = await requestPos.post('/SupplyChain/GetSupplierList', params)
if (data.Result_Code !== 100) {
return data
}
return data.Result_Data.List
}
// 获取供应商的列表数据
export async function handleGetMallOrderSummary(params: any) {
const data: any = await requestPos.post('/SupplyChain/GetMallOrderSummary', params)
if (data.Result_Code !== 100) {
return data
}
return data.Result_Data.List
}
// 获取员工福利汇总数据
export async function handleGetWelFareSummary(params: any) {
const data: any = await requestPos.post('/SupplyChain/GetWelFareSummary', params)
if (data.Result_Code !== 100) {
return data
}
return data.Result_Data
}