Compare commits

..

No commits in common. "f82ab7bb6a69c11b46328cedd8d0af7bedc00c0a" and "431d95645b2283b3858d5abe6df8f88c1a1ce21d" have entirely different histories.

11 changed files with 1108 additions and 3021 deletions

View File

@ -65,7 +65,7 @@ import request from '@/util/index.js'
// } // }
const netChange = () => { const netChange = () => {
uni.onNetworkStatusChange(function (res) { uni.onNetworkStatusChange(function(res) {
// console.log(res.isConnected) // console.log(res.isConnected)
store.mutations.isConnect(res.isConnected) store.mutations.isConnect(res.isConnected)
if (!res.isConnected) { if (!res.isConnected) {
@ -187,25 +187,25 @@ function addUserBehaviorNew(obj) {
} }
obj.visitChannels = store.state.visitChannels obj.visitChannels = store.state.visitChannels
let userDate = store.state.userData let userDate = store.state.userData
console.log('userDate123', userDate) console.log('userDate123',userDate)
let baseInfo = uni.getStorageSync('userInfo') let baseInfo = uni.getStorageSync('userInfo')
let req = { let req = {
userName: userDate.UserName, userName:userDate.UserName,
phoneNumber: userDate.Membership_Phone, phoneNumber:userDate.Membership_Phone,
userId: userDate.UserId ? userDate.UserId : '', userId:userDate.UserId ? userDate.UserId:'',
wechatAppId: 'wxa99ef047735c031e', wechatAppId:'wxa99ef047735c031e',
intoRoute: obj.intoRoute, intoRoute:obj.intoRoute,
outtoRoute: obj.outtoRoute, outtoRoute:obj.outtoRoute,
visitChannels: obj.visitChannels, visitChannels:obj.visitChannels,
behaviorRecordDesc: '', behaviorRecordDesc:'',
LoginIP: baseInfo.ip || '', LoginIP: baseInfo.ip || '',
LoginPlace: (baseInfo.prov ? baseInfo.prov : '') + (baseInfo.prov && baseInfo.city ? '-' : '') + (baseInfo.city ? baseInfo.city : ''), LoginPlace: (baseInfo.prov ? baseInfo.prov : '' ) + (baseInfo.prov && baseInfo.city ? '-' : '') + (baseInfo.city ? baseInfo.city : ''),
SOURCE_PLATFORM: '驿行畅旅' SOURCE_PLATFORM: '驿行畅旅'
} }
console.log('req', req) console.log('req',req)
request.$webGet('CommercialApi/UserBehavior/AddUserBehavior', req).then(() => { request.$webGet('CommercialApi/UserBehavior/AddUserBehavior',req).then(() => {
}) })
} }
@ -232,7 +232,7 @@ async function getFieldEnumByField(params) {
} }
// 不四舍五入 保留两位小数的金额化方法 // 不四舍五入 保留两位小数的金额化方法
function getMoney(money) { function getMoney(money){
if (!money || isNaN(money)) return "0.00"; if (!money || isNaN(money)) return "0.00";
let num = parseFloat(money + '') + ''; let num = parseFloat(money + '') + '';
num = parseInt(money * 100 + '') / 100 + '' num = parseInt(money * 100 + '') / 100 + ''
@ -255,32 +255,32 @@ function getMoney(money) {
return num; return num;
} }
function getMoneyTest(money) { function getMoneyTest(money){
console.log('money', money) console.log('money',money)
if (!money || isNaN(money)) return "0.00"; if (!money || isNaN(money)) return "0.00";
let realMoney = 0 let realMoney = 0
if (money.toString().indexOf('.') > 0) { if(money.toString().indexOf('.')>0){
let num_per = money.toString().substring(0, money.toString().indexOf('.')) let num_per = money.toString().substring(0, money.toString().indexOf('.'))
let num_next = money.toString().substring(money.toString().indexOf('.') + 1).padEnd(2, '0') let num_next = money.toString().substring(money.toString().indexOf('.') + 1).padEnd(2, '0')
console.log('num_per', num_per) console.log('num_per',num_per)
console.log('num_next', num_next) console.log('num_next',num_next)
realMoney = Number(num_per + '.' + num_next).toFixed(2) realMoney = Number(num_per + '.' + num_next).toFixed(2)
} else { }else{
realMoney = money realMoney = money
} }
console.log('realMoney', realMoney) console.log('realMoney',realMoney)
let num = realMoney let num = realMoney
// let num = parseFloat(realMoney + '') + ''; // let num = parseFloat(realMoney + '') + '';
// num = (parseInt(realMoney * 100 + '') / 100).toFixed(2) + '' // num = (parseInt(realMoney * 100 + '') / 100).toFixed(2) + ''
console.log('num', num) console.log('num',num)
let reg = /(-?\d+)(\d{3})/; let reg = /(-?\d+)(\d{3})/;
while (reg.test(num)) { while (reg.test(num)) {
num = num.replace(reg, "$1,$2"); num = num.replace(reg, "$1,$2");
} }
let idx = num.indexOf('.') let idx = num.indexOf('.')
console.log('idx', idx) console.log('idx',idx)
if (idx === -1) { if (idx === -1) {
num = num + '.00' num = num + '.00'
} }
@ -289,8 +289,8 @@ function getMoneyTest(money) {
let num_per = num.substring(0, idx) + '.' let num_per = num.substring(0, idx) + '.'
let num_next = num.substring(idx + 1).padEnd(2, '0') let num_next = num.substring(idx + 1).padEnd(2, '0')
console.log('num_per', num_per) console.log('num_per',num_per)
console.log('num_next', num_next) console.log('num_next',num_next)
num = num_per + num_next num = num_per + num_next
} }
@ -305,45 +305,6 @@ function playVideo(opt) {
return new EZUIPlayer(opt) return new EZUIPlayer(opt)
} }
// 得到这个月有多少天
function getThisMonthDay(value) {
let date = new Date(value)
let y = date.getFullYear()
let m = date.getMonth() + 1
let howDay;
let flag = false
if (y % 4 === 0 && y % 100 !== 0 || y % 400 === 0) {
flag = true
}
switch (m) {
case 1:
case 3:
case 5:
case 7:
case 8:
case 10:
case 12:
howDay = 31
break
case 4:
case 6:
case 9:
case 11:
howDay = 30
break
case 2:
if (flag) {
howDay = 29
} else {
howDay = 28
}
break
}
return howDay
}
export default { export default {
netChange, netChange,
cutDate, cutDate,
@ -357,6 +318,5 @@ export default {
getFieldEnumByField, // 获取枚举参数 getFieldEnumByField, // 获取枚举参数
// calculateDistance, // calculateDistance,
// bMapToQQMap, // bMapToQQMap,
playVideo, playVideo
getThisMonthDay
} }

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
<template> <template>
<view :class="'province-theme-' + currentProvinceCode" scroll-with-animation v-if="showPage"> <view :class="'province-theme-' + currentProvinceCode" scroll-with-animation v-if="showPage">
<view class="page-body page-enter"> <view class="page-body">
<div class="box-card card-enter" :style="'opacity:' + (1 - opacity) + ';'"> <div class="box-card" :style="'opacity:' + (1 - opacity) + ';'">
<div class="box-top-title"> <div class="box-top-title">
<span class="box-center-title">{{ sMsg.serverpartname }}</span> <span class="box-center-title">{{ sMsg.serverpartname }}</span>
<picker mode="date" @change="bindDateChange" :value="theRequest && theRequest.time" :start="startTime" <picker mode="date" @change="bindDateChange" :value="theRequest && theRequest.time" :start="startTime"
@ -10,7 +10,7 @@
</picker> </picker>
</div> </div>
<view class="top-card data-card-enter"> <view class="top-card">
<div class="box-center-box"> <div class="box-center-box">
<div class="uni-flex ai-center jc-between" style="margin-bottom: 8rpx;"> <div class="uni-flex ai-center jc-between" style="margin-bottom: 8rpx;">
<div class="main-amount-title">对客营收()</div> <div class="main-amount-title">对客营收()</div>
@ -36,37 +36,37 @@
</div> </div>
<div class="uni-flex jc-between box-center-box"> <div class="uni-flex jc-between box-center-box">
<div class="check-unit metric-enter"> <div class="check-unit">
<text>长款金额</text> <text>长款金额</text>
<div class="check-price-color">{{ $util.fmoney(sMsg.diffMorePrice, 2) }} <text></text></div> <div class="check-price-color">{{ $util.fmoney(sMsg.diffMorePrice, 2) }} <text></text></div>
</div> </div>
<div class="check-unit metric-enter"> <div class="check-unit">
<text>短款金额</text> <text>短款金额</text>
<div class="check-price-color">{{ $util.fmoney(sMsg.diffLessPrice, 2) }} <text></text></div> <div class="check-price-color">{{ $util.fmoney(sMsg.diffLessPrice, 2) }} <text></text></div>
</div> </div>
<div class="check-unit metric-enter"> <div class="check-unit">
<text>客单交易</text> <text>客单交易</text>
<div class="check-price-color">{{ $util.fmoney(sMsg.ticketCount, 0) }} <text></text></div> <div class="check-price-color">{{ $util.fmoney(sMsg.ticketCount, 0) }} <text></text></div>
</div> </div>
<div class="check-unit metric-enter"> <div class="check-unit">
<text>客单均价</text> <text>客单均价</text>
<div class="check-price-color">{{ $util.fmoney(sMsg.tickave, 2) }} <text></text></div> <div class="check-price-color">{{ $util.fmoney(sMsg.tickave, 2) }} <text></text></div>
</div> </div>
</div> </div>
<div class="uni-flex jc-between box-center-box mt8"> <div class="uni-flex jc-between box-center-box mt8">
<div class="check-unit metric-enter"> <div class="check-unit">
<text>优惠金额</text> <text>优惠金额</text>
<div class="check-price-color">{{ $util.fmoney(sMsg.totalOffAmount, 2) }} <text></text></div> <div class="check-price-color">{{ $util.fmoney(sMsg.totalOffAmount, 2) }} <text></text></div>
</div> </div>
<div class="check-unit metric-enter"> <div class="check-unit">
<text>移动支付</text> <text>移动支付</text>
<div class="check-price-color">{{ $util.fmoney(sMsg.mobilePayment, 2) }} <text></text></div> <div class="check-price-color">{{ $util.fmoney(sMsg.mobilePayment, 2) }} <text></text></div>
</div> </div>
<div class="check-unit metric-enter"> <div class="check-unit">
<text>商品出售</text> <text>商品出售</text>
<div class="check-price-color">{{ $util.fmoney(sMsg.totalCount, 0) }} <text></text></div> <div class="check-price-color">{{ $util.fmoney(sMsg.totalCount, 0) }} <text></text></div>
</div> </div>
<div class="check-unit metric-enter"> <div class="check-unit">
<text>商品均价</text> <text>商品均价</text>
<div class="check-price-color">{{ $util.fmoney(sMsg.countave, 2) }} <text></text></div> <div class="check-price-color">{{ $util.fmoney(sMsg.countave, 2) }} <text></text></div>
</div> </div>
@ -82,11 +82,11 @@
<template v-if="cateBrandList.length"> <template v-if="cateBrandList.length">
<template v-if="theRequest.ProvinceCode == '340000'"> <template v-if="theRequest.ProvinceCode == '340000'">
<view class="uni-flex ai-center analysis-tabs tabs-enter"> <view class="uni-flex ai-center analysis-tabs">
<!-- <view @tap="changeTab(3)" class="tab" :class="{'active': nowTab==3}">经营模式</view> --> <!-- <view @tap="changeTab(3)" class="tab" :class="{'active': nowTab==3}">经营模式</view> -->
<view @tap="changeTab(4)" class="tab tab-slide" :class="{ 'active': nowTab == 4 }">车流分析</view> <view @tap="changeTab(4)" class="tab" :class="{ 'active': nowTab == 4 }">车流分析</view>
<view @tap="changeTab(1)" class="tab tab-slide" :class="{ 'active': nowTab == 1 }">经营分析</view> <view @tap="changeTab(1)" class="tab" :class="{ 'active': nowTab == 1 }">经营分析</view>
<view @tap="changeTab(2)" class="tab tab-slide" :class="{ 'active': nowTab == 2 }">客群分析</view> <view @tap="changeTab(2)" class="tab" :class="{ 'active': nowTab == 2 }">客群分析</view>
</view> </view>
<!-- <view class="pie-content" v-show="nowTab==3"> <!-- <view class="pie-content" v-show="nowTab==3">
@ -98,53 +98,54 @@
</view> --> </view> -->
</template> </template>
<!-- 经营分析内容 -->
<view v-show="nowTab == 1"> <view v-show="nowTab == 1">
<!-- 安徽省 --> <!-- 安徽省 -->
<div class="pie-content"> <div class="pie-content">
<div class="model-busniess">经营业态占比</div> <div class="model-busniess">经营业态占比</div>
<ServiceRevenuePie ref="serviceRevenuePie" v-show="ServiceRevenueData && ServiceRevenueData.length >= 2" <ServiceRevenuePie ref="serviceRevenuePie" v-if="ServiceRevenueData.length == 2 && nowTab == 1"
:data="ServiceRevenueData" @selectCate="selectCate" /> :data="ServiceRevenueData" @selectCate="selectCate" />
<!-- 其余省份 --> <!-- 其余省份 -->
<!-- <canvas v-else-if="sellData.length>0" canvas-id="sellCate" id="sellCate" class="operation-cate-content" @click="touchPie($event,'sellCate')"></canvas> --> <!-- <canvas v-else-if="sellData.length>0" canvas-id="sellCate" id="sellCate" class="operation-cate-content" @click="touchPie($event,'sellCate')"></canvas> -->
<div class="model-busniess progress-section-enter"> <div class="model-busniess">
<div>经营模式占比</div> <div>经营模式占比</div>
<div class="progress-content"> <div class="progress-content">
<div class="progress-left" :style="'width: ' + operationModel[0].bili + '%;'"></div> <div class="progress-left" :style="'width: ' + operationModel[0].bili + '%;'"></div>
<div class="progress-right" :style="'width: ' + operationModel[1].bili + '%;'"></div> <div class="progress-right" :style="'width: ' + operationModel[1].bili + '%;'"></div>
</div> </div>
<div class="uni-flex jc-between"> <div class="uni-flex jc-between">
<div style="color: #667ED5;">{{ operationModel[0].name }}: <span style="font-size: 32rpx;">{{ <div style="color: #667ED5;font-size: 26rpx;">{{ operationModel[0].name }}: <span
operationModel[0].bili }}</span>%</div> style="font-size: 26rpx;">{{
<div style="color: #F3AF50;" v-if="operationModel[1].name">{{ operationModel[1].name }}: operationModel[0].bili }}</span>%</div>
<span style="font-size: 32rpx;">{{ operationModel[1].bili }}</span>% <div style="color: #F3AF50;font-size: 26rpx;" v-if="operationModel[1].name">{{ operationModel[1].name
}}:
<span style="font-size: 26rpx;">{{ operationModel[1].bili }}</span>%
</div> </div>
</div> </div>
<div class="uni-flex jc-between"> <div class="uni-flex jc-between">
<div style="margin-bottom: 0;"><span style="font-size: 32rpx;">{{ operationModel[0].data <div style="margin-bottom: 0;font-size: 24rpx;"><span style="font-size: 26rpx;">{{
}}</span> operationModel[0].data
}}</span>
</div> </div>
<div style="margin-bottom: 0;" v-if="operationModel[1].data"><span style="font-size: 32rpx;">{{ <div style="margin-bottom: 0;font-size: 24rpx;" v-if="operationModel[1].data"><span
operationModel[1].data style="font-size: 26rpx;">{{
operationModel[1].data
}}</span> }}</span>
</div> </div>
</div> </div>
</div> </div>
</div> </div>
<!-- 品牌列表 --> <!-- 品牌列表 -->
<div class="shop-box brand-list-enter"> <div class="shop-box">
<scroll-view scroll-x class="tab-shop tab-shop-slide" scroll-with-animation :scroll-left="scrollLeft"> <scroll-view scroll-x class="tab-shop" scroll-with-animation :scroll-left="scrollLeft">
<div v-for="(n, i) in cateBrandList" :key="i" :id="`tabNum${i}`" class="cate-name brand-tab-stagger" <div v-for="(n, i) in cateBrandList" :key="i" :id="`tabNum${i}`" class="cate-name"
:class="{ 'active': nowShop == i }" @click="selectCate(i)" :class="{ 'active': nowShop == i }" @click="selectCate(i)">{{ n.Bussiness_Name }}</div>
:style="'animation-delay: ' + (i * 0.05) + 's'">{{
n.Bussiness_Name }}</div>
</scroll-view> </scroll-view>
<div class="tab-content brand-cards-container" v-if="cateBrandList.length"> <div class="tab-content" v-if="cateBrandList.length">
<div class="shop-card brand-card-stagger" v-for="(m, i) in cateBrandList[nowShop].listBrandModel" :key="i" <div class="shop-card" v-for="(m, i) in cateBrandList[nowShop].listBrandModel" :key="i"
@click="toBrandPage(m, i)" :style="'animation-delay: ' + (i * 0.08) + 's'"> @click="toBrandPage(m, i)">
<div class="brand-icon-wrapper"> <div>
<image v-if="m.Brand_ICO" :src="m.Brand_ICO" mode="aspectFit" class="brand-icon"></image> <image v-if="m.Brand_ICO" :src="m.Brand_ICO" mode="aspectFit"></image>
<image v-else src="/static/images/revenue/home.png" mode="aspectFit" class="brand-icon"></image> <image v-else src="/static/images/revenue/home.png" mode="aspectFit"></image>
</div> </div>
<div class="shop-name">{{ m.Brand_Name }}</div> <div class="shop-name">{{ m.Brand_Name }}</div>
<div class="price-num">¥ {{ m.Revenue_Amount ? $util.fmoney(m.Revenue_Amount, 2) : '0.00' }} <div class="price-num">¥ {{ m.Revenue_Amount ? $util.fmoney(m.Revenue_Amount, 2) : '0.00' }}
@ -154,10 +155,10 @@
</div> </div>
</view> </view>
<view class="tab-content-fade" v-show="nowTab == 2"> <view class="" v-show="nowTab == 2">
<CustomerAnalysis ref="customerAna" :show="nowTab == 2" /> <CustomerAnalysis ref="customerAna" :show="nowTab == 2" />
</view> </view>
<view class="tab-content-fade" v-show="nowTab == 4"> <view class="" v-show="nowTab == 4">
<CarAnalysis ref="carAna" :show="nowTab == 4" /> <CarAnalysis ref="carAna" :show="nowTab == 4" />
</view> </view>
@ -319,7 +320,8 @@ export default {
let d = date.getDate() - 1 let d = date.getDate() - 1
if (d - 8 < 0) { if (d - 8 < 0) {
let num = 8 - d let num = 8 - d
let changeMonth = m - 1 m = m - 1
let changeMonth = m
if (changeMonth < 10) { if (changeMonth < 10) {
changeMonth = '0' + changeMonth changeMonth = '0' + changeMonth
} }
@ -336,13 +338,8 @@ export default {
day = d - 8 day = d - 8
startTime = `${y}-${m}-${day}` startTime = `${y}-${m}-${day}`
} }
console.log('mmm', m);
this.startTime = startTime this.startTime = startTime
this.endTime = `${y}-${m}-${d}` this.endTime = `${y}-${m}-${d}`
console.log('this.startTimethis.startTime', this.startTime);
console.log('this.startTimethis.endTime', this.endTime);
}, },
@ -371,6 +368,7 @@ export default {
changeTab(value) { changeTab(value) {
this.nowTab = value this.nowTab = value
if (value == 2) { if (value == 2) {
let opt = this.theRequest let opt = this.theRequest
const params = { const params = {
serverpartId: opt.ServerpartIds, serverpartId: opt.ServerpartIds,
@ -482,15 +480,8 @@ export default {
let colors1 = ['#FFAC37', '#d8ece9', '#e0e3f7', '#f7f5f6', '#b2b7e3']; let colors1 = ['#FFAC37', '#d8ece9', '#e0e3f7', '#f7f5f6', '#b2b7e3'];
let list = [] let list = []
let list2 = [] let list2 = []
//
if (!_this.pageData || !_this.pageData.listBusinessModel) {
console.warn('pageData 或 listBusinessModel 无效')
return
}
_this.pageData.listBusinessModel.map((m, i) => { _this.pageData.listBusinessModel.map((m, i) => {
if (m.Revenue_Amount && m.Revenue_Amount != 0) { if (m.Revenue_Amount != 0) {
let n = { let n = {
name: m.Bussiness_Name, name: m.Bussiness_Name,
data: m.Revenue_Amount data: m.Revenue_Amount
@ -515,43 +506,24 @@ export default {
} }
}) })
//
let fullServiceRevenueData = []
//
if (list2.length > 0) { if (list2.length > 0) {
fullServiceRevenueData.push(list2) _this.ServiceRevenueData.push(list2)
_this.sellData = list _this.sellData = list
console.log('第一层数据准备:', list2)
}
// }
if (_this.pageData.listCurBusinessModel && _this.pageData.listCurBusinessModel.length > 0) { if (_this.pageData.listCurBusinessModel && _this.pageData.listCurBusinessModel.length > 0) {
let list3 = [] let list = []
_this.pageData.listCurBusinessModel.map(m => { _this.pageData.listCurBusinessModel.map(m => {
if (m.Revenue_Amount && m.Revenue_Amount != 0) { if (m.Revenue_Amount != 0) {
let n = { let n = {
name: m.Bussiness_Name, name: m.Bussiness_Name,
value: m.Revenue_Amount value: m.Revenue_Amount
} }
list3.push(n) list.push(n)
} }
}) })
if (list3.length > 0) { _this.ServiceRevenueData.push(list)
fullServiceRevenueData.push(list3)
console.log('第二层数据准备:', list3)
}
} }
//
if (fullServiceRevenueData.length > 0) {
_this.$set(_this, 'ServiceRevenueData', fullServiceRevenueData)
console.log('operationFn设置完整数据:', fullServiceRevenueData)
}
console.log('最终 ServiceRevenueData:', _this.ServiceRevenueData)
if (list.length > 0) { if (list.length > 0) {
_this.showPie({ _this.showPie({
id: 'sellCate', id: 'sellCate',
@ -698,7 +670,7 @@ export default {
_this.pageData = res.Result_Data _this.pageData = res.Result_Data
if (res.Result_Data.listBusinessModel) { if (res.Result_Data.listBusinessModel) {
let list = JSON.parse(JSON.stringify(res.Result_Data.listBusinessModel)) let list = JSON.parse(JSON.stringify(res.Result_Data.listBusinessModel))
console.log('获取到业务数据:', list) console.log('list', list)
if (list.length > 0) { if (list.length > 0) {
let all = { let all = {
Bussiness_Name: '全部', Bussiness_Name: '全部',
@ -715,18 +687,12 @@ export default {
} }
}) })
_this.cateBrandList = [all, ...list] _this.cateBrandList = [all, ...list]
_this.operationFn()
// operationFn
_this.$nextTick(() => {
_this.operationFn()
})
return return
} }
return return
} }
//
_this.cateBrandList = [] _this.cateBrandList = []
_this.$set(_this, 'ServiceRevenueData', [])
}) })
}, },
// //
@ -761,11 +727,8 @@ export default {
colors: colors1, colors: colors1,
}); });
// //
if (busniessTradeFathPie && busniessTradeFathPie.length > 0 && busniessTradePie && busniessTradePie.length > 0) { // this.ServiceRevenueData = []
this.$set(this, 'ServiceRevenueData', [busniessTradeFathPie, busniessTradePie]) this.ServiceRevenueData = [busniessTradeFathPie, busniessTradePie]
} else {
this.$set(this, 'ServiceRevenueData', [])
}
if (totalData.uploadCount !== totalData.totalUploadCount) { if (totalData.uploadCount !== totalData.totalUploadCount) {
this.getUnUpLoadShops(theRequest) this.getUnUpLoadShops(theRequest)
@ -1513,6 +1476,7 @@ cover-view.page-title {
padding: 8rpx 24rpx; padding: 8rpx 24rpx;
background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%); background: linear-gradient(135deg, #f8f9fa 0%, #ffffff 100%);
border-radius: 12rpx; border-radius: 12rpx;
font-size: 28rpx;
border: 1rpx solid #f0f0f0; border: 1rpx solid #f0f0f0;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04); box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.04);
} }
@ -1543,370 +1507,4 @@ cover-view.page-title {
background: linear-gradient(90deg, #ff9f43, #ffb84d); background: linear-gradient(90deg, #ff9f43, #ffb84d);
border-radius: 0 6rpx 6rpx 0; border-radius: 0 6rpx 6rpx 0;
} }
/* 动画效果 - UniApp微信小程序兼容版本 */
/* 页面入场动画 */
@keyframes pageEnter {
0% {
opacity: 0;
transform: translateY(50rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.page-enter {
animation: pageEnter 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
}
/* 卡片入场动画 */
@keyframes cardEnter {
0% {
opacity: 0;
transform: translateY(30rpx) scale(0.95);
}
100% {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.card-enter {
animation: cardEnter 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.1s forwards;
opacity: 0;
}
/* 数据卡片动画 */
@keyframes dataCardEnter {
0% {
opacity: 0;
transform: translateY(20rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.data-card-enter {
animation: dataCardEnter 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.2s forwards;
opacity: 0;
}
/* 指标动画 */
@keyframes metricEnter {
0% {
opacity: 0;
transform: translateY(15rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.metric-enter:nth-child(1) {
animation: metricEnter 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.3s forwards;
opacity: 0;
}
.metric-enter:nth-child(2) {
animation: metricEnter 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.4s forwards;
opacity: 0;
}
.metric-enter:nth-child(3) {
animation: metricEnter 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s forwards;
opacity: 0;
}
.metric-enter:nth-child(4) {
animation: metricEnter 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.6s forwards;
opacity: 0;
}
/* Tab标签页动画 */
@keyframes tabsEnter {
0% {
opacity: 0;
transform: translateY(20rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.tabs-enter {
animation: tabsEnter 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.4s forwards;
opacity: 0;
}
@keyframes tabSlide {
0% {
opacity: 0;
transform: translateX(-20rpx);
}
100% {
opacity: 1;
transform: translateX(0);
}
}
.tab-slide:nth-child(1) {
animation: tabSlide 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.5s forwards;
opacity: 0;
}
.tab-slide:nth-child(2) {
animation: tabSlide 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.6s forwards;
opacity: 0;
}
.tab-slide:nth-child(3) {
animation: tabSlide 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.7s forwards;
opacity: 0;
}
/* Tab内容淡入动画 */
@keyframes tabContentFade {
0% {
opacity: 0;
transform: translateY(10rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.tab-content-fade {
animation: tabContentFade 0.4s ease-out forwards;
}
/* 图表容器动画 */
@keyframes chartContainerEnter {
0% {
opacity: 0;
transform: translateY(30rpx) scale(0.98);
}
100% {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.chart-container-enter {
animation: chartContainerEnter 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.6s forwards;
opacity: 0;
}
/* 标题滑入动画 */
@keyframes titleSlideIn {
0% {
opacity: 0;
transform: translateX(-30rpx);
}
100% {
opacity: 1;
transform: translateX(0);
}
}
.title-slide-in {
animation: titleSlideIn 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.7s forwards;
opacity: 0;
}
/* 进度条区域动画 */
@keyframes progressSectionEnter {
0% {
opacity: 0;
transform: translateY(20rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.progress-section-enter {
animation: progressSectionEnter 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.8s forwards;
opacity: 0;
}
/* 品牌列表动画 */
@keyframes brandListEnter {
0% {
opacity: 0;
transform: translateY(25rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.brand-list-enter {
animation: brandListEnter 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.9s forwards;
opacity: 0;
}
/* 品牌卡片错列动画 */
@keyframes brandCardStagger {
0% {
opacity: 0;
transform: translateY(20rpx) scale(0.95);
}
100% {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.brand-card-stagger {
animation: brandCardStagger 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 1s forwards;
opacity: 0;
}
/* 交互反馈动画 */
.tab-slide:active,
.brand-card-stagger:active {
transform: scale(0.98);
transition: transform 0.1s ease-out;
}
/* 图表加载状态 */
.chart-loading {
display: flex;
justify-content: center;
align-items: center;
height: 300rpx;
color: #999;
font-size: 28rpx;
}
/* 品牌标签页动画 */
@keyframes tabShopSlide {
0% {
opacity: 0;
transform: translateY(15rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.tab-shop-slide {
animation: tabShopSlide 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 1.1s forwards;
opacity: 0;
}
/* 品牌标签错列动画 */
@keyframes brandTabStagger {
0% {
opacity: 0;
transform: translateX(-15rpx);
}
100% {
opacity: 1;
transform: translateX(0);
}
}
.brand-tab-stagger {
animation: brandTabStagger 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94) 1.2s forwards;
opacity: 0;
}
/* 品牌卡片容器动画 */
@keyframes brandCardsContainer {
0% {
opacity: 0;
transform: translateY(20rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.brand-cards-container {
animation: brandCardsContainer 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 1.3s forwards;
opacity: 0;
}
/* 品牌图标包装器动画 */
@keyframes brandIconWrapper {
0% {
opacity: 0;
transform: scale(0.8) rotate(-5deg);
}
100% {
opacity: 1;
transform: scale(1) rotate(0deg);
}
}
.brand-icon-wrapper {
animation: brandIconWrapper 0.5s cubic-bezier(0.34, 1.56, 0.64, 1) forwards;
animation-delay: inherit;
}
.brand-icon {
transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
/* 品牌卡片悬浮效果增强 */
.brand-card-stagger:active .brand-icon-wrapper {
transform: scale(0.9) rotate(2deg);
}
.brand-card-stagger:active .shop-name {
transform: translateY(2rpx);
}
.brand-card-stagger:active .price-num {
transform: scale(1.05);
}
/* 品牌标签活跃状态动画 */
.brand-tab-stagger.active {
animation: brandTabStagger 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards,
tabActivePulse 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.2s forwards;
}
@keyframes tabActivePulse {
0% {
transform: scale(1);
}
50% {
transform: scale(1.05);
}
100% {
transform: scale(1);
}
}
</style> </style>

View File

@ -6,11 +6,11 @@
<view class="tab-icon">🏪</view> <view class="tab-icon">🏪</view>
<text class="tab-text">商超</text> <text class="tab-text">商超</text>
</view> </view>
<view class="tab-item" @tap="selectTab(3000)" :class="{ 'active': nowRank == 3000 }"> <view class="tab-item" @tap="selectTab(2000)" :class="{ 'active': nowRank == 2000 }">
<view class="tab-icon">🍽</view> <view class="tab-icon">🍽</view>
<text class="tab-text">餐饮</text> <text class="tab-text">餐饮</text>
</view> </view>
<view class="tab-item" @tap="selectTab(2000)" :class="{ 'active': nowRank == 2000 }"> <view class="tab-item" @tap="selectTab(3000)" :class="{ 'active': nowRank == 3000 }">
<view class="tab-icon">🍿</view> <view class="tab-icon">🍿</view>
<text class="tab-text">小吃</text> <text class="tab-text">小吃</text>
</view> </view>
@ -85,7 +85,7 @@ export default {
/* 现代化选项卡 */ /* 现代化选项卡 */
.ranking-tabs { .ranking-tabs {
display: flex; display: flex;
background: #f8f9fa; background: #fff;
border-radius: 12rpx; border-radius: 12rpx;
padding: 6rpx; padding: 6rpx;
margin: 0 20rpx 24rpx; margin: 0 20rpx 24rpx;
@ -105,12 +105,12 @@ export default {
cursor: pointer; cursor: pointer;
&.active { &.active {
background: linear-gradient(135deg, #27B25F, #4CCC7F) !important; background: linear-gradient(135deg, #27B25F, #4CCC7F);
box-shadow: 0 4rpx 12rpx rgba(39, 178, 95, 0.3) !important; box-shadow: 0 4rpx 12rpx rgba(39, 178, 95, 0.3);
transform: translateY(-2rpx); transform: translateY(-2rpx);
.tab-text { .tab-text {
color: #fff !important; color: #fff;
font-weight: 600; font-weight: 600;
} }
@ -260,7 +260,7 @@ export default {
} }
.item-name { .item-name {
font-size: 28rpx; font-size: 24rpx;
color: #333; color: #333;
font-weight: 600; font-weight: 600;
margin-bottom: 12rpx; margin-bottom: 12rpx;
@ -338,8 +338,7 @@ export default {
/* 主题色支持 - 通过全局主题类控制 */ /* 主题色支持 - 通过全局主题类控制 */
:global(.province-theme-330200) .tab-item.active { :global(.province-theme-330200) .tab-item.active {
background: linear-gradient(135deg, #1890FF, #69C0FF) !important; background: linear-gradient(135deg, #1890FF, #69C0FF);
box-shadow: 0 4rpx 12rpx rgba(24, 144, 255, 0.3) !important;
.stat-value.sales-amount { .stat-value.sales-amount {
color: #1890FF; color: #1890FF;
@ -347,8 +346,7 @@ export default {
} }
:global(.province-theme-340000) .tab-item.active { :global(.province-theme-340000) .tab-item.active {
background: linear-gradient(135deg, #748ED6, #91A7E3) !important; background: linear-gradient(135deg, #748ED6, #91A7E3);
box-shadow: 0 4rpx 12rpx rgba(116, 142, 214, 0.3) !important;
.stat-value.sales-amount { .stat-value.sales-amount {
color: #748ED6; color: #748ED6;
@ -356,8 +354,7 @@ export default {
} }
:global(.province-theme-500000) .tab-item.active { :global(.province-theme-500000) .tab-item.active {
background: linear-gradient(135deg, #FA541C, #FF7A45) !important; background: linear-gradient(135deg, #FA541C, #FF7A45);
box-shadow: 0 4rpx 12rpx rgba(250, 84, 28, 0.3) !important;
.stat-value.sales-amount { .stat-value.sales-amount {
color: #FA541C; color: #FA541C;
@ -365,8 +362,7 @@ export default {
} }
:global(.province-theme-510000) .tab-item.active { :global(.province-theme-510000) .tab-item.active {
background: linear-gradient(135deg, #FA8C16, #FFA940) !important; background: linear-gradient(135deg, #FA8C16, #FFA940);
box-shadow: 0 4rpx 12rpx rgba(250, 140, 22, 0.3) !important;
.stat-value.sales-amount { .stat-value.sales-amount {
color: #FA8C16; color: #FA8C16;
@ -374,8 +370,7 @@ export default {
} }
:global(.province-theme-520000) .tab-item.active { :global(.province-theme-520000) .tab-item.active {
background: linear-gradient(135deg, #52C41A, #73D13D) !important; background: linear-gradient(135deg, #52C41A, #73D13D);
box-shadow: 0 4rpx 12rpx rgba(82, 196, 26, 0.3) !important;
.stat-value.sales-amount { .stat-value.sales-amount {
color: #52C41A; color: #52C41A;
@ -383,8 +378,7 @@ export default {
} }
:global(.province-theme-530000) .tab-item.active { :global(.province-theme-530000) .tab-item.active {
background: linear-gradient(135deg, #27B25F, #4CCC7F) !important; background: linear-gradient(135deg, #27B25F, #4CCC7F);
box-shadow: 0 4rpx 12rpx rgba(39, 178, 95, 0.3) !important;
.stat-value.sales-amount { .stat-value.sales-amount {
color: #27B25F; color: #27B25F;
@ -392,8 +386,7 @@ export default {
} }
:global(.province-theme-630000) .tab-item.active { :global(.province-theme-630000) .tab-item.active {
background: linear-gradient(135deg, #13C2C2, #36CFC9) !important; background: linear-gradient(135deg, #13C2C2, #36CFC9);
box-shadow: 0 4rpx 12rpx rgba(19, 194, 194, 0.3) !important;
.stat-value.sales-amount { .stat-value.sales-amount {
color: #13C2C2; color: #13C2C2;
@ -401,8 +394,7 @@ export default {
} }
:global(.province-theme-734100) .tab-item.active { :global(.province-theme-734100) .tab-item.active {
background: linear-gradient(135deg, #E91E63, #F06292) !important; background: linear-gradient(135deg, #E91E63, #F06292);
box-shadow: 0 4rpx 12rpx rgba(233, 30, 99, 0.3) !important;
.stat-value.sales-amount { .stat-value.sales-amount {
color: #E91E63; color: #E91E63;

View File

@ -1,6 +1,6 @@
import request from '@/util/index.js' import request from '@/util/index.js'
const methods = { const methods = {
async getData(obj, isServerPartDetail) { // 获取远程数据 async getData(obj,isServerPartDetail) { // 获取远程数据
let _this = this let _this = this
/* ts /* ts
type serverpartRegion = { type serverpartRegion = {
@ -14,86 +14,64 @@ const methods = {
} }
*/ */
// let regionList = [] // 营收上传列表 reginListModel[] // let regionList = [] // 营收上传列表 reginListModel[]
this.groupType = obj.GroupType this.groupType = obj.GroupType
const requestParamas = { const requestParamas = {
Statistics_Date: obj.time, Statistics_Date: obj.time ,
Statistics_Month: obj.month, Statistics_Month: obj.month ,
Province_Code: obj.ProvinceCode, Province_Code: obj.ProvinceCode ,
pushProvinceCode: obj.ProvinceCode, pushProvinceCode: obj.ProvinceCode ,
Serverpart_ID: obj.GroupType != 1020 ? obj.ServerpartIds : '', Serverpart_ID: obj.GroupType != 1020 ? obj.ServerpartIds : '',
SPRegionType_ID: obj.GroupType == 1020 ? obj.ServerpartIds : '', SPRegionType_ID: obj.GroupType == 1020 ? obj.ServerpartIds : '',
// Revenue_Include: 1 // Revenue_Include: 1
} }
const requestParamasBudget = { const requestParamasBudget = {
Statistics_Date: obj.time, Statistics_Date: obj.time ,
Statistics_Month: obj.month, Statistics_Month: obj.month ,
Province_Code: obj.ProvinceCode, Province_Code: obj.ProvinceCode ,
pushProvinceCode: obj.ProvinceCode, pushProvinceCode: obj.ProvinceCode ,
Serverpart_ID: obj.ServerpartIds ? obj.ServerpartIds : '' Serverpart_ID: obj.ServerpartIds ? obj.ServerpartIds : ''
} }
this.provinceCode = obj.ProvinceCode this.provinceCode = obj.ProvinceCode
// 营收数据
const data = await request.$webGet('CommercialApi/Revenue/GetRevenuePushList', requestParamas)
if (data.Result_Code != 100) return
try { // 在营门店数量统计
// 并行请求优化同时发起所有API请求减少加载时间 const busniessCounts = await request.$webGet('CommercialApi/BaseInfo/GetShopCountList', requestParamas)
const [data, busniessCounts, tradeData, budgetAmount, mobileShare, mallDeliver, bayonetCount] = await Promise.all([ if (busniessCounts.Result_Code != 100) return
request.$webGet('CommercialApi/Revenue/GetRevenuePushList', requestParamas),
request.$webGet('CommercialApi/BaseInfo/GetShopCountList', requestParamas),
request.$webGet('CommercialApi/BaseInfo/GetBusinessTradeList', requestParamas),
request.$webGet('CommercialApi/Revenue/GetBudgetExpenseList', requestParamasBudget),
request.$webGet('CommercialApi/Revenue/GetMobileShare', requestParamas),
request.$webGet('CommercialApi/Revenue/GetMallDeliver', requestParamas),
request.$webGet('CommercialApi/Revenue/GetSPBayonetList', requestParamas)
])
// 检查数据有效性 // 业态关系
if (data.Result_Code != 100 || const tradeData = await request.$webGet('CommercialApi/BaseInfo/GetBusinessTradeList', requestParamas)
busniessCounts.Result_Code != 100 || if (tradeData.Result_Code != 100) return
tradeData.Result_Code != 100 ||
budgetAmount.Result_Code != 100 ||
mobileShare.Result_Code != 100 ||
mallDeliver.Result_Code != 100 ||
bayonetCount.Result_Code != 100) {
console.error('部分API请求失败', {
data: data.Result_Code,
busniessCounts: busniessCounts.Result_Code,
tradeData: tradeData.Result_Code,
budgetAmount: budgetAmount.Result_Code,
mobileShare: mobileShare.Result_Code,
mallDeliver: mallDeliver.Result_Code,
bayonetCount: bayonetCount.Result_Code
})
// 返回一个默认的空数据结构而不是undefined
return [[], {
cashPay: 0,
ticketCount: 0,
totalCount: 0,
uploadState: '0/0'
}, [], [], [], []]
}
if (isServerPartDetail) { // 是服务区营收推送页面 // 计划营收金额
return _this.getSeverpartReginList(data.Result_Data.List, busniessCounts.Result_Data.List, const budgetAmount = await request.$webGet('CommercialApi/Revenue/GetBudgetExpenseList', requestParamasBudget)
tradeData.Result_Data.List, budgetAmount.Result_Data.List) if (budgetAmount.Result_Code != 100) return
}
return _this.getReginList(data.Result_Data.List, busniessCounts.Result_Data.List, // 移动支付分账数据
tradeData.Result_Data.List, budgetAmount.Result_Data.List, const mobileShare = await request.$webGet('CommercialApi/Revenue/GetMobileShare', requestParamas)
bayonetCount.Result_Data.List, mobileShare.Result_Data, mallDeliver.Result_Data) if (mobileShare.Result_Code != 100) return
// [reginList, totalData, busniessTypePie, busniessTradePie]
} catch (error) { // 万佳商城配送数据
console.error('API请求出错:', error) const mallDeliver = await request.$webGet('CommercialApi/Revenue/GetMallDeliver', requestParamas)
// 返回默认空数据结构 if (mallDeliver.Result_Code != 100) return
return [[], {
cashPay: 0, // 片区车流量
ticketCount: 0, const bayonetCount = await request.$webGet('CommercialApi/Revenue/GetSPBayonetList', requestParamas)
totalCount: 0, if (bayonetCount.Result_Code != 100) return
uploadState: '0/0'
}, [], [], [], []] if (isServerPartDetail) { // 是服务区营收推送页面
return _this.getSeverpartReginList(data.Result_Data.List, busniessCounts.Result_Data.List,
tradeData.Result_Data.List, budgetAmount.Result_Data.List)
} }
return _this.getReginList(data.Result_Data.List, busniessCounts.Result_Data.List,
tradeData.Result_Data.List, budgetAmount.Result_Data.List,
bayonetCount.Result_Data.List, mobileShare.Result_Data, mallDeliver.Result_Data)
// [reginList, totalData, busniessTypePie, busniessTradePie]
}, },
getTotalShowData(newData, oldData, index) { getTotalShowData(newData, oldData,index) {
// <TotalModel> // <TotalModel>
/* /*
type TotalModel = { type TotalModel = {
ticketCount: number // 客单数量 , ticketCount: number // 客单数量 ,
@ -105,23 +83,23 @@ const methods = {
different_Price_More: number// 长款金额 , different_Price_More: number// 长款金额 ,
} }
*/ */
if (index > 0) { if (index>0) {
oldData.ticketCount += newData.TicketCount oldData.ticketCount += newData.TicketCount
oldData.totalCount += newData.TotalCount oldData.totalCount += newData.TotalCount
oldData.totalOffAmount += newData.TotalOffAmount oldData.totalOffAmount += newData.TotalOffAmount
oldData.mobilePayment += newData.MobilePayment oldData.mobilePayment += newData.MobilePayment
oldData.cashPay += newData.CashPay oldData.cashPay += newData.CashPay
oldData.diffLessPrice += newData.Different_Price_Less oldData.diffLessPrice += newData.Different_Price_Less
oldData.diffMorePrice += newData.Different_Price_More oldData.diffMorePrice += newData.Different_Price_More
if (newData.BusinessType == 1000) { // 商超 if(newData.BusinessType==1000){ // 商超
oldData.scCount = oldData.scCount ? oldData.scCount + 1 : 1 oldData.scCount = oldData.scCount ? oldData.scCount + 1 : 1
oldData.scCashPay = oldData.scCashPay ? oldData.scCashPay + newData.CashPay : newData.CashPay oldData.scCashPay = oldData.scCashPay ? oldData.scCashPay + newData.CashPay : newData.CashPay
} }
if (newData.BusinessType == 3000) { // 餐饮 if(newData.BusinessType==3000){ // 餐饮
oldData.cyCount = oldData.cyCount ? oldData.cyCount + 1 : 1 oldData.cyCount = oldData.cyCount ? oldData.cyCount + 1 : 1
oldData.cyCashPay = oldData.cyCashPay ? oldData.cyCashPay + newData.CashPay : newData.CashPay oldData.cyCashPay = oldData.cyCashPay ? oldData.cyCashPay + newData.CashPay : newData.CashPay
} }
} else { } else {
oldData.ticketCount = newData.TicketCount oldData.ticketCount = newData.TicketCount
@ -131,27 +109,27 @@ const methods = {
oldData.cashPay = newData.CashPay oldData.cashPay = newData.CashPay
oldData.diffLessPrice = newData.Different_Price_Less oldData.diffLessPrice = newData.Different_Price_Less
oldData.diffMorePrice = newData.Different_Price_More oldData.diffMorePrice = newData.Different_Price_More
if (newData.BusinessType == 1000) { // 商超 if(newData.BusinessType==1000){ // 商超
oldData.scCount = 1 oldData.scCount = 1
oldData.scCashPay = newData.CashPay oldData.scCashPay = newData.CashPay
} }
if (newData.BusinessType == 3000) { // 餐饮 if(newData.BusinessType==3000){ // 餐饮
oldData.cyCount = 1 oldData.cyCount = 1
oldData.cyCashPay = newData.CashPay oldData.cyCashPay = newData.CashPay
} }
} }
return { ...oldData } return {...oldData}
}, },
getBusniessPie(typeName, item, list) { // 经营模式数据 getBusniessPie(typeName, item, list) { // 经营模式数据
const oldData = list.find(m => m.name === item[typeName]) const oldData = list.find(m => m.name === item[typeName])
if (oldData) { if (oldData) {
oldData.data = Number((oldData.data + item.CashPay).toFixed(2)) oldData.data = Number((oldData.data+ item.CashPay).toFixed(2))
oldData.value = Number((oldData.value + item.CashPay).toFixed(2)) oldData.value = Number((oldData.value+ item.CashPay).toFixed(2))
} else { } else {
list.push({ list.push({
name: item[typeName], name: item[typeName],
@ -172,7 +150,7 @@ const methods = {
oldData.MinVehicle_Count = Number((oldData.MinVehicle_Count + item.MinVehicle_Count).toFixed(2)) oldData.MinVehicle_Count = Number((oldData.MinVehicle_Count + item.MinVehicle_Count).toFixed(2))
oldData.MediumVehicle_Count = Number((oldData.MediumVehicle_Count + item.MediumVehicle_Count).toFixed(2)) oldData.MediumVehicle_Count = Number((oldData.MediumVehicle_Count + item.MediumVehicle_Count).toFixed(2))
oldData.LargeVehicle_Count = Number((oldData.LargeVehicle_Count + item.LargeVehicle_Count).toFixed(2)) oldData.LargeVehicle_Count = Number((oldData.LargeVehicle_Count + item.LargeVehicle_Count).toFixed(2))
const oldRegion = oldData.regionList.find(o => o.name === item["Serverpart_Region"]) const oldRegion = oldData.regionList.find(o => o.name === item["Serverpart_Region"])
if (oldRegion) { if (oldRegion) {
oldRegion.Vehicle_Count = Number((oldRegion.Vehicle_Count + item.Vehicle_Count).toFixed(2)) oldRegion.Vehicle_Count = Number((oldRegion.Vehicle_Count + item.Vehicle_Count).toFixed(2))
@ -181,7 +159,7 @@ const methods = {
oldRegion.MediumVehicle_Count = Number((oldRegion.MediumVehicle_Count + item.MediumVehicle_Count).toFixed(2)) oldRegion.MediumVehicle_Count = Number((oldRegion.MediumVehicle_Count + item.MediumVehicle_Count).toFixed(2))
oldRegion.LargeVehicle_Count = Number((oldRegion.LargeVehicle_Count + item.LargeVehicle_Count).toFixed(2)) oldRegion.LargeVehicle_Count = Number((oldRegion.LargeVehicle_Count + item.LargeVehicle_Count).toFixed(2))
} }
else { else{
oldData.regionList.push({ oldData.regionList.push({
name: item["Serverpart_Region"], name: item["Serverpart_Region"],
Vehicle_Count: item.Vehicle_Count, Vehicle_Count: item.Vehicle_Count,
@ -231,10 +209,10 @@ const methods = {
}] }]
}) })
} }
return [...list] return [...list]
}, },
getSeverpartReginList(data, shopCountList, tradeList, budgetAmount) { getSeverpartReginList(data, shopCountList,tradeList,budgetAmount){
let _this = this let _this = this
let totalShow = {} // 总营收数据统计 let totalShow = {} // 总营收数据统计
let list = [] // 上传营收列表数据 let list = [] // 上传营收列表数据
@ -244,31 +222,31 @@ const methods = {
data.map(async (n, index) => { data.map(async (n, index) => {
n.show = false n.show = false
totalShow = _this.getTotalShowData(n, totalShow, index); // 总营收数据统计 totalShow = _this.getTotalShowData(n, totalShow,index); // 总营收数据统计
// 寻找门店父业态 // 寻找门店父业态
let trade = tradeList.find(t => t.BUSINESSTRADE_NAME == n.BusinessTrade_Name) let trade = tradeList.find(t=>t.BUSINESSTRADE_NAME==n.BusinessTrade_Name)
if (trade && trade.BUSINESSTRADE_PNAME && trade.BUSINESSTRADE_PNAME.indexOf('其他') == -1) { if(trade && trade.BUSINESSTRADE_PNAME && trade.BUSINESSTRADE_PNAME.indexOf('其他')==-1 ) {
n.tradename = trade.BUSINESSTRADE_PNAME n.tradename = trade.BUSINESSTRADE_PNAME
} else { }else{
n.tradename = '其他' n.tradename = '其他'
} }
busniessTypePie = _this.getBusniessPie('Business_TypeName', n, busniessTypePie) busniessTypePie = _this.getBusniessPie('Business_TypeName', n, busniessTypePie)
busniessTradePie = _this.getBusniessPie('BusinessTrade_Name', n, busniessTradePie) busniessTradePie = _this.getBusniessPie('BusinessTrade_Name', n, busniessTradePie)
busniessTradeFathPie = _this.getBusniessPie('tradename', n, busniessTradeFathPie) busniessTradeFathPie = _this.getBusniessPie('tradename', n, busniessTradeFathPie)
}) })
totalShow.serverpartname = data[0].Serverpart_Name totalShow.serverpartname = data[0].Serverpart_Name
totalShow.uploadState = data.length + '/' + (shopCountList.length ? shopCountList[0].SHOP_BUSINESSCOUNT : 0) totalShow.uploadState = data.length+'/'+ (shopCountList.length ? shopCountList[0].SHOP_BUSINESSCOUNT: 0)
totalShow.uploadCount = data.filter(n => n.Revenue_Upload > 0).length totalShow.uploadCount = data.filter(n=>n.Revenue_Upload>0).length
totalShow.totalUploadCount = shopCountList.length ? shopCountList[0].SHOP_BUSINESSCOUNT : 0 totalShow.totalUploadCount = shopCountList.length ? shopCountList[0].SHOP_BUSINESSCOUNT: 0
totalShow.budgetAmount = 0 totalShow.budgetAmount = 0
if (budgetAmount.length) { if(budgetAmount.length){
totalShow.budgetAmount = budgetAmount[0].BUDGET_AMOUNT totalShow.budgetAmount = budgetAmount[0].BUDGET_AMOUNT
} }
return [totalShow, busniessTypePie, busniessTradePie, busniessTradeFathPie] return [ totalShow, busniessTypePie, busniessTradePie,busniessTradeFathPie ]
}, },
getReginList(data, shopCountList, tradeList, budgetAmount, bayonetCount, mobileShare, mallDeliver) { getReginList(data, shopCountList,tradeList,budgetAmount,bayonetCount, mobileShare, mallDeliver) {
let _this = this let _this = this
let totalShow = {} // 总营收数据统计 let totalShow = {} // 总营收数据统计
@ -280,14 +258,14 @@ const methods = {
let totalUploadCount = 0 let totalUploadCount = 0
data.map(async (n, index) => { data.map(async (n, index) => {
n.show = false n.show = false
// 寻找门店父业态 // 寻找门店父业态
let trade = tradeList.find(t => t.BUSINESSTRADE_NAME == n.BusinessTrade_Name) let trade = tradeList.find(t=>t.BUSINESSTRADE_NAME==n.BusinessTrade_Name)
if (trade && trade.BUSINESSTRADE_PNAME && trade.BUSINESSTRADE_PNAME.indexOf('其他') == -1) { if(trade && trade.BUSINESSTRADE_PNAME && trade.BUSINESSTRADE_PNAME.indexOf('其他')==-1 ) {
n.tradename = trade.BUSINESSTRADE_PNAME n.tradename = trade.BUSINESSTRADE_PNAME
} else { }else{
n.tradename = _this.provinceCode == 340000 ? '其他' : (n.BusinessTrade_Name || '其他') n.tradename = _this.provinceCode==340000? '其他' : (n.BusinessTrade_Name || '其他')
} }
// 上传营收情况 // 上传营收情况
let regin = list.find(m => m.name === n.SPRegionType_Name) let regin = list.find(m => m.name === n.SPRegionType_Name)
@ -306,42 +284,42 @@ const methods = {
list.push({ list.push({
name: n.SPRegionType_Name, // 区域名称 name: n.SPRegionType_Name, // 区域名称
cashpay: n.CashPay, cashpay: n.CashPay,
uploadcount: n.Revenue_Upload > 0 ? 1 : 0, // 区域上传数量 uploadcount: n.Revenue_Upload>0 ? 1: 0, // 区域上传数量
totalcount: reginShopCount, totalcount: reginShopCount,
child: [{ child: [{
serverpart_Id: n.Serverpart_ID, serverpart_Id: n.Serverpart_ID,
serverpart_Name: n.Serverpart_Name, serverpart_Name: n.Serverpart_Name,
cashpay: n.CashPay, cashpay: n.CashPay,
uploadcount: n.Revenue_Upload > 0 ? 1 : 0, uploadcount: n.Revenue_Upload>0 ? 1: 0,
totalcount: serverpartShopCount totalcount: serverpartShopCount
}] }]
}) })
} else { } else {
regin.cashpay += n.CashPay regin.cashpay += n.CashPay
regin.uploadcount += n.Revenue_Upload > 0 ? 1 : 0 regin.uploadcount += n.Revenue_Upload>0 ? 1: 0
let serverpart = regin.child.find(m => m.serverpart_Name === n.Serverpart_Name) let serverpart = regin.child.find(m => m.serverpart_Name === n.Serverpart_Name)
if (serverpart) { if (serverpart) {
serverpart.cashpay += n.CashPay serverpart.cashpay += n.CashPay
serverpart.uploadcount += n.Revenue_Upload > 0 ? 1 : 0 serverpart.uploadcount += n.Revenue_Upload>0 ? 1: 0
} else { } else {
regin.child.push({ regin.child.push({
serverpart_Id: n.Serverpart_ID, serverpart_Id: n.Serverpart_ID,
serverpart_Name: n.Serverpart_Name, serverpart_Name: n.Serverpart_Name,
cashpay: n.CashPay, cashpay: n.CashPay,
uploadcount: n.Revenue_Upload > 0 ? 1 : 0, uploadcount: n.Revenue_Upload>0 ? 1: 0,
totalcount: serverpartShopCount totalcount: serverpartShopCount
}) })
} }
regin.child.sort((a, b) => b.cashpay - a.cashpay) regin.child.sort((a, b) => b.cashpay - a.cashpay)
} }
totalShow = _this.getTotalShowData(n, totalShow, index); // 总营收数据统计 totalShow = _this.getTotalShowData(n, totalShow,index); // 总营收数据统计
busniessTypePie = _this.getBusniessPie('Business_TypeName', n, busniessTypePie) busniessTypePie = _this.getBusniessPie('Business_TypeName', n, busniessTypePie)
busniessTradePie = _this.getBusniessPie('tradename', n, busniessTradePie) busniessTradePie = _this.getBusniessPie('tradename', n, busniessTradePie)
if (this.groupType == 1000) { if (this.groupType == 1000){
busniessAreaPie = _this.getBusniessPie('SPRegionType_Name', n, busniessAreaPie) busniessAreaPie = _this.getBusniessPie('SPRegionType_Name', n, busniessAreaPie)
} }
}) })
list.sort((a, b) => b.cashpay - a.cashpay) list.sort((a, b) => b.cashpay - a.cashpay)
@ -364,19 +342,19 @@ const methods = {
bayonetPie = _this.getBayonetPie('Serverpart_Name', n, bayonetPie) bayonetPie = _this.getBayonetPie('Serverpart_Name', n, bayonetPie)
}) })
} }
totalShow.uploadState = data.filter(n => n.Revenue_Upload > 0).length + '/' + totalUploadCount totalShow.uploadState = data.filter(n=>n.Revenue_Upload>0).length+'/'+totalUploadCount
totalShow.budgetAmount = 0 totalShow.budgetAmount = 0
if (_this.provinceCode == 620000) { if(_this.provinceCode==620000){
const ele = list.find(n => n.name == "通美公司") const ele = list.find(n=>n.name=="通美公司")
totalShow.tmCrashPay = ele ? ele.cashpay : '0.00' totalShow.tmCrashPay = ele ? ele.cashpay :'0.00'
} }
if (budgetAmount.length) { if(budgetAmount.length){
totalShow.budgetAmount = budgetAmount[0].BUDGET_AMOUNT totalShow.budgetAmount = budgetAmount[0].BUDGET_AMOUNT
} }
return [list, totalShow, busniessTypePie, busniessTradePie, busniessAreaPie, bayonetPie] return [list, totalShow, busniessTypePie, busniessTradePie,busniessAreaPie,bayonetPie]
} }
} }
export default methods; export default methods ;

View File

@ -1,12 +1,11 @@
<template> <template>
<div> <div>
<div class="analysis-cell cell-enter" @tap="toggleShow" :class="{ 'active': item.show }" <div class="analysis-cell" @tap="toggleShow" :class="{ 'active': item.show }" :style="activeCellStyleStr">
:style="activeCellStyleStr"> <div class="shop-title" :class="'theme-' + provinceCode">
<div class="shop-title title-slide" :class="'theme-' + provinceCode">
<span> {{ (i > 8 ? i + 1 : '0' + (i + 1)) + ' ' + item.SHOPNAME }}</span> <span> {{ (i > 8 ? i + 1 : '0' + (i + 1)) + ' ' + item.SHOPNAME }}</span>
<p> <p>
<span v-show="item.UNACCOUNT_SIGN"></span> <span v-show="item.UNACCOUNT_SIGN"></span>
<span class="cell-price price-highlight" :style="priceStyleStr">{{ <span class="cell-price" :style="priceStyleStr">{{
item.UNACCOUNT_SIGN item.UNACCOUNT_SIGN
? $util.fmoney(item.CASHPAY_TOTAL, 2) : '无结账信息' }}</span> ? $util.fmoney(item.CASHPAY_TOTAL, 2) : '无结账信息' }}</span>
<image src="/static/images/effective/true.png" mode="aspectFit" class="" v-if='item.SHOWDEAL_SIGN'> <image src="/static/images/effective/true.png" mode="aspectFit" class="" v-if='item.SHOWDEAL_SIGN'>
@ -15,11 +14,11 @@
</p> </p>
</div> </div>
<p v-if="item.detail.length > 0" style="line-height: 1.2;" class="tags-container"> <p v-if="item.detail.length > 0" style="line-height: 1.2;">
<span v-for="(child, index) in item.detail" :key="index" class="atribute-tag">{{ child }} </span> <span v-for="(child, index) in item.detail" :key="index" class="atribute-tag">{{ child }} </span>
</p> </p>
</div> </div>
<div class="analysis-detail" v-if="item.show"> <div class="analysis-detail" v-show="item.show">
<div class="detail-unit" v-for="(unit, o) in item.ShopEndAccountList" :key="o"> <div class="detail-unit" v-for="(unit, o) in item.ShopEndAccountList" :key="o">
<div class="uni-inline-flex"> <div class="uni-inline-flex">
<span class="detail-title">结账时间</span> <span class="detail-title">结账时间</span>
@ -32,23 +31,24 @@
</div> </div>
<block v-if="unit.DESCRIPTION_DATE"> <block v-if="unit.DESCRIPTION_DATE">
<div class="detail-title" style="font-size: 24rpx;">日结校验{{ unit.DESCRIPTION_DATE }}</div> <div class="detail-title">日结校验{{ unit.DESCRIPTION_DATE }}</div>
<p><span class="detail-title" style="font-size: 24rpx;">{{ unit.DESCRIPTION_STAFF }}</span><span>{{ <p><span class="detail-title">{{ unit.DESCRIPTION_STAFF }}</span><span style="font-size: 24rpx;">{{
unit.DIFFERENCE_REASON unit.DIFFERENCE_REASON
}}</span> }}</span>
</p> </p>
</block> </block>
<block v-if="unit.APPROVE_DATE"> <block v-if="unit.APPROVE_DATE">
<div><span class="detail-title" style="font-size: 24rpx;">日结审核{{ unit.APPROVE_DATE }}</span></div> <div><span class="detail-title">日结审核{{ unit.APPROVE_DATE }}</span></div>
<p><span class="detail-title" style="font-size: 24rpx;">{{ unit.APPROVE_STAFF }}</span><span>{{ <p><span class="detail-title" style="font-size: 24rpx;">{{ unit.APPROVE_STAFF }}</span><span
unit.APPROVED_INFO }}</span> style="font-size: 24rpx;">{{
unit.APPROVED_INFO }}</span>
</p> </p>
</block> </block>
<div> <div>
<p class="detail-short-info" v-show="unit.FACTAMOUNT_SALE" style="font-size: 24rpx;"> 单品报表<text <p class="detail-short-info" v-show="unit.FACTAMOUNT_SALE">单品报表<text
class="uni-icon uni-icon-checkmarkempty" style="font-size: 24rpx;"></text></p> class="uni-icon uni-icon-checkmarkempty"></text></p>
<p class="detail-short-info" v-show="unit.FACTAMOUNT_CIGARETTE" style="font-size: 24rpx;">香烟数据<span <p class="detail-short-info" v-show="unit.FACTAMOUNT_CIGARETTE">香烟数据<span
class="uni-icon uni-icon-checkmarkempty" style="font-size: 24rpx;"></span></p> class="uni-icon uni-icon-checkmarkempty"></span></p>
</div> </div>
<div><span class="detail-title detail-short-info" style="font-size: 24rpx;">稽核次数{{ unit.CHECK_COUNT }} <div><span class="detail-title detail-short-info" style="font-size: 24rpx;">稽核次数{{ unit.CHECK_COUNT }}
</span><span class="detail-short-info" style="font-size: 24rpx;">长短款额{{ </span><span class="detail-short-info" style="font-size: 24rpx;">长短款额{{
@ -128,7 +128,7 @@ export default {
// //
activeCellStyleStr() { activeCellStyleStr() {
if (!this.item || !this.item.show) return '' if (!this.item.show) return ''
return `border: 2rpx solid ${this.themeColors.primary}; box-shadow: 0 4px 20px rgba(${this.hexToRgb(this.themeColors.primary)}, 0.15);` return `border: 2rpx solid ${this.themeColors.primary}; box-shadow: 0 4px 20px rgba(${this.hexToRgb(this.themeColors.primary)}, 0.15);`
}, },
@ -376,159 +376,4 @@ export default {
font-size: 28rpx; font-size: 28rpx;
} }
} }
/* 动画效果 - listUnit组件 */
/* 单元格入场动画 */
@keyframes cellEnter {
0% {
opacity: 0;
transform: translateY(20rpx) scale(0.95);
}
100% {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.cell-enter {
animation: cellEnter 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
opacity: 0;
}
/* 标题滑入动画 */
@keyframes titleSlide {
0% {
opacity: 0;
transform: translateX(-15rpx);
}
100% {
opacity: 1;
transform: translateX(0);
}
}
.title-slide {
animation: titleSlide 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.1s forwards;
opacity: 0;
}
/* 价格高亮动画 */
@keyframes priceHighlight {
0% {
opacity: 0;
transform: scale(0.8);
}
50% {
transform: scale(1.1);
}
100% {
opacity: 1;
transform: scale(1);
}
}
.price-highlight {
animation: priceHighlight 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55) 0.2s forwards;
opacity: 0;
}
/* 标签容器动画 */
@keyframes tagsContainer {
0% {
opacity: 0;
transform: translateY(10rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.tags-container {
animation: tagsContainer 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.2s forwards;
opacity: 0;
}
/* 标签弹跳动画 */
@keyframes tagBounce {
0% {
opacity: 0;
transform: translateY(-10rpx) scale(0.8);
}
60% {
transform: translateY(2rpx) scale(1.05);
}
100% {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.tag-bounce {
animation: tagBounce 0.6s cubic-bezier(0.68, -0.55, 0.265, 1.55) forwards;
opacity: 0;
}
/* 详情展开动画 */
@keyframes detailExpand {
0% {
opacity: 0;
max-height: 0;
transform: translateY(-20rpx);
}
100% {
opacity: 1;
max-height: 2000rpx;
transform: translateY(0);
}
}
.detail-expand {
animation: detailExpand 0.5s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
overflow: hidden;
}
/* 详情单元淡入动画 */
@keyframes unitFadeIn {
0% {
opacity: 0;
transform: translateY(15rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.unit-fade-in {
animation: unitFadeIn 0.4s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
opacity: 0;
}
/* 交互反馈动画 */
.cell-enter:active {
transform: scale(0.98);
transition: transform 0.1s ease-out;
}
.tag-bounce:hover {
transform: translateY(-2rpx) scale(1.02);
transition: all 0.2s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
/* 单元格活跃状态增强 */
.analysis-cell.active {
transform: translateY(-2rpx);
transition: all 0.3s cubic-bezier(0.25, 0.46, 0.45, 0.94);
}
</style> </style>

View File

@ -153,7 +153,7 @@
<div class="ct01"> <div class="ct01">
<text class="strong-text">{{ <text class="strong-text">{{
$util.fmoney(item.CASHPAY, 2) $util.fmoney(item.CASHPAY, 2)
}}</text> }}</text>
<text></text> <text></text>
</div> </div>
</div> </div>
@ -195,7 +195,7 @@
<div class="ct01"> <div class="ct01">
<text class="strong-text">{{ <text class="strong-text">{{
$util.fmoney(item.CASHPAY, 2) $util.fmoney(item.CASHPAY, 2)
}}</text> }}</text>
<text></text> <text></text>
</div> </div>
</div> </div>
@ -247,7 +247,7 @@
<div class="ct01"> <div class="ct01">
<text class="strong-text">{{ <text class="strong-text">{{
$util.fmoney(item.CASHPAY, 2) $util.fmoney(item.CASHPAY, 2)
}}</text> }}</text>
<text></text> <text></text>
</div> </div>
</div> </div>
@ -557,7 +557,7 @@ export default {
methods: { methods: {
toggleCard(isup) { toggleCard(isup) {
this.isup = !isup; this.isup = !isup;
// $forceUpdateVue this.$forceUpdate();
}, },
bindDateChange(e) { bindDateChange(e) {
// //
@ -574,16 +574,10 @@ export default {
title: "正在加载...", title: "正在加载...",
mask: true, mask: true,
}); });
// this.getData();
Promise.all([ this.getTender();
this.getData(), this.todayAmount();
this.getTender(), this.$forceUpdate();
this.todayAmount()
]).catch(err => {
console.error('数据刷新失败:', err);
uni.hideLoading();
});
// $forceUpdate
} }
}, },
toDetail(item, provinceId) { toDetail(item, provinceId) {
@ -616,15 +610,15 @@ export default {
"navigateTo", "navigateTo",
canToSeverpartIndex ? severpartIndexPath : serverpartUploadPath canToSeverpartIndex ? severpartIndexPath : serverpartUploadPath
); );
// 使Vue.set item.visited = true;
this.$set(item, 'visited', true); this.$forceUpdate();
}, },
selectTab(name, index) { selectTab(name, index) {
this[name] = index; this[name] = index;
}, },
toggleRegion(item) { toggleRegion(item) {
// 使Vue.set item.show = !item.show ? true : false;
this.$set(item, 'show', !item.show); this.$forceUpdate();
}, },
touchPie(e, id) { touchPie(e, id) {
rincanvas[id].showToolTip(e, { rincanvas[id].showToolTip(e, {
@ -653,7 +647,7 @@ export default {
totalTicketCount: res.Data.TOTALTICKET, totalTicketCount: res.Data.TOTALTICKET,
avrticketCount: this.$util.fmoney(avrticket, 2), avrticketCount: this.$util.fmoney(avrticket, 2),
}; };
// $forceUpdateVue _this.$forceUpdate();
}); });
}, },
getRankmMap(list) { getRankmMap(list) {
@ -666,7 +660,7 @@ export default {
}); });
return map; return map;
}, },
async getData() { getData() {
let _this = this; let _this = this;
let theRequest = _this.theRequest; let theRequest = _this.theRequest;
let provinceCode = _this.theRequest.ProvinceCode; let provinceCode = _this.theRequest.ProvinceCode;
@ -678,7 +672,7 @@ export default {
Statistics_Date: theRequest.time, Statistics_Date: theRequest.time,
}; };
return this.$request.$get("getRevenuePush", arr).then((res) => { this.$request.$get("getRevenuePush", arr).then((res) => {
console.log("res", res); console.log("res", res);
_this.isLoading = false; _this.isLoading = false;
if (res.ResultCode != 100) { if (res.ResultCode != 100) {
@ -717,7 +711,7 @@ export default {
} }
uni.hideLoading(); uni.hideLoading();
_this.showPage = true; _this.showPage = true;
// $forceUpdateVue _this.$forceUpdate();
}); });
function sortMount(list) { function sortMount(list) {
@ -1188,8 +1182,8 @@ export default {
}, },
toggleShow(i) { toggleShow(i) {
let item = this.regionList[i]; let item = this.regionList[i];
// 使Vue.set item.show = !item.show;
this.$set(item, 'show', !item.show); this.$forceUpdate();
}, },
changeDate(name, index) { changeDate(name, index) {
@ -1206,7 +1200,7 @@ export default {
}); });
}, },
async getTender() { getTender() {
// //
let _this = this; let _this = this;
let obj = this.theRequest; let obj = this.theRequest;
@ -1222,7 +1216,7 @@ export default {
2: [], 2: [],
3: [], 3: [],
}; };
return _this.$request _this.$request
.$webGet("WeChat/GetRevenueTrends", { .$webGet("WeChat/GetRevenueTrends", {
Statictics_Type: "Week", Statictics_Type: "Week",
Report_Type: Report_Type[typeIndex], Report_Type: Report_Type[typeIndex],
@ -1272,7 +1266,7 @@ export default {
}, },
], ],
}); });
// $forceUpdateVue _this.$forceUpdate();
}); });
bili.forEach((biliName, i) => { bili.forEach((biliName, i) => {
if (i == 1) { if (i == 1) {
@ -1351,48 +1345,58 @@ export default {
}, },
onLoad(option) { onLoad(option) {
console.log("indexOption", option); console.log("indexOption", option);
uni.showLoading({
title: "正在加载...",
});
const toSnhuiPageProvinceCode = [ const toSnhuiPageProvinceCode = [
340000, 520000, 451200, 510000, 530000, 620000, 630000, 330200, 330300, 734100 340000, 520000, 451200, 510000, 530000, 620000, 630000, 330200, 330300, 734100
]; // ]; //
//
if (option.ProvinceCode) { if (option.ProvinceCode) {
// - //
console.log(
"12321312",
toSnhuiPageProvinceCode.indexOf(parseInt(option.ProvinceCode))
);
if (toSnhuiPageProvinceCode.indexOf(parseInt(option.ProvinceCode)) > -1) { if (toSnhuiPageProvinceCode.indexOf(parseInt(option.ProvinceCode)) > -1) {
// loading // 451200510000520000620000630000330200
const url = "/pages/everdayRenven/AnhuiIndex?ProvinceCode=" + uni.redirectTo({
option.ProvinceCode + url:
"&time=" + "/pages/everdayRenven/AnhuiIndex?ProvinceCode=" +
option.time + option.ProvinceCode +
"&GroupType=" + "&time=" +
option.GroupType + option.time +
"&ServerpartIds=" + "&GroupType=" +
option.ServerpartIds; option.GroupType +
"&ServerpartIds=" +
console.log('推送跳转到AnhuiIndex参数:', url); option.ServerpartIds,
uni.redirectTo({ url }); });
return; return;
} }
this.theRequest = option;
option.time = this.$util.cutDate(option.time, "YYYY-MM-DD");
this.getData();
this.getTender();
} else { } else {
// - //
if (this.PushAuthority.length > 0) { if (this.PushAuthority.length > 0) {
console.log(1);
this.theRequest = this.defaultMsg() || {}; this.theRequest = this.defaultMsg() || {};
if ( if (
toSnhuiPageProvinceCode.indexOf(this.theRequest.ProvinceCode) > -1 toSnhuiPageProvinceCode.indexOf(this.theRequest.ProvinceCode) > -1
) { ) {
// uni.redirectTo({
const url = "/pages/everdayRenven/AnhuiIndex?" + url: "/pages/everdayRenven/AnhuiIndex",
"ProvinceCode=" + this.theRequest.ProvinceCode + });
"&GroupType=" + (this.theRequest.GroupType || '1000') +
"&time=" + this.lastDay +
"&ServerpartIds=" + (this.theRequest.ServerpartIds || '');
console.log('默认跳转到AnhuiIndex参数:', url);
uni.redirectTo({ url });
return; return;
} }
this.theRequest.time = this.lastDay;
this.getData();
this.getTender();
this.nowTab = this.theRequest.ProvinceCode == 340000 ? 4 : 1;
} else { } else {
uni.hideLoading();
this.theRequest = null; this.theRequest = null;
this.isLoading = false; this.isLoading = false;
this.showPage = false; this.showPage = false;
@ -1400,37 +1404,11 @@ export default {
return; return;
} }
} }
//
uni.showLoading({
title: "正在加载...",
mask: false
});
if (option.ProvinceCode) {
this.theRequest = option;
option.time = this.$util.cutDate(option.time, "YYYY-MM-DD");
} else {
this.theRequest.time = this.lastDay;
this.nowTab = this.theRequest.ProvinceCode == 340000 ? 4 : 1;
}
//
Promise.all([
this.getData(),
this.getTender(),
this.todayAmount()
]).catch(err => {
console.error('数据加载失败:', err);
uni.hideLoading();
this.isLoading = false;
});
this.sevenDate = [ this.sevenDate = [
this.$util.cutDate(new Date(this.theRequest.time), "MM.DD", -13), this.$util.cutDate(new Date(this.theRequest.time), "MM.DD", -13),
this.$util.cutDate(new Date(this.theRequest.time), "MM.DD", -7), this.$util.cutDate(new Date(this.theRequest.time), "MM.DD", -7),
]; ];
this.todayAmount();
if (this.theRequest.GroupType == 1010) { if (this.theRequest.GroupType == 1010) {
this.getDetail(this.theRequest); this.getDetail(this.theRequest);
} }

View File

@ -1,21 +1,25 @@
<template> <template>
<div :class="'province-theme-' + currentProvinceCode" v-if="showPage"> <div :class="'province-theme-' + currentProvinceCode" v-if="showPage">
<div class="page-body page-enter"> <div class="page-body">
<div class="service-brand-box brand-header-enter"> <div class="service-brand-box">
<div class="uni-flex align-center brand-info-slide"> <div class="uni-flex align-center">
<div class="band-name brand-name-slide">{{ pageMsg.ShopEndaccountList &&
pageMsg.ShopEndaccountList.length > 0 ? <image v-if="pageMsg.Brand_ICO" :src="pageMsg.Brand_ICO" mode="aspectFit"></image>
<image v-else src="/static/images/revenue/home.png" mode="aspectFit"></image>
<!-- <div class="band-name">{{ pageMsg.Brand_Name }}</div> -->
<div class="band-name">{{ pageMsg.ShopEndaccountList && pageMsg.ShopEndaccountList.length > 0 ?
pageMsg.ShopEndaccountList[0].SERVERPART_NAME : "" }}</div> pageMsg.ShopEndaccountList[0].SERVERPART_NAME : "" }}</div>
</div> </div>
<div class="price-num price-count-up">{{ pageMsg.Revenue_Amount ? $util.fmoney(pageMsg.Revenue_Amount, <div class="price-num">{{ pageMsg.Revenue_Amount ? $util.fmoney(pageMsg.Revenue_Amount, 2) : '0.00' }}
2) : '0.00' }}</div> </div>
</div> </div>
<!--服务区门店分析--> <!--服务区门店分析-->
<div style="margin-top: 0 20rpx;padding: 0 16rpx" class="shop-list-container"> <div style="margin-top: 0 20rpx;padding: 0 16rpx">
<shopCell v-for="(item, i) in pageMsg.ShopEndaccountList" :key="i" :item='item' @toggleShow="toggleShow" <shopCell v-for="(item, i) in pageMsg.ShopEndaccountList" :key="i" :item='item' @toggleShow="toggleShow"
:i='i' :provinceCode='currentProvinceCode' class="shop-item-stagger" :i='i' :provinceCode='currentProvinceCode'></shopCell>
:style="'animation-delay: ' + (i * 0.1 + 0.8) + 's'" v-if="item"></shopCell>
</div> </div>
</div> </div>
@ -29,9 +33,7 @@ export default {
return { return {
showPage: false, showPage: false,
pageMsg: { pageMsg: {},
ShopEndaccountList: [] //
},
currentProvinceCode: '', // currentProvinceCode: '', //
keyJson: { keyJson: {
SHOWMORE_SIGN: { 1: '【长款】', 2: '【异常长款】' }, // SHOWMORE_SIGN: { 1: '【长款】', 2: '【异常长款】' }, //
@ -118,18 +120,10 @@ export default {
return this.provinceTheme return this.provinceTheme
}, },
toggleShow(i) { toggleShow(i) {
if (!this.pageMsg.ShopEndaccountList || !this.pageMsg.ShopEndaccountList[i]) {
return
}
let currentItem = this.pageMsg.ShopEndaccountList[i] let item = this.pageMsg.ShopEndaccountList[i]
let newShowState = !currentItem.show item.show = !item.show
this.$forceUpdate()
// 使Vue.set
this.$set(this.pageMsg.ShopEndaccountList, i, {
...currentItem,
show: newShowState
})
}, },
@ -154,16 +148,12 @@ export default {
}).then(res => { }).then(res => {
uni.hideLoading() uni.hideLoading()
if (res.Result_Code != 100) return if (res.Result_Code != 100) return
res.Result_Data.ShopEndaccountList.map(n => {
// n.show = true
res.Result_Data.ShopEndaccountList.forEach((n, index) => { n.detail = this.getDetail(n)
// 使Vue.set
_this.$set(n, 'show', false)
_this.$set(n, 'detail', _this.getDetail(n))
}) })
_this.pageMsg = res.Result_Data
// console.log('_this.pageMsg_this.pageMsg_this.pageMsg', _this.pageMsg);
_this.$set(_this, 'pageMsg', res.Result_Data)
_this.showPage = true _this.showPage = true
}) })
@ -179,20 +169,13 @@ export default {
}).then(res => { }).then(res => {
uni.hideLoading() uni.hideLoading()
if (res.Result_Code != 100) return if (res.Result_Code != 100) return
res.Result_Data.listBrandShopModel.map(n => {
// n.show = true
res.Result_Data.listBrandShopModel.forEach((n, index) => { n.detail = this.getDetail(n)
// 使Vue.set
_this.$set(n, 'show', false)
_this.$set(n, 'detail', _this.getDetail(n))
}) })
//
res.Result_Data.ShopEndaccountList = res.Result_Data.listBrandShopModel res.Result_Data.ShopEndaccountList = res.Result_Data.listBrandShopModel
_this.pageMsg = res.Result_Data
// console.log('_this.pageMsg_this.pageMsg_this.pageMsg', _this.pageMsg);
_this.$set(_this, 'pageMsg', res.Result_Data)
_this.showPage = true _this.showPage = true
}) })
}, },
@ -335,171 +318,11 @@ export default {
.price-num { .price-num {
color: #fff; color: #fff;
font-size: 32rpx; font-size: 28rpx;
font-weight: 700; font-weight: 700;
font-family: 'PingFang SC', sans-serif; font-family: 'PingFang SC', sans-serif;
position: relative; position: relative;
z-index: 2; z-index: 2;
text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1); text-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.1);
} }
/* 动画效果 - UniApp微信小程序兼容版本 */
/* 页面入场动画 */
@keyframes pageEnter {
0% {
opacity: 0;
transform: translateY(30rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.page-enter {
animation: pageEnter 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
}
/* 品牌头部动画 */
@keyframes brandHeaderEnter {
0% {
opacity: 0;
transform: translateY(-30rpx) scale(0.95);
}
100% {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.brand-header-enter {
animation: brandHeaderEnter 0.8s cubic-bezier(0.34, 1.56, 0.64, 1) 0.2s forwards;
opacity: 0;
}
/* 品牌信息滑入动画 */
@keyframes brandInfoSlide {
0% {
opacity: 0;
transform: translateX(-20rpx);
}
100% {
opacity: 1;
transform: translateX(0);
}
}
.brand-info-slide {
animation: brandInfoSlide 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.4s forwards;
opacity: 0;
}
/* 品牌图标弹跳动画 */
@keyframes brandIconBounce {
0% {
opacity: 0;
transform: scale(0.3) rotate(-10deg);
}
50% {
transform: scale(1.1) rotate(5deg);
}
100% {
opacity: 1;
transform: scale(1) rotate(0deg);
}
}
.brand-icon-bounce {
animation: brandIconBounce 0.8s cubic-bezier(0.68, -0.55, 0.265, 1.55) 0.6s forwards;
opacity: 0;
}
/* 品牌名称滑入动画 */
@keyframes brandNameSlide {
0% {
opacity: 0;
transform: translateX(-15rpx);
}
100% {
opacity: 1;
transform: translateX(0);
}
}
.brand-name-slide {
animation: brandNameSlide 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.7s forwards;
opacity: 0;
}
/* 价格数字计数动画 */
@keyframes priceCountUp {
0% {
opacity: 0;
transform: translateY(10rpx) scale(0.8);
}
100% {
opacity: 1;
transform: translateY(0) scale(1);
}
}
.price-count-up {
animation: priceCountUp 0.8s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.8s forwards;
opacity: 0;
}
/* 门店列表容器动画 */
@keyframes shopListContainer {
0% {
opacity: 0;
transform: translateY(30rpx);
}
100% {
opacity: 1;
transform: translateY(0);
}
}
.shop-list-container {
animation: shopListContainer 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) 0.6s forwards;
opacity: 0;
}
/* 门店项目错列动画 */
@keyframes shopItemStagger {
0% {
opacity: 0;
transform: translateX(-30rpx) scale(0.95);
}
100% {
opacity: 1;
transform: translateX(0) scale(1);
}
}
.shop-item-stagger {
animation: shopItemStagger 0.6s cubic-bezier(0.25, 0.46, 0.45, 0.94) forwards;
opacity: 0;
}
/* 交互反馈动画 */
.brand-header-enter:active {
transform: scale(0.98);
transition: transform 0.1s ease-out;
}
.brand-icon-bounce:active {
transform: scale(0.9) rotate(5deg);
transition: transform 0.2s cubic-bezier(0.68, -0.55, 0.265, 1.55);
}
</style> </style>

View File

@ -12,7 +12,7 @@
</menuModel> </menuModel>
<!-- <view class="home-model"> <!-- <view class="home-model">
<div class="model-title"> <div class="model-title">
<text class="text">综合办公</text> <text class="text">综合办公</text>
</div> </div>
<div class="model-content"> <div class="model-content">
<menuItem v-for="item in modelMenu.zhbg" <menuItem v-for="item in modelMenu.zhbg"

View File

@ -1,254 +1,187 @@
<template> <template>
<view class="page-card" v-if="!isLoading"> <view class="page-card" v-if="!isLoading">
<view class="head-card" v-show="pageMsg.Serverpart_Name" @tap="toTrend"> <view class="head-card" v-show="pageMsg.Serverpart_Name" @tap="toTrend" >
<view class="uni-flex jc-between ai-center text-strong"> <view class="uni-flex jc-between ai-center text-strong">
<view class=""> {{ pageMsg.Serverpart_Name }} </view> <view class=""> {{pageMsg.Serverpart_Name}} </view>
<view class=""> ¥{{ $util.fmoney(pageMsg.Serverpart_Revenue, 2) }} </view> <view class=""> ¥{{$util.fmoney(pageMsg.Serverpart_Revenue,2)}} </view>
</view> </view>
<view class="uni-flex jc-between ai-center"> <view class="uni-flex jc-between ai-center">
<text class=""> {{ pageMsg.Serverpart_S || '南/东区' }} &nbsp; <text class=""> {{pageMsg.Serverpart_S||'南/东区'}} &nbsp; &nbsp;¥{{$util.fmoney(pageMsg.Serverpart_RevenueS,2)}}</text>
&nbsp;¥{{ $util.fmoney(pageMsg.Serverpart_RevenueS, 2) }}</text> <text class=""> {{pageMsg.Serverpart_N||'北/西区'}} &nbsp; &nbsp;¥{{$util.fmoney(pageMsg.Serverpart_RevenueN,2)}}</text>
<text class=""> {{ pageMsg.Serverpart_N || '北/西区' }} &nbsp;
&nbsp;¥{{ $util.fmoney(pageMsg.Serverpart_RevenueN, 2) }}</text>
</view> </view>
</view> </view>
<view class="page-list" v-if="pageMsg.ShopList && pageMsg.ShopList.length > 0"> <view class="page-list">
<!-- <view v-for="(dateItem,i) in pageMsg.revenueReportDetilsDates" :key="i">--> <view v-for="(dateItem,i) in pageMsg.revenueReportDetilsDates" :key="i">
<!-- <text class="list-date"> {{// $util.cutDate(dateItem.Statistics_Date,'MM.DD')}}</text>--> <text class="list-date"> {{$util.cutDate(dateItem.Statistics_Date,'MM.DD')}}</text>
<view class="cell-body uni-flex ai-center" v-for="(item, i) in pageMsg.ShopList" :key="i"> <view class="cell-body uni-flex ai-center" v-for="(item,i) in dateItem.revenueReportDetils" :key="i">
<image :src="item.BusinessType_Logo || '/static/images/revenue/operating-shop.png'" mode="aspectFit"> <image :src="item.BusinessType_Logo || '/static/images/revenue/operating-shop.png'" mode="aspectFit"></image>
</image> <view class="">
<view class=""> <view class="uni-flex ai-center jc-between">
<view class="uni-flex ai-center jc-between"> <text>{{item.BusinessType_Name}}</text>
<text>{{ item.BusinessType_Name }}</text> <text class="shop-total"> ¥{{$util.fmoney(item.BusinessType_Revenue,2)}}</text>
<text class="shop-total"> ¥{{ $util.fmoney(item.BusinessType_Revenue, 2) }}</text> </view>
</view> <view class="uni-flex ai-center jc-between">
<view class="uni-flex ai-center jc-between"> <text class="type-text" :class="{'scan':item.Upload_Type==1,'port':item.Upload_Type==2}">
<text style="display: inline-block;width: 20%" class="type-text" <template v-if="item.Upload_Type==1">
:class="{ 'scan': item.Upload_Type == 1, 'port': item.Upload_Type == 2 }"> 扫码上传
<template v-if="item.Upload_Type == 1"> </template>
扫码上传 <template v-else-if="item.Upload_Type==2" >
</template> 接口传输
<template v-else-if="item.Upload_Type == 2"> </template>
接口传输 <template v-else>
</template> 自动上传
<template v-else> </template>
自动上传 <!-- <text class="type-text scan" v-if="item.Upload_Type==1" >扫码上传</text>
</template>
<!-- <text class="type-text scan" v-if="item.Upload_Type==1" >扫码上传</text>
<text class="type-text port" >接口传输</text> <text class="type-text port" >接口传输</text>
<text v-else>自动上传</text> --> <text v-else>自动上传</text> -->
</text> </text>
<view class="uni-flex ai-center" style="display: inline-block;width: 80%"> <view class="uni-flex ai-center">
<div style="display: inline-block;width: 48%;text-align: left;margin-right: 4%" <text class="text-coast">{{item.Serverpart_S||'南/东区'}}: ¥{{$util.fmoney(item.Serverpart_RevenueS,2)}}</text>
class="text-coast"> <text class="text-coast">{{item.Serverpart_N||'北/西区'}}: ¥{{$util.fmoney(item.Serverpart_RevenueN,2)}}</text>
<text style="display: inline-block;width: 40px;text-align: left"> </view>
{{ item.Serverpart_RevenueS === 0 || item.Serverpart_RevenueS ?
`${item.Serverpart_S}
`: '' }}
</text>
<text style="display: inline-block;width: calc(100% - 50px);margin-left: 10px">
{{ item.Serverpart_RevenueS === 0 || item.Serverpart_RevenueS ?
`¥${$util.fmoney(item.Serverpart_RevenueS, 2)}` : '' }}
</text>
</div>
<div style="display: inline-block;width: 48%;text-align: right" class="text-coast">
<text style="display: inline-block;width: 40px;text-align: left">
{{ item.Serverpart_RevenueN === 0 || item.Serverpart_RevenueN ?
`${item.Serverpart_N}
`: '' }}
</text>
<text style="display: inline-block;width: calc(100% - 50px);margin-left: 10px">
{{ item.Serverpart_RevenueN === 0 || item.Serverpart_RevenueN ?
`¥${$util.fmoney(item.Serverpart_RevenueN, 2)}` : '' }}
</text>
</div>
</view> </view>
</view> </view>
</view> </view>
</view> </view>
<!-- </view>-->
</view> </view>
<view class="" v-if="!isLoading && !pageMsg.Serverpart_Name"> <view class="" v-if="!isLoading && !pageMsg.Serverpart_Name">
<noFound nodata="true" :text="noDataText" /> <noFound nodata="true" :text="noDataText"/>
</view> </view>
</view> </view>
</template> </template>
<script> <script>
export default { export default {
data() { data() {
return { return {
isLoading: true, isLoading: true,
pageMsg: {}, pageMsg: {},
pageOption: {}, pageOption: {},
noDataText: '抱歉,没有数据,请稍后重试' noDataText: '抱歉,没有数据,请稍后重试'
}
},
methods: {
toTrend() {
this.$util.toNextRoute('navigateTo', '/pages/operatingStatements/operatingTrend?name=' + this.pageMsg.Serverpart_Name + '&time=' + this.pageOption.et + '&id=' + this.pageOption.id + '&ProvinceCode=' + this.pageOption.pcode)
},
getDetail(obj) {
let _this = this
uni.showLoading({
title: '正在加载...',
mask: true
})
const req = {
provinceCode: obj.pcode,
serverpartId: obj.id,
startTime: obj.st,
endTime: obj.et,
} }
_this.$request.$webGet('CommercialApi/Revenue/GetRevenueReportDetil', req).then((res) => {
console.log('dadasda', res);
if (res.Result_Code == 100) {
_this.pageMsg = res.Result_Data
} else {
_this.noDataText = res.Result_Desc
}
uni.hideLoading()
_this.isLoading = false
})
// _this.$request.$webGet('WeChat/GetRevenueReportDetils',{
// startTime: obj.st,
// endTime: obj.et,
// Serverpart_Id: obj.id,
// pushProvinceCode: obj.pcode
// }).then(res=>{
// if(res.Result_Code==100) {
// _this.pageMsg = res.Result_Data
// }else{
// _this.noDataText = res.Result_Desc
// }
// uni.hideLoading()
// _this.isLoading = false
// })
}, },
methods: {
}, toTrend(){
onLoad(op) { this.$util.toNextRoute('navigateTo','/pages/operatingStatements/operatingTrend?name='+this.pageMsg.Serverpart_Name+'&time='+this.pageOption.et+'&id='+this.pageOption.id+'&ProvinceCode='+this.pageOption.pcode)
this.pageOption = op },
this.getDetail(op) getDetail(obj){
let _this = this
uni.showLoading({
title:'正在加载...',
mask:true
})
_this.$request.$webGet('WeChat/GetRevenueReportDetils',{
startTime: obj.st,
endTime: obj.et,
Serverpart_Id: obj.id,
pushProvinceCode: obj.pcode
}).then(res=>{
if(res.Result_Code==100) {
_this.pageMsg = res.Result_Data
}else{
_this.noDataText = res.Result_Desc
}
uni.hideLoading()
_this.isLoading = false
})
},
},
onLoad(op) {
this.pageOption = op
this.getDetail(op)
}
} }
}
</script> </script>
<style> <style>
page { page {
background-color: #fff; background-color: #fff;
} }
.page-card {
.page-card { margin: 30rpx 20rpx;
margin: 30rpx 20rpx;
}
} .head-card {
padding: 30rpx 35rpx;
.head-card { background: linear-gradient(to left, #f7f6f8 0%, #eceaeb 100%);
padding: 30rpx 35rpx; border-radius: 12rpx 12rpx 0 0 ;
background: linear-gradient(to left, #f7f6f8 0%, #eceaeb 100%); }
border-radius: 12rpx 12rpx 0 0; .head-card > view+view {
} margin-top: 16rpx;
}
.head-card>view+view { .text-strong {
margin-top: 16rpx; font-weight: bolder;
} }
.head-card > view>text {
.text-strong { font-size: 24rpx;
font-weight: bolder; color: #333;
} }
.list-date {
.head-card>view>text { font-size: 22rpx;
font-size: 24rpx; background-color: #f8f8f8;
color: #333; border-radius: 4rpx;
} padding: 4rpx 12rpx;
margin-top: 20rpx;
.list-date { }
font-size: 22rpx; .page-list {
background-color: #f8f8f8; border: 1rpx solid #F0F0F0;
border-radius: 4rpx; border-radius: 0 0 12rpx 12rpx;
padding: 4rpx 12rpx; overflow: hidden;
margin-top: 20rpx;
} padding: 30rpx 16rpx 30rpx 16rpx;
}
.page-list { .cell-body {
border: 1rpx solid #F0F0F0; position: relative;
border-radius: 0 0 12rpx 12rpx; padding: 20rpx 20rpx 20rpx 0;
overflow: hidden; }
.cell-body image {
padding: 30rpx 16rpx 30rpx 16rpx; width: 60rpx;
} height: 60rpx;
border-radius: 50%;
.cell-body { margin-right: 16rpx;
position: relative; }
padding: 20rpx 20rpx 20rpx 0; .cell-body>view {
} flex: 1;
}
.cell-body image { .page-list text {
width: 60rpx; font-size: 22rpx;
height: 60rpx; color: #2E2E2E;
border-radius: 50%; }
margin-right: 16rpx; text.shop-total {
} font-size: 24rpx;
}
.cell-body>view { text.type-text {
flex: 1; color: #DFBE9F;
} display: flex;
align-items: center;
.page-list text { }
font-size: 22rpx; text.type-text.scan::before,text.type-text.port::before {
color: #2E2E2E; content: '';
} width: 21rpx;
height: 23rpx;
text.shop-total { margin-right: 8rpx;
font-size: 24rpx; }
} text.type-text.scan::before {
background: url(/static/images/revenue/scan-up.png) no-repeat center;
text.type-text { background-size: contain;
color: #DFBE9F; }
display: flex; text.type-text.port::before {
align-items: center; background: url(/static/images/revenue/port.png) no-repeat center;
} background-size: contain;
}
text.type-text.scan::before, text.type-text.port {
text.type-text.port::before { color: #95BAF2;
content: ''; }
width: 21rpx; text.text-coast {
height: 23rpx; color: #848484;
margin-right: 8rpx; width: 184rpx;
}
}
text.type-text.scan::before { text.text-coast + text.text-coast {
background: url(/static/images/revenue/scan-up.png) no-repeat center; text-align: right;
background-size: contain; }
}
text.type-text.port::before {
background: url(/static/images/revenue/port.png) no-repeat center;
background-size: contain;
}
text.type-text.port {
color: #95BAF2;
}
text.text-coast {
color: #848484;
width: 184rpx;
}
text.text-coast+text.text-coast {
text-align: right;
}
</style> </style>

File diff suppressed because it is too large Load Diff