update
This commit is contained in:
parent
f855c18e98
commit
8bf3bc669b
@ -54,6 +54,7 @@
|
||||
color: #FFFFFF;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.busninessItemAddBox {
|
||||
@ -88,6 +89,7 @@
|
||||
letter-spacing: 2px;
|
||||
text-align: right;
|
||||
font-style: normal;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.busninessItemValue {
|
||||
@ -108,6 +110,7 @@
|
||||
font-style: normal;
|
||||
margin-left: 10px;
|
||||
margin-right: 7px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
}
|
||||
@ -140,13 +143,14 @@
|
||||
line-height: 29px;
|
||||
text-align: left;
|
||||
font-style: normal;
|
||||
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.newCoreBusinessItemValueBox {
|
||||
margin-top: 5px;
|
||||
display: flex;
|
||||
align-items: flex-end;
|
||||
white-space: nowrap;
|
||||
|
||||
.newCoreBusinessItemValue {
|
||||
font-family: Bahnschrift, Bahnschrift;
|
||||
@ -163,6 +167,7 @@
|
||||
background-clip: text;
|
||||
-webkit-text-fill-color: transparent;
|
||||
color: transparent;
|
||||
white-space: nowrap;
|
||||
}
|
||||
|
||||
.newCoreBusinessItemUnit {
|
||||
@ -174,6 +179,7 @@
|
||||
text-align: center;
|
||||
font-style: normal;
|
||||
margin-left: 5px;
|
||||
white-space: nowrap;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -3,39 +3,63 @@ import moment from 'moment';
|
||||
import { handleGetFiveNumber } from '../../../../options/serveice';
|
||||
import { handleGetMonthlyBusinessRevenue, handleGetRealData } from '../../service';
|
||||
import CenterTitle from '../CenterTitle/CenterTitle.vue';
|
||||
import NumberRoller from '../TradingAlert/NumberRoller.vue';
|
||||
import './CoreBusinessData.less'
|
||||
import { onMounted, onBeforeUnmount, ref, reactive, watch } from 'vue';
|
||||
import { onMounted, onBeforeUnmount, ref, reactive, watch, computed } from 'vue';
|
||||
|
||||
|
||||
// 总营收
|
||||
let revenueAmonut = ref<any>({
|
||||
value: 0,
|
||||
unit: "元"
|
||||
unit: "元",
|
||||
displayValue: 0 // 用于滚动显示的值
|
||||
})
|
||||
// 油品消耗
|
||||
let oilConsumption = ref<any>({
|
||||
value: 0,
|
||||
unit: ""
|
||||
unit: "",
|
||||
displayValue: 0 // 用于滚动显示的值
|
||||
})
|
||||
// 加水量
|
||||
let waterAddition = ref<any>({
|
||||
value: 0,
|
||||
unit: ""
|
||||
unit: "",
|
||||
displayValue: 0 // 用于滚动显示的值
|
||||
})
|
||||
// 尿素
|
||||
let urea = ref<any>({
|
||||
value: 0,
|
||||
unit: ""
|
||||
unit: "",
|
||||
displayValue: 0 // 用于滚动显示的值
|
||||
})
|
||||
// 充电次数
|
||||
let chargingCycles = ref<any>({
|
||||
value: 0,
|
||||
unit: ""
|
||||
unit: "",
|
||||
displayValue: 0 // 用于滚动显示的值
|
||||
})
|
||||
|
||||
// 防止重复调用的标志
|
||||
let isFetching = ref<boolean>(false)
|
||||
// 定时器变量 - 为不同业务类型设置单独的定时器
|
||||
let revenueTimer: any = null // 门店营收定时器
|
||||
let chargingTimer: any = null // 充电定时器
|
||||
let waterTimer: any = null // 加水定时器
|
||||
let ureaTimer: any = null // 尿素定时器
|
||||
let oilTimer: any = null // 油品定时器
|
||||
|
||||
// 切换显示状态:true显示金额,false显示数量
|
||||
let isShowingAmount = ref<boolean>(true)
|
||||
// 切换显示定时器
|
||||
let displaySwitchTimer: any = null
|
||||
|
||||
|
||||
onMounted(async () => {
|
||||
await handleGetMapRealData()
|
||||
// 启动定时更新,每5秒增加1000
|
||||
startPeriodicUpdate()
|
||||
// 启动显示切换定时器
|
||||
startDisplaySwitch()
|
||||
})
|
||||
|
||||
// 拿到传入的数据
|
||||
@ -48,13 +72,25 @@ const props = defineProps<{
|
||||
watch(
|
||||
() => props.currentService,
|
||||
(newVal, oldVal) => {
|
||||
// 只有当服务区真正发生变化时才重新获取数据
|
||||
if (newVal?.SERVERPART_ID !== oldVal?.SERVERPART_ID) {
|
||||
handleGetMapRealData()
|
||||
// 重启定时器,确保在新服务区下也能正常更新
|
||||
restartPeriodicUpdate()
|
||||
}
|
||||
},
|
||||
{ deep: true }
|
||||
);
|
||||
|
||||
// 拿到实时数据
|
||||
const handleGetMapRealData = async () => {
|
||||
// 防止重复调用
|
||||
if (isFetching.value) {
|
||||
return
|
||||
}
|
||||
|
||||
isFetching.value = true
|
||||
|
||||
const req: any = {
|
||||
serverPartId: props.currentService?.SERVERPART_ID || ""
|
||||
}
|
||||
@ -82,20 +118,28 @@ const handleGetMapRealData = async () => {
|
||||
// 门店营收
|
||||
if (item.dataType === 1000) {
|
||||
let obj: any = {
|
||||
value: handleGetPonitFixed(item.totalAmount),
|
||||
unit: item.totalAmountUnit
|
||||
value: parseFloat(handleGetPonitFixed(item.totalAmount)) || 0,
|
||||
unit: item.totalAmountUnit || '',
|
||||
totalCount: parseFloat(handleGetPonitFixed(item.totalCount)) || 0,
|
||||
totalCountUnit: item.totalCountUnit || ''
|
||||
}
|
||||
// let obj: any = {
|
||||
// value: item.totalAmount.toString().length > 8 ? Number((item.totalAmount / 10000).toFixed(2)).toLocaleString() : Number(item.totalAmount).toLocaleString(),
|
||||
// unit: item.totalAmount.toString().length > 8 ? '万元' : '元'
|
||||
// }
|
||||
console.log('objobjobjobjobj', obj);
|
||||
|
||||
aiObj["门店营收"] = `${item.totalAmount}${item.totalAmountUnit}`
|
||||
revenueAmonut.value = obj
|
||||
// 启动滚动动画
|
||||
startSingleNumberAnimation(revenueAmonut)
|
||||
} else if (item.dataType === 2000) {
|
||||
// 油品消耗
|
||||
let obj: any = {
|
||||
value: handleGetPonitFixed(item.totalCount),
|
||||
unit: item.totalCountUnit
|
||||
value: parseFloat(handleGetPonitFixed(item.totalAmount)) || 0,
|
||||
unit: item.totalAmountUnit || '',
|
||||
totalCount: parseFloat(handleGetPonitFixed(item.totalCount)) || 0,
|
||||
totalCountUnit: item.totalCountUnit || '',
|
||||
}
|
||||
// let obj: any = {
|
||||
// value: item.totalCount.toString().length > 8 ? Number((item.totalCount / 10000).toFixed(2)).toLocaleString() : Number(item.totalCount).toLocaleString(),
|
||||
@ -103,11 +147,15 @@ const handleGetMapRealData = async () => {
|
||||
// }
|
||||
aiObj["油品消耗"] = `${item.totalCount}${item.totalCountUnit}`
|
||||
oilConsumption.value = obj
|
||||
// 启动滚动动画
|
||||
startSingleNumberAnimation(oilConsumption)
|
||||
} else if (item.dataType === 3000) {
|
||||
// 加水量
|
||||
let obj: any = {
|
||||
value: handleGetPonitFixed(item.totalCount),
|
||||
unit: item.totalCountUnit
|
||||
value: parseFloat(handleGetPonitFixed(item.totalAmount)) || 0,
|
||||
unit: item.totalAmountUnit || '',
|
||||
totalCount: parseFloat(handleGetPonitFixed(item.totalCount)) || 0,
|
||||
totalCountUnit: item.totalCountUnit || '',
|
||||
}
|
||||
// let obj: any = {
|
||||
// value: item.totalCount.toString().length > 8 ? Number((item.totalCount / 10000).toFixed(2)).toLocaleString() : Number(item.totalCount).toLocaleString(),
|
||||
@ -115,11 +163,15 @@ const handleGetMapRealData = async () => {
|
||||
// }
|
||||
aiObj["加水量"] = `${item.totalCount}${item.totalCountUnit}`
|
||||
waterAddition.value = obj
|
||||
// 启动滚动动画
|
||||
startSingleNumberAnimation(waterAddition)
|
||||
} else if (item.dataType === 4000) {
|
||||
// 尿素
|
||||
let obj: any = {
|
||||
value: handleGetPonitFixed(item.totalCount),
|
||||
unit: item.totalCountUnit
|
||||
value: parseFloat(handleGetPonitFixed(item.totalAmount)) || 0,
|
||||
unit: item.totalAmountUnit || '',
|
||||
totalCount: parseFloat(handleGetPonitFixed(item.totalCount)) || 0,
|
||||
totalCountUnit: item.totalCountUnit || '',
|
||||
}
|
||||
// let obj: any = {
|
||||
// value: item.totalCount.toString().length > 8 ? Number((item.totalCount / 10000).toFixed(2)).toLocaleString() : Number(item.totalCount).toLocaleString(),
|
||||
@ -127,18 +179,26 @@ const handleGetMapRealData = async () => {
|
||||
// }
|
||||
aiObj["尿素"] = `${item.totalCount}${item.totalCountUnit}`
|
||||
urea.value = obj
|
||||
// 启动滚动动画
|
||||
startSingleNumberAnimation(urea)
|
||||
} else if (item.dataType === 5000) {
|
||||
// 充电次数
|
||||
let obj: any = {
|
||||
value: handleGetPonitFixed(item.totalTicket),
|
||||
unit: item.totalTicketUnit
|
||||
value: parseFloat(handleGetPonitFixed(item.totalAmount)) || 0,
|
||||
unit: item.totalAmountUnit || '',
|
||||
totalCount: parseFloat(handleGetPonitFixed(item.totalCount)) || 0,
|
||||
totalCountUnit: item.totalCountUnit || '',
|
||||
}
|
||||
// let obj: any = {
|
||||
// value: item.totalTicket.toString().length > 8 ? Number((item.totalTicket / 10000).toFixed(2)).toLocaleString() : Number(item.totalCount).toLocaleString(),
|
||||
// unit: item.totalTicket.toString().length > 8 ? '万单' : '单'
|
||||
// }
|
||||
aiObj["充电次数"] = `${item.totalTicket}${item.totalTicketUnit}`
|
||||
console.log('objobjobjobj', obj);
|
||||
|
||||
chargingCycles.value = obj
|
||||
// 启动滚动动画
|
||||
startSingleNumberAnimation(chargingCycles)
|
||||
}
|
||||
})
|
||||
}
|
||||
@ -221,11 +281,277 @@ const handleGetMapRealData = async () => {
|
||||
sessionStorage.setItem("CoreBusinessDataMonthAI", JSON.stringify(aiObjMonthSum))
|
||||
}
|
||||
|
||||
// 重置调用标志
|
||||
isFetching.value = false
|
||||
}
|
||||
// 拿到小数点后两位
|
||||
const handleGetPonitFixed = (str: string) => {
|
||||
const num = parseFloat(str); // 先转为number类型
|
||||
return isNaN(num) ? "0.00" : num.toFixed(2);
|
||||
// 拿到小数点后转为数字
|
||||
const handleGetPonitFixed = (str: string | number) => {
|
||||
const num = parseFloat(String(str)); // 确保转为字符串再转为number
|
||||
return isNaN(num) ? 0 : num; // 直接返回数字,不是字符串
|
||||
}
|
||||
|
||||
// 生成随机数函数,支持主区间概率
|
||||
const generateRandomValue = (min: number, max: number, mainMin: number, mainMax: number, mainProb: number = 0.7): number => {
|
||||
// mainProb 概率落在主区间内
|
||||
if (Math.random() < mainProb) {
|
||||
// 主区间
|
||||
return Math.random() * (mainMax - mainMin) + mainMin
|
||||
} else {
|
||||
// 全区间
|
||||
return Math.random() * (max - min) + min
|
||||
}
|
||||
}
|
||||
|
||||
// 获取随机时间间隔(秒)
|
||||
const getRandomInterval = (minSeconds: number, maxSeconds: number): number => {
|
||||
return Math.floor(Math.random() * (maxSeconds - minSeconds + 1) + minSeconds) * 1000
|
||||
}
|
||||
|
||||
// 门店营收更新:1-5秒内金额随机1-100元(主区间15-25元,留1位小数)
|
||||
const updateRevenue = () => {
|
||||
const randomAmount = generateRandomValue(1, 100, 15, 25, 0.7)
|
||||
console.log('🔍 DEBUG randomAmount:', randomAmount)
|
||||
|
||||
// 根据当前显示模式更新不同的字段
|
||||
if (isShowingAmount.value) {
|
||||
// 显示金额模式 - 更新金额字段
|
||||
const currentValue = parseFloat(revenueAmonut.value.value) || 0
|
||||
const unit = revenueAmonut.value.unit || ''
|
||||
const actualAmount = unit.includes('万元') ? randomAmount / 10000 : randomAmount
|
||||
revenueAmonut.value.value = (currentValue + actualAmount)
|
||||
console.log('💰 门店营收金额增加:', actualAmount + unit, '当前总值:', revenueAmonut.value.value)
|
||||
} else {
|
||||
// 显示数量模式 - 更新数量字段
|
||||
const currentValue = parseFloat(revenueAmonut.value.totalCount) || 0
|
||||
const unit = revenueAmonut.value.totalCountUnit || ''
|
||||
const actualAmount = unit.includes('万单') ? randomAmount / 100 : randomAmount // 假设数量单位是万单
|
||||
revenueAmonut.value.totalCount = (currentValue + actualAmount)
|
||||
console.log('💰 门店营收数量增加:', actualAmount + unit, '当前总值:', revenueAmonut.value.totalCount)
|
||||
}
|
||||
|
||||
// 1-5秒随机间隔
|
||||
revenueTimer = setTimeout(updateRevenue, getRandomInterval(1, 5))
|
||||
}
|
||||
|
||||
// 充电更新:1-5秒内,数量随机增加(0-3笔订单,主区间1笔),金额1-100元(主区间15-35元,留两位小数)
|
||||
const updateCharging = () => {
|
||||
const orders = Math.random() < 0.7 ? 1 : Math.floor(Math.random() * 4) // 主区间1笔
|
||||
|
||||
// 根据当前显示模式更新不同的字段
|
||||
if (isShowingAmount.value) {
|
||||
// 显示金额模式 - 更新金额字段
|
||||
const randomAmount = generateRandomValue(1, 100, 15, 35, 0.7)
|
||||
const currentValue = parseFloat(chargingCycles.value.value) || 0
|
||||
const unit = chargingCycles.value.unit || ''
|
||||
const actualAmount = unit.includes('万元') ? randomAmount / 10000 : randomAmount
|
||||
chargingCycles.value.value = (currentValue + actualAmount)
|
||||
console.log('⚡ 充电金额增加:', actualAmount + unit, '当前总值:', chargingCycles.value.value)
|
||||
} else {
|
||||
// 显示数量模式 - 更新数量字段
|
||||
const currentValue = parseFloat(chargingCycles.value.totalCount) || 0
|
||||
const unit = chargingCycles.value.totalCountUnit || ''
|
||||
const actualAmount = unit.includes('万单') ? orders / 10000 : orders
|
||||
chargingCycles.value.totalCount = (currentValue + actualAmount)
|
||||
console.log('⚡ 充电数量增加:', actualAmount + unit, `(${orders}笔)`, '当前总值:', chargingCycles.value.totalCount)
|
||||
}
|
||||
|
||||
// 1-5秒随机间隔
|
||||
chargingTimer = setTimeout(updateCharging, getRandomInterval(1, 5))
|
||||
}
|
||||
|
||||
// 加水更新:1分钟内,加注吨数随机增加(0-1.2吨,主区间0.3-0.7吨,留两位小数)
|
||||
const updateWater = () => {
|
||||
const randomAmount = generateRandomValue(0, 1.2, 0.3, 0.7, 0.7) // 按吨数累加
|
||||
|
||||
// 根据当前显示模式更新不同的字段
|
||||
if (isShowingAmount.value) {
|
||||
// 显示金额模式 - 更新金额字段
|
||||
const revenueAmount = generateRandomValue(10, 500, 50, 150, 0.7) // 金额范围
|
||||
const currentValue = parseFloat(waterAddition.value.value) || 0
|
||||
const unit = waterAddition.value.unit || ''
|
||||
const actualAmount = unit.includes('万元') ? revenueAmount / 10000 : revenueAmount
|
||||
waterAddition.value.value = (currentValue + actualAmount)
|
||||
console.log('💧 加水金额增加:', actualAmount + unit, '当前总值:', waterAddition.value.value)
|
||||
} else {
|
||||
// 显示数量模式 - 更新数量字段
|
||||
const currentValue = parseFloat(waterAddition.value.totalCount) || 0
|
||||
const unit = waterAddition.value.totalCountUnit || ''
|
||||
const actualAmount = unit.includes('万吨') ? randomAmount / 10000 : randomAmount
|
||||
waterAddition.value.totalCount = (currentValue + actualAmount)
|
||||
console.log('💧 加水数量增加:', actualAmount + unit, '(原始值:', randomAmount.toFixed(2) + '吨)', '当前总值:', waterAddition.value.totalCount)
|
||||
}
|
||||
|
||||
// 1分钟间隔
|
||||
waterTimer = setTimeout(updateWater, 60000)
|
||||
}
|
||||
|
||||
// 尿素更新:1分钟内,加注吨数随机增加(0-0.2吨,主区间0.06-0.10吨,留两位小数)
|
||||
const updateUrea = () => {
|
||||
const randomAmount = generateRandomValue(0, 0.2, 0.06, 0.10, 0.7) // 按吨数累加
|
||||
|
||||
// 根据当前显示模式更新不同的字段
|
||||
if (isShowingAmount.value) {
|
||||
// 显示金额模式 - 更新金额字段
|
||||
const revenueAmount = generateRandomValue(20, 800, 80, 200, 0.7) // 金额范围
|
||||
const currentValue = parseFloat(urea.value.value) || 0
|
||||
const unit = urea.value.unit || ''
|
||||
const actualAmount = unit.includes('万元') ? revenueAmount / 10000 : revenueAmount
|
||||
urea.value.value = (currentValue + actualAmount)
|
||||
console.log('🧪 尿素金额增加:', actualAmount + unit, '当前总值:', urea.value.value)
|
||||
} else {
|
||||
// 显示数量模式 - 更新数量字段
|
||||
const currentValue = parseFloat(urea.value.totalCount) || 0
|
||||
const unit = urea.value.totalCountUnit || ''
|
||||
const actualAmount = unit.includes('万吨') ? randomAmount / 10000 : randomAmount
|
||||
urea.value.totalCount = (currentValue + actualAmount)
|
||||
console.log('🧪 尿素数量增加:', actualAmount + unit, '(原始值:', randomAmount.toFixed(3) + '吨)', '当前总值:', urea.value.totalCount)
|
||||
}
|
||||
|
||||
// 1分钟间隔
|
||||
ureaTimer = setTimeout(updateUrea, 60000)
|
||||
}
|
||||
|
||||
// 油品更新:1-5秒内,加注吨数随机增加(0-0.1吨,主区间0.020-0.050吨,留三位小数)
|
||||
const updateOil = () => {
|
||||
const randomAmount = generateRandomValue(0, 0.1, 0.020, 0.050, 0.7) // 按吨数累加
|
||||
|
||||
// 根据当前显示模式更新不同的字段
|
||||
if (isShowingAmount.value) {
|
||||
// 显示金额模式 - 更新金额字段
|
||||
const revenueAmount = generateRandomValue(50, 1000, 100, 300, 0.7) // 金额范围
|
||||
const currentValue = parseFloat(oilConsumption.value.value) || 0
|
||||
const unit = oilConsumption.value.unit || ''
|
||||
const actualAmount = unit.includes('万元') ? revenueAmount / 10000 : revenueAmount
|
||||
oilConsumption.value.value = (currentValue + actualAmount)
|
||||
console.log('⛽ 油品金额增加:', actualAmount + unit, '当前总值:', oilConsumption.value.value)
|
||||
} else {
|
||||
// 显示数量模式 - 更新数量字段
|
||||
const currentValue = parseFloat(oilConsumption.value.totalCount) || 0
|
||||
const unit = oilConsumption.value.totalCountUnit || ''
|
||||
const actualAmount = unit.includes('万吨') ? randomAmount / 10000 : randomAmount
|
||||
oilConsumption.value.totalCount = (currentValue + actualAmount)
|
||||
console.log('⛽ 油品数量增加:', actualAmount + unit, '(原始值:', randomAmount.toFixed(3) + '吨)', '当前总值:', oilConsumption.value.totalCount)
|
||||
}
|
||||
|
||||
// 1-5秒随机间隔
|
||||
oilTimer = setTimeout(updateOil, getRandomInterval(1, 5))
|
||||
}
|
||||
|
||||
// 启动所有定时器
|
||||
const startPeriodicUpdate = () => {
|
||||
// 清除所有现有定时器
|
||||
clearAllTimers()
|
||||
|
||||
console.log('🚀 启动业务数据实时更新')
|
||||
|
||||
// 延迟启动,避免同时更新
|
||||
setTimeout(updateRevenue, 1000) // 1秒后启动营收更新
|
||||
setTimeout(updateCharging, 2000) // 2秒后启动充电更新
|
||||
setTimeout(updateWater, 10000) // 10秒后启动加水更新
|
||||
setTimeout(updateUrea, 15000) // 15秒后启动尿素更新
|
||||
setTimeout(updateOil, 3000) // 3秒后启动油品更新
|
||||
}
|
||||
|
||||
// 清除所有定时器
|
||||
const clearAllTimers = () => {
|
||||
if (revenueTimer) { clearTimeout(revenueTimer); revenueTimer = null }
|
||||
if (chargingTimer) { clearTimeout(chargingTimer); chargingTimer = null }
|
||||
if (waterTimer) { clearTimeout(waterTimer); waterTimer = null }
|
||||
if (ureaTimer) { clearTimeout(ureaTimer); ureaTimer = null }
|
||||
if (oilTimer) { clearTimeout(oilTimer); oilTimer = null }
|
||||
}
|
||||
|
||||
// 重启定时器函数
|
||||
const restartPeriodicUpdate = () => {
|
||||
console.log('🔄 重启所有业务定时器')
|
||||
startPeriodicUpdate()
|
||||
}
|
||||
|
||||
// 启动显示切换定时器
|
||||
const startDisplaySwitch = () => {
|
||||
displaySwitchTimer = setInterval(() => {
|
||||
isShowingAmount.value = !isShowingAmount.value
|
||||
console.log(`🔄 切换显示模式: ${isShowingAmount.value ? '金额' : '数量'}`)
|
||||
}, 5000) // 每5秒切换一次
|
||||
}
|
||||
|
||||
// 组件卸载时清除定时器
|
||||
onBeforeUnmount(() => {
|
||||
clearAllTimers()
|
||||
if (displaySwitchTimer) {
|
||||
clearInterval(displaySwitchTimer)
|
||||
displaySwitchTimer = null
|
||||
}
|
||||
})
|
||||
|
||||
// 数字滚动动画函数
|
||||
const animateNumber = (targetRef: any, startValue: number, endValue: number) => {
|
||||
const duration = 1500 // 动画时长1.5秒
|
||||
const startTime = Date.now()
|
||||
|
||||
const animate = () => {
|
||||
const currentTime = Date.now()
|
||||
const elapsed = currentTime - startTime
|
||||
const progress = Math.min(elapsed / duration, 1)
|
||||
|
||||
// 使用easeOutCubic缓动函数
|
||||
const easeOutCubic = 1 - Math.pow(1 - progress, 3)
|
||||
const currentValue = startValue + (endValue - startValue) * easeOutCubic
|
||||
|
||||
// 更新显示值
|
||||
targetRef.value.displayValue = currentValue
|
||||
|
||||
if (progress < 1) {
|
||||
requestAnimationFrame(animate)
|
||||
}
|
||||
}
|
||||
|
||||
requestAnimationFrame(animate)
|
||||
}
|
||||
|
||||
// 为单个数据启动滚动动画
|
||||
const startSingleNumberAnimation = (targetRef: any) => {
|
||||
const targetValue = parseFloat(targetRef.value.value) || 0
|
||||
const startValue = 0
|
||||
animateNumber(targetRef, startValue, targetValue)
|
||||
}
|
||||
|
||||
// 为每个数据创建计算属性
|
||||
const revenueDisplay = computed(() => getDisplayData(revenueAmonut))
|
||||
const oilDisplay = computed(() => getDisplayData(oilConsumption))
|
||||
const waterDisplay = computed(() => getDisplayData(waterAddition))
|
||||
const ureaDisplay = computed(() => getDisplayData(urea))
|
||||
const chargingDisplay = computed(() => getDisplayData(chargingCycles))
|
||||
|
||||
// 计算属性:根据显示状态获取当前显示的值和单位
|
||||
const getDisplayData = (dataRef: any) => {
|
||||
if (isShowingAmount.value) {
|
||||
// 显示金额
|
||||
return {
|
||||
value: Number(dataRef.value.value) || 0,
|
||||
unit: dataRef.value.unit || '',
|
||||
decimals: 1 // 金额显示1位小数
|
||||
}
|
||||
} else {
|
||||
// 显示数量
|
||||
const totalCount = dataRef.value.totalCount
|
||||
const totalCountUnit = dataRef.value.totalCountUnit
|
||||
|
||||
// 如果有数量数据就显示数量,否则显示金额
|
||||
const value = totalCount ? Number(totalCount) : Number(dataRef.value.value) || 0
|
||||
const unit = totalCountUnit || dataRef.value.unit || ''
|
||||
|
||||
return {
|
||||
value: value,
|
||||
unit: unit,
|
||||
decimals: totalCount ? 2 : 1 // 有数量数据时显示2位小数
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
// 获取当前显示模式的标签
|
||||
const getDisplayLabel = (defaultLabel: string) => {
|
||||
return isShowingAmount.value ? `今日${defaultLabel}营收` : `今日${defaultLabel}数量`
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
@ -241,10 +567,13 @@ defineExpose({
|
||||
|
||||
<div class="newCoreBusinessBox">
|
||||
<div class="newCoreBusinessItem">
|
||||
<div class="newCoreBusinessItemLabel">今日营收</div>
|
||||
<div class="newCoreBusinessItemLabel">{{ getDisplayLabel('') }}</div>
|
||||
<div class="newCoreBusinessItemValueBox">
|
||||
<div class="newCoreBusinessItemValue">{{ revenueAmonut.value }}</div>
|
||||
<div class="newCoreBusinessItemUnit">{{ revenueAmonut.unit }}</div>
|
||||
<div class="newCoreBusinessItemValue">
|
||||
<NumberRoller :value="revenueDisplay.value" :duration="1800"
|
||||
:decimals="revenueDisplay.decimals" />
|
||||
</div>
|
||||
<div class="newCoreBusinessItemUnit">{{ revenueDisplay.unit }}</div>
|
||||
|
||||
</div>
|
||||
<!-- <div class="newCoreBusinessItemCompare">
|
||||
@ -255,10 +584,12 @@ defineExpose({
|
||||
</div>
|
||||
|
||||
<div class="newCoreBusinessItem">
|
||||
<div class="newCoreBusinessItemLabel">今日油品</div>
|
||||
<div class="newCoreBusinessItemLabel">{{ getDisplayLabel('油品') }}</div>
|
||||
<div class="newCoreBusinessItemValueBox">
|
||||
<div class="newCoreBusinessItemValue">{{ oilConsumption.value }}</div>
|
||||
<div class="newCoreBusinessItemUnit">{{ oilConsumption.unit }}</div>
|
||||
<div class="newCoreBusinessItemValue">
|
||||
<NumberRoller :value="oilDisplay.value" :duration="1500" :decimals="oilDisplay.decimals" />
|
||||
</div>
|
||||
<div class="newCoreBusinessItemUnit">{{ oilDisplay.unit }}</div>
|
||||
</div>
|
||||
<!-- <div class="newCoreBusinessItemCompare">
|
||||
<div class="newCoreBusinessItemText"></div>
|
||||
@ -268,10 +599,12 @@ defineExpose({
|
||||
</div>
|
||||
|
||||
<div class="newCoreBusinessItem">
|
||||
<div class="newCoreBusinessItemLabel">今日加水</div>
|
||||
<div class="newCoreBusinessItemLabel">{{ getDisplayLabel('加水') }}</div>
|
||||
<div class="newCoreBusinessItemValueBox">
|
||||
<div class="newCoreBusinessItemValue">{{ waterAddition.value }}</div>
|
||||
<div class="newCoreBusinessItemUnit">{{ waterAddition.unit }}</div>
|
||||
<div class="newCoreBusinessItemValue">
|
||||
<NumberRoller :value="waterDisplay.value" :duration="1200" :decimals="waterDisplay.decimals" />
|
||||
</div>
|
||||
<div class="newCoreBusinessItemUnit">{{ waterDisplay.unit }}</div>
|
||||
</div>
|
||||
<!-- <div class="newCoreBusinessItemCompare">
|
||||
<div class="newCoreBusinessItemText"></div>
|
||||
@ -281,10 +614,12 @@ defineExpose({
|
||||
</div>
|
||||
|
||||
<div class="newCoreBusinessItem">
|
||||
<div class="newCoreBusinessItemLabel">今日尿素</div>
|
||||
<div class="newCoreBusinessItemLabel">{{ getDisplayLabel('尿素') }}</div>
|
||||
<div class="newCoreBusinessItemValueBox">
|
||||
<div class="newCoreBusinessItemValue">{{ urea.value }}</div>
|
||||
<div class="newCoreBusinessItemUnit">{{ urea.unit }}</div>
|
||||
<div class="newCoreBusinessItemValue">
|
||||
<NumberRoller :value="ureaDisplay.value" :duration="1000" :decimals="ureaDisplay.decimals" />
|
||||
</div>
|
||||
<div class="newCoreBusinessItemUnit">{{ ureaDisplay.unit }}</div>
|
||||
</div>
|
||||
<!-- <div class="newCoreBusinessItemCompare">
|
||||
<div class="newCoreBusinessItemText"></div>
|
||||
@ -294,10 +629,13 @@ defineExpose({
|
||||
</div>
|
||||
|
||||
<div class="newCoreBusinessItem">
|
||||
<div class="newCoreBusinessItemLabel">今日充电</div>
|
||||
<div class="newCoreBusinessItemLabel">{{ getDisplayLabel('充电') }}</div>
|
||||
<div class="newCoreBusinessItemValueBox">
|
||||
<div class="newCoreBusinessItemValue">{{ chargingCycles.value }}</div>
|
||||
<div class="newCoreBusinessItemUnit">{{ chargingCycles.unit }}</div>
|
||||
<div class="newCoreBusinessItemValue">
|
||||
<NumberRoller :value="chargingDisplay.value" :duration="800"
|
||||
:decimals="chargingDisplay.decimals" />
|
||||
</div>
|
||||
<div class="newCoreBusinessItemUnit">{{ chargingDisplay.unit }}</div>
|
||||
</div>
|
||||
<!-- <div class="newCoreBusinessItemCompare">
|
||||
<div class="newCoreBusinessItemText"></div>
|
||||
|
||||
@ -45,19 +45,19 @@ import SmallTitle from '../smallTitle/smallTitle.vue'
|
||||
</div>
|
||||
|
||||
<!-- 会员消费情况 -->
|
||||
<SmallTitle title="会员消费情况" />
|
||||
<SmallTitle title="近30天会员消费情况" />
|
||||
|
||||
<div class="MemberConsumption">
|
||||
<div class="MemberConsumptionItem">
|
||||
<div class="MemberConsumptionLabel">会员消费笔数</div>
|
||||
<div class="MemberConsumptionProgress"></div>
|
||||
<div class="MemberConsumptionValue">133</div>
|
||||
<div class="MemberConsumptionValue">104</div>
|
||||
</div>
|
||||
|
||||
<div class="MemberConsumptionItem" style="margin-top: 18px;">
|
||||
<div class="MemberConsumptionLabel">会员总销售额</div>
|
||||
<div class="MemberConsumptionProgress2"></div>
|
||||
<div class="MemberConsumptionValue">27,734.10</div>
|
||||
<div class="MemberConsumptionValue">47,550.60</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -65,48 +65,48 @@ import SmallTitle from '../smallTitle/smallTitle.vue'
|
||||
<div class="MemberContentBoxItem">
|
||||
<div class="MemberContentBoxItemBox">
|
||||
<div class="MemberContentBoxItemLabel">工会会员</div>
|
||||
<div class="MemberContentBoxItemValue">512</div>
|
||||
<div class="MemberContentBoxItemValue">1782</div>
|
||||
</div>
|
||||
<div class="MemberContentBoxItemBox" style="margin-top: 18px;">
|
||||
<div class="MemberContentBoxItemLabel">会员占比</div>
|
||||
<div class="MemberContentBoxItemValue">4.02%</div>
|
||||
<div class="MemberContentBoxItemValue">11.82%</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="MemberContentBoxItem">
|
||||
<div class="MemberContentBoxItemBox">
|
||||
<div class="MemberContentBoxItemLabel">会员转化率</div>
|
||||
<div class="MemberContentBoxItemValue">15.06%</div>
|
||||
<div class="MemberContentBoxItemValue">32.17%</div>
|
||||
</div>
|
||||
<div class="MemberContentBoxItemBox" style="margin-top: 18px;">
|
||||
<div class="MemberContentBoxItemLabel">会员增长率</div>
|
||||
<div class="MemberContentBoxItemValue">0.74%</div>
|
||||
<div class="MemberContentBoxItemValue">0.97%</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
|
||||
<!-- 会员消费情况 -->
|
||||
<SmallTitle title="会员消费数据概览" style="margin-top: 25px;" />
|
||||
<SmallTitle title="近30天消费数据概览" style="margin-top: 25px;" />
|
||||
|
||||
<div class="MemberOverview">
|
||||
<div class="MemberOverviewItem">
|
||||
<div class="MemberOverviewItemTop">23</div>
|
||||
<div class="MemberOverviewItemTop">99</div>
|
||||
<div class="MemberOverviewItemBottom">购买人数</div>
|
||||
</div>
|
||||
|
||||
<div class="MemberOverviewItem">
|
||||
<div class="MemberOverviewItemTop">23</div>
|
||||
<div class="MemberOverviewItemBottom"></div>
|
||||
<div class="MemberOverviewItemTop">480.31</div>
|
||||
<div class="MemberOverviewItemBottom">人均消费金额</div>
|
||||
</div>
|
||||
|
||||
<div class="MemberOverviewItem">
|
||||
<div class="MemberOverviewItemTop">208.53</div>
|
||||
<div class="MemberOverviewItemTop">461.66</div>
|
||||
<div class="MemberOverviewItemBottom">客单价</div>
|
||||
</div>
|
||||
|
||||
<div class="MemberOverviewItem">
|
||||
<div class="MemberOverviewItemTop">29.17%</div>
|
||||
<div class="MemberOverviewItemTop">2.02%</div>
|
||||
<div class="MemberOverviewItemBottom">会员复购率</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
@ -172,6 +172,11 @@ const handleGetServiceList = async () => {
|
||||
defaultServerPartList = res;
|
||||
allServerPartIdList = allId;
|
||||
|
||||
SPREGIONTYPECOLORLIST.push({
|
||||
label: '美丽公路项目',
|
||||
value: 130
|
||||
})
|
||||
|
||||
SPREGIONTYPECOLORList = SPREGIONTYPECOLORLIST;
|
||||
SPREGIONTYPECOLOR.value = SPREGIONTYPETYPEObj;
|
||||
|
||||
|
||||
55
src/page/index/components/TradingAlert/NumberRoller.vue
Normal file
55
src/page/index/components/TradingAlert/NumberRoller.vue
Normal file
@ -0,0 +1,55 @@
|
||||
<template>
|
||||
<span>{{ displayValue }}</span>
|
||||
</template>
|
||||
|
||||
<script setup lang="ts">
|
||||
import { ref, watch, onMounted } from 'vue'
|
||||
|
||||
interface Props {
|
||||
value: number | string
|
||||
duration?: number
|
||||
decimals?: number
|
||||
}
|
||||
|
||||
const props = withDefaults(defineProps<Props>(), {
|
||||
duration: 1000,
|
||||
decimals: 0
|
||||
})
|
||||
|
||||
const displayValue = ref(0)
|
||||
|
||||
const animateValue = (start: number, end: number, duration: number) => {
|
||||
const startTime = performance.now()
|
||||
|
||||
const updateValue = (currentTime: number) => {
|
||||
const elapsed = currentTime - startTime
|
||||
const progress = Math.min(elapsed / duration, 1)
|
||||
|
||||
// 使用 easeOutQuart 缓动函数
|
||||
const easeOutQuart = 1 - Math.pow(1 - progress, 4)
|
||||
const currentValue: any = start + (end - start) * easeOutQuart
|
||||
|
||||
displayValue.value = currentValue.toFixed(props.decimals)
|
||||
|
||||
if (progress < 1) {
|
||||
requestAnimationFrame(updateValue)
|
||||
}
|
||||
}
|
||||
|
||||
requestAnimationFrame(updateValue)
|
||||
}
|
||||
|
||||
watch(() => props.value, (newValue) => {
|
||||
const targetValue = Number(newValue) || 0
|
||||
const currentValue = Number(displayValue.value) || 0
|
||||
|
||||
if (currentValue !== targetValue) {
|
||||
animateValue(currentValue, targetValue, props.duration)
|
||||
}
|
||||
}, { immediate: true })
|
||||
|
||||
onMounted(() => {
|
||||
const targetValue = Number(props.value) || 0
|
||||
animateValue(0, targetValue, props.duration)
|
||||
})
|
||||
</script>
|
||||
@ -1,7 +1,8 @@
|
||||
<script setup lang="ts">
|
||||
import './TradingAlert.less'
|
||||
import SmallTitle from '../smallTitle/smallTitle.vue'
|
||||
import { onMounted, reactive, ref } from 'vue';
|
||||
import NumberRoller from './NumberRoller.vue'
|
||||
import { onMounted, onBeforeUnmount, reactive, ref } from 'vue';
|
||||
import { handleGetCurrentEarlyWarning, handleGetEarlyWarning } from '../../service';
|
||||
|
||||
// 交易预警数据
|
||||
@ -9,27 +10,38 @@ let TradingAlertList = reactive<any>([])
|
||||
// 交易预警的其他信息内容
|
||||
let TradingOtherData = ref<any>()
|
||||
|
||||
// 防止重复调用的标志
|
||||
let isFetching = ref<boolean>(false)
|
||||
// 定时器变量
|
||||
let dataRefreshTimer: any = null // 数据刷新定时器(10分钟)
|
||||
let scrollTimer: any = null // 滚动效果定时器(10秒)
|
||||
|
||||
onMounted(async () => {
|
||||
// 请求数据
|
||||
await handleGetData()
|
||||
// 启动定时更新
|
||||
startTimers()
|
||||
})
|
||||
|
||||
// 组件卸载时清除定时器
|
||||
onBeforeUnmount(() => {
|
||||
clearAllTimers()
|
||||
})
|
||||
|
||||
// 请求数据
|
||||
const handleGetData = async () => {
|
||||
// const req: any = {
|
||||
// action_type: "GetEarlyWarning",
|
||||
// province_code: 5564
|
||||
// }
|
||||
// const data = await handleGetEarlyWarning(req)
|
||||
// 防止重复调用
|
||||
if (isFetching.value) {
|
||||
return
|
||||
}
|
||||
|
||||
isFetching.value = true
|
||||
|
||||
const req: any = {
|
||||
ProvinceCode: "530000",
|
||||
ServerpartId: ""
|
||||
}
|
||||
|
||||
|
||||
|
||||
let TradingAlert = sessionStorage.getItem('TradingAlert')
|
||||
let data: any = []
|
||||
if (TradingAlert) {
|
||||
@ -39,7 +51,7 @@ const handleGetData = async () => {
|
||||
sessionStorage.setItem("TradingAlert", JSON.stringify(data))
|
||||
}
|
||||
|
||||
console.log('skodpijasidjaslfddfas', data);
|
||||
console.log('交易预警数据更新:', data);
|
||||
|
||||
TradingOtherData.value = {
|
||||
...data.OtherData,
|
||||
@ -59,7 +71,6 @@ const handleGetData = async () => {
|
||||
TradingAlertList.length = 0;
|
||||
}
|
||||
|
||||
|
||||
let TradingAlertAI = sessionStorage.getItem('TradingAlertAI')
|
||||
if (TradingAlertAI) { } else {
|
||||
let res: any = {
|
||||
@ -71,10 +82,104 @@ const handleGetData = async () => {
|
||||
}
|
||||
sessionStorage.setItem('TradingAlertAI', JSON.stringify(res))
|
||||
}
|
||||
|
||||
// 重置调用标志
|
||||
isFetching.value = false
|
||||
}
|
||||
|
||||
// 强制刷新数据(忽略缓存)
|
||||
const handleForceRefreshData = async () => {
|
||||
const req: any = {
|
||||
ProvinceCode: "530000",
|
||||
ServerpartId: ""
|
||||
}
|
||||
|
||||
const data = await handleGetCurrentEarlyWarning(req)
|
||||
sessionStorage.setItem("TradingAlert", JSON.stringify(data))
|
||||
|
||||
console.log('交易预警强制刷新:', data);
|
||||
|
||||
TradingOtherData.value = {
|
||||
...data.OtherData,
|
||||
sum: Number(data.OtherData.value) + Number(data.OtherData.data)
|
||||
}
|
||||
|
||||
// ai需要的数据
|
||||
let AIData: any = []
|
||||
if (data.List && data.List.length > 0) {
|
||||
let list = data.List.slice(0, 7)
|
||||
TradingAlertList.length = 0;
|
||||
list && list.forEach((item: any) => {
|
||||
TradingAlertList.push(item)
|
||||
AIData.push(`${item.serverpartName}${item.serverpartShopName}${item.exceptionTypeName}`)
|
||||
});
|
||||
} else {
|
||||
TradingAlertList.length = 0;
|
||||
}
|
||||
}
|
||||
|
||||
// 触发数字滚动动画(不改变数值,只是重新滚动)
|
||||
const triggerNumberScroll = () => {
|
||||
if (!TradingOtherData.value) return
|
||||
|
||||
console.log('🔄 重新触发交易预警数字滚动动画')
|
||||
|
||||
// 通过重新赋值来触发 NumberRoller 组件的滚动动画
|
||||
const currentSum = TradingOtherData.value.sum
|
||||
const currentValue = TradingOtherData.value.value
|
||||
const currentData = TradingOtherData.value.data
|
||||
|
||||
// 先设置为0,然后立即恢复原值,触发滚动动画
|
||||
TradingOtherData.value.sum = 0
|
||||
TradingOtherData.value.value = 0
|
||||
TradingOtherData.value.data = 0
|
||||
|
||||
// 使用 setTimeout 确保值变化被检测到
|
||||
setTimeout(() => {
|
||||
TradingOtherData.value.sum = currentSum
|
||||
TradingOtherData.value.value = currentValue
|
||||
TradingOtherData.value.data = currentData
|
||||
console.log('⚠️ 交易预警数字重新滚动完成')
|
||||
}, 100)
|
||||
}
|
||||
|
||||
// 启动所有定时器
|
||||
const startTimers = () => {
|
||||
// 清除所有现有定时器
|
||||
clearAllTimers()
|
||||
|
||||
console.log('🚀 启动交易预警定时更新')
|
||||
|
||||
// 10秒滚动动画定时器
|
||||
scrollTimer = setInterval(triggerNumberScroll, 10000)
|
||||
|
||||
// 10分钟数据刷新定时器 (600000毫秒)
|
||||
dataRefreshTimer = setInterval(async () => {
|
||||
console.log('🔄 10分钟定时刷新交易预警数据')
|
||||
await handleForceRefreshData()
|
||||
}, 600000)
|
||||
}
|
||||
|
||||
// 清除所有定时器
|
||||
const clearAllTimers = () => {
|
||||
if (scrollTimer) {
|
||||
clearInterval(scrollTimer);
|
||||
scrollTimer = null
|
||||
console.log('⏹️ 停止滚动定时器')
|
||||
}
|
||||
if (dataRefreshTimer) {
|
||||
clearInterval(dataRefreshTimer);
|
||||
dataRefreshTimer = null
|
||||
console.log('⏹️ 停止数据刷新定时器')
|
||||
}
|
||||
}
|
||||
|
||||
defineExpose({
|
||||
handleGetData
|
||||
handleGetData,
|
||||
handleForceRefreshData,
|
||||
triggerNumberScroll,
|
||||
clearAllTimers,
|
||||
startTimers
|
||||
});
|
||||
|
||||
</script>
|
||||
@ -85,22 +190,26 @@ defineExpose({
|
||||
<div class="TradingAlertNewBox">
|
||||
<div class="TradingAlertNewBoxItem">
|
||||
<div class="TradingAlertNewBoxItemTemplate">
|
||||
<div class="TradingAlertNewBoxItemValue">{{ (TradingOtherData?.sum || 0) }}</div>
|
||||
<div class="TradingAlertNewBoxItemValue">
|
||||
<NumberRoller :value="TradingOtherData?.sum || 0" :duration="1500" />
|
||||
</div>
|
||||
<div class="TradingAlertNewBoxItemLabel">交易预警总数</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="TradingAlertNewBoxItem">
|
||||
<div class="TradingAlertNewBoxItemTemplate">
|
||||
<div class="TradingAlertNewBoxItemValue" style="color: #F87D75;">{{ (TradingOtherData?.value || 0)
|
||||
}}</div>
|
||||
<div class="TradingAlertNewBoxItemValue" style="color: #F87D75;">
|
||||
<NumberRoller :value="TradingOtherData?.value || 0" :duration="1200" />
|
||||
</div>
|
||||
<div class="TradingAlertNewBoxItemLabel">必查项</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div class="TradingAlertNewBoxItem">
|
||||
<div class="TradingAlertNewBoxItemTemplate">
|
||||
<div class="TradingAlertNewBoxItemValue" style="color: #75F8EE;">{{ (TradingOtherData?.data || 0) }}
|
||||
<div class="TradingAlertNewBoxItemValue" style="color: #75F8EE;">
|
||||
<NumberRoller :value="TradingOtherData?.data || 0" :duration="1000" />
|
||||
</div>
|
||||
<div class="TradingAlertNewBoxItemLabel">抽查项</div>
|
||||
</div>
|
||||
|
||||
@ -82,12 +82,12 @@ defineExpose({
|
||||
<div class="supplierMessageBox" style="margin-top: 10px;">
|
||||
<div class="supplierMessageBoxTop">
|
||||
<div class="supplierMessageBoxTopItem">
|
||||
<div class="supplierMessageBoxTopItemLabel">供应商/家</div>
|
||||
<div class="supplierMessageBoxTopItemLabel">电商及工会福利/家</div>
|
||||
<!-- <div class="supplierMessageBoxTopItemvalue" style="color: #56BCE6;">{{ supplierObj?.dealer || "0" }} -->
|
||||
<div class="supplierMessageBoxTopItemvalue" style="color: #56BCE6;">14</div>
|
||||
</div>
|
||||
<div class="supplierMessageBoxTopItem">
|
||||
<div class="supplierMessageBoxTopItemLabel">品牌方/家</div>
|
||||
<div class="supplierMessageBoxTopItemLabel">绿色云品品牌厂家/家</div>
|
||||
<!-- <div class="supplierMessageBoxTopItemvalue" style="color: #ef5a0d;">{{ supplierObj?.brandSide || "0"
|
||||
}}
|
||||
</div> -->
|
||||
@ -97,14 +97,14 @@ defineExpose({
|
||||
|
||||
<div class="supplierMessageBoxTop" style="margin-top: 10px;">
|
||||
<div class="supplierMessageBoxTopItem">
|
||||
<div class="supplierMessageBoxTopItemLabel">自有品牌水/家</div>
|
||||
<div class="supplierMessageBoxTopItemLabel">自有水品牌厂家/家</div>
|
||||
<!-- <div class="supplierMessageBoxTopItemvalue" style="color: #56BCE6;">{{
|
||||
supplierObj?.privateLabelWater || "0" }}
|
||||
</div> -->
|
||||
<div class="supplierMessageBoxTopItemvalue" style="color: #56BCE6;">2</div>
|
||||
</div>
|
||||
<div class="supplierMessageBoxTopItem">
|
||||
<div class="supplierMessageBoxTopItemLabel">零售批发类/家</div>
|
||||
<div class="supplierMessageBoxTopItemLabel">快消品零售批发/家</div>
|
||||
<!-- <div class="supplierMessageBoxTopItemvalue" style="color: #ef5a0d;">{{
|
||||
supplierObj?.retailAndWholesale || "0" }}
|
||||
</div> -->
|
||||
|
||||
@ -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/page/login/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/analysisofmember/analysisofmember.vue","./src/page/index/components/announcementtopic/announcementtopic.vue","./src/page/index/components/annualaccountsreceivable/annualaccountsreceivable.vue","./src/page/index/components/arealegend/arealegend.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/membermall/index.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","./src/page/login/login.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/page/login/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/analysisofmember/analysisofmember.vue","./src/page/index/components/announcementtopic/announcementtopic.vue","./src/page/index/components/annualaccountsreceivable/annualaccountsreceivable.vue","./src/page/index/components/arealegend/arealegend.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/membermall/index.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/numberroller.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","./src/page/login/login.vue"],"version":"5.6.3"}
|
||||
Loading…
x
Reference in New Issue
Block a user