<template>
|
<!-- 公司经营报表 -->
|
<view class="container" @click="hideFilter">
|
<h-tabs
|
class="tab"
|
:tabData="tabs"
|
@tabClick="tabChange"
|
:config="{
|
color: '#abb1cc',
|
activeColor: '#518EFF',
|
underLineColor: '#518EFF',
|
underLineHeight: 6,
|
fontSize: '28',
|
underLineWidth: 60,
|
}"
|
/>
|
<view v-if="tabIndex==1 || tabIndex==2">
|
<view class="list-item" v-for="item in list">
|
<view class="list-header">
|
<text>{{item.dataTime}}</text>
|
</view>
|
<view class="list-content">
|
<view class="list-row">
|
<text>营业收入</text>
|
<text>¥{{item.totalPay | formatNum}}</text>
|
</view>
|
<view class="list-row">
|
<text>现金收款</text>
|
<text>¥{{item.cashPay | formatNum}}</text>
|
</view>
|
<view class="list-row">
|
<text>储值卡收款</text>
|
<text>¥{{item.cardPay | formatNum}}</text>
|
</view><view class="list-row">
|
<text>欠款</text>
|
<text>¥{{item.arrearsPay | formatNum}}</text>
|
</view><view class="list-row">
|
<text>现金退款</text>
|
<text>¥{{item.refundCashPay | formatNum}}</text>
|
</view><view class="list-row">
|
<text>卡项退款</text>
|
<text>¥{{item.refundCardPay | formatNum}}</text>
|
</view><view class="list-row">
|
<text>产品业绩</text>
|
<text>¥{{item.productAchieve | formatNum}}</text>
|
</view><view class="list-row">
|
<text>卡项业绩</text>
|
<text>¥{{item.cardAchieve | formatNum}}</text>
|
</view><view class="list-row">
|
<text>还款</text>
|
<text>¥{{item.refund | formatNum}}</text>
|
</view><view class="list-row">
|
<text>客单数</text>
|
<text>{{item.perCustomCnt}}</text>
|
</view><view class="list-row">
|
<text>客品数</text>
|
<text>{{item.customGoodsCnt}}</text>
|
</view><view class="list-row">
|
<text>客单价</text>
|
<text>¥{{item.perCustomPrice | formatNum}}</text>
|
</view><view class="list-row">
|
<text>成本</text>
|
<text>¥{{item.cost | formatNum}}</text>
|
</view>
|
<view class="list-row">
|
<text>毛利</text>
|
<text>¥{{item.grossProfit | formatNum}}</text>
|
</view>
|
<view class="list-row">
|
<text>毛利率</text>
|
<text>{{item.grossProfitRate}}</text>
|
</view>
|
<view class="list-row">
|
<text>本金消耗</text>
|
<text>¥{{item.consumePay | formatNum}}</text>
|
</view>
|
<view class="list-row">
|
<text>赠送消耗</text>
|
<text>¥{{item.freeConsumePay | formatNum}}</text>
|
</view>
|
<view class="list-row">
|
<text>人头数</text>
|
<text>{{item.peopleCnt}}个</text>
|
</view>
|
<view class="list-row">
|
<text>项目消耗数</text>
|
<text>{{item.projConsumeCnt}}个</text>
|
</view>
|
<view class="list-row">
|
<text>服务时长</text>
|
<text>{{item.timeLength}}分钟</text>
|
</view>
|
</view>
|
</view>
|
<view v-if="list.length">
|
<uni-load-more :status="loadStatus" color="#a5abaf"></uni-load-more>
|
</view>
|
</view>
|
<view v-else>
|
<view class="list-item">
|
<view class="list-header">
|
<text class="font-bold">专项数据</text>
|
</view>
|
<view class="list-content-bordered">
|
<view class="list-row-bordered" @click="toAnalyse('营业收入', 1)">
|
<text>营业收入</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('现金收款', 2)">
|
<text>现金收款</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('储值卡收款', 3)">
|
<text>储值卡收款</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('欠款', 4)">
|
<text>欠款</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('现金退款', 5)">
|
<text>现金退款</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('卡项退款', 6)">
|
<text>卡项退款</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('产品业绩', 7)">
|
<text>产品业绩</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('卡项业绩', 8)">
|
<text>卡项业绩</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('还款', 9)">
|
<text>还款</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('客单数', 10)">
|
<text>客单数</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('客品数', 11)">
|
<text>客品数</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('客单价', 12)">
|
<text>客单价</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('成本', 13)">
|
<text>成本</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('毛利', 14)">
|
<text>毛利</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('毛利率', 15)">
|
<text>毛利率</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('本金消耗', 16)">
|
<text>本金消耗</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('赠送消耗', 17)">
|
<text>赠送消耗</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('人头数', 18)">
|
<text>人头数</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('项目消耗数', 19)">
|
<text>项目消耗数</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
<view class="list-row-bordered" @click="toAnalyse('服务时长', 20)">
|
<text>服务时长</text>
|
<text class="iconfont iconarrow-backimg"></text>
|
</view>
|
</view>
|
</view>
|
</view>
|
<view class="drop-down" v-if="isShowFilter">
|
<view class="drop-down-row" v-for="item in storeList">
|
<text :class="item.id == shopId?'blue':''" @click="storeChange(item)">{{item.shopShortName}}</text>
|
</view>
|
</view>
|
</view>
|
</template>
|
|
<script>
|
import uniLoadMore from '@/components/uni-load-more/uni-load-more.vue';
|
import HTabs from "@/components/liuyuno-tabs/liuyuno-tabs.vue";
|
export default {
|
components: {
|
HTabs,
|
uniLoadMore
|
},
|
data() {
|
return {
|
type: 1, //1 公司经营报表 2 门店经营报表
|
tabIndex: 1,
|
tabs:[
|
{
|
state: 1,
|
name: '每日'
|
},
|
{
|
state: 2,
|
name: '每月'
|
},
|
{
|
state: 3,
|
name: '专项'
|
}
|
],
|
isShowFilter:false,
|
storeList: [],
|
shopId: '',//门店id
|
list: [],
|
loadStatus: 'more',
|
pageNum: 1
|
}
|
},
|
onLoad(options) {
|
if(options.type){
|
this.type = options.type;
|
}
|
if(this.type==1){
|
// #ifdef APP-PLUS
|
let webView = this.$mp.page.$getAppWebview();
|
webView.setTitleNViewButtonStyle(1, {
|
width: 0,
|
});
|
// #endif
|
this.loadList();
|
}else{
|
uni.setNavigationBarTitle({
|
title: '门店经营报表'
|
});
|
this.loadShopList();;
|
}
|
},
|
onPullDownRefresh(){
|
this.reloadData();
|
let timer = setTimeout(function () {
|
uni.stopPullDownRefresh();
|
clearTimeout(timer);
|
timer = null;
|
}, 800);
|
},
|
onReachBottom(){
|
this.loadList()
|
},
|
onNavigationBarButtonTap(e){
|
if(e.index==0){
|
uni.navigateTo({
|
url:"./hint"
|
})
|
}
|
if(e.width && e.index==1){
|
this.isShowFilter=!this.isShowFilter
|
}
|
},
|
onHide() {
|
this.hideFilter()
|
},
|
methods:{
|
reloadData(){
|
this.list = [];
|
this.pageNum = 1;
|
this.loadStatus = 'more';
|
this.loadList();
|
},
|
tabChange(index){
|
let val = index + 1;
|
if(val == this.tabIndex){
|
return
|
}
|
this.tabIndex = val;
|
if(val != 3){
|
this.reloadData()
|
}
|
},
|
hideFilter(){
|
this.isShowFilter = false
|
},
|
toAnalyse(title, type){
|
uni.navigateTo({
|
url: './analyse/index?shopId='+this.shopId+'&title='+title+'&type='+type
|
})
|
},
|
// 切换门店
|
storeChange(item){
|
if(item.id == this.shopId){
|
return;
|
}
|
this.shopId = item.id;
|
uni.setNavigationBarTitle({
|
title: item.shopShortName + '经营报表'
|
});
|
this.reloadData();
|
},
|
loadShopList(){
|
this.$httpUtils.request('/api/shop/findAllShopList').then((res) => {
|
if(res.status == 200){
|
let result = res.rows;
|
this.storeList = result;
|
if(result.length){
|
this.shopId = result[0].id;
|
uni.setNavigationBarTitle({
|
title: result[0].shopShortName + '经营报表'
|
});
|
}
|
this.loadList();
|
}
|
})
|
},
|
loadList(){
|
if(this.loadStatus!=='more'){
|
return;
|
}
|
this.$httpUtils.request('/api/statistics/findShopBusinessesData', {
|
"pageNum": this.pageNum,
|
"pageSize": 10,
|
"shopId": this.shopId,
|
"type": this.tabIndex
|
}, 'POST').then((res) => {
|
if(res.status == 200){
|
let result = res.rows;
|
if(result.length < 10){
|
this.loadStatus = 'noMore';
|
} else {
|
this.pageNum ++ ;
|
this.loadStatus = 'more';
|
}
|
this.list = this.list.concat(result);
|
}
|
})
|
}
|
}
|
}
|
</script>
|
|
<style>
|
page{
|
background: #F6F6F8;
|
height: 100%;
|
}
|
.container{
|
min-height: 100%;
|
}
|
.tab{
|
background: #FFFFFF;
|
border-bottom: #EDEAF4;
|
border-bottom-left-radius: 4px;
|
border-bottom-right-radius: 4px;
|
box-shadow:0 6px 6px rgba(237,234,244,0.5);
|
}
|
.list-item{
|
margin: 10px 10px 0;
|
padding: 0 10px;
|
background: #FFFFFF;
|
border: 1px solid #EDEAF4;
|
border-radius: 4px;
|
}
|
.list-header{
|
border-bottom: 1px solid #EDEAF4;
|
padding: 12px 5px;
|
font-size: 14px;
|
}
|
.list-content{
|
padding: 8px 5px;
|
font-size: 13px;
|
color: #333;
|
}
|
.list-row{
|
display: flex;
|
justify-content: space-between;
|
line-height: 30px;
|
}
|
.list-row text:nth-last-of-type(1){
|
color: #666
|
}
|
.list-content-bordered{
|
padding: 0 5px;
|
font-size: 13px;
|
}
|
.list-row-bordered{
|
display: flex;
|
justify-content: space-between;
|
line-height: 40px;
|
border-bottom: 1px solid #EDEAF4;
|
}
|
.list-row-bordered:nth-last-of-type(1){
|
border-bottom: 0;
|
}
|
.list-row-bordered text:nth-last-of-type(1){
|
color: #a5abaf
|
}
|
.drop-down{
|
min-width: 56px;
|
background: #FFFFFF;
|
border: 1px solid #EDEAF4;
|
border-radius: 4px;
|
padding: 0 10px;
|
position: fixed;
|
right: 35px;
|
top: 0;
|
z-index: 99;
|
color: #a5abaf;
|
font-size: 12px;
|
}
|
.drop-down-row{
|
border-bottom: 1px solid #EDEAF4;
|
padding: 5px 0;
|
text-align: center;
|
}
|
.drop-down-row:nth-last-child(1){
|
border: 0;
|
}
|
</style>
|