| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585 |
- <template>
- <base-page>
- <view class="common-wrap">
- <view class="title">营业数据</view>
- <view class="choice-day">
- <view class="date-btn" :class="dateType == 'today' ? 'select' : ''" @click="switchDateType('today')"
- value="today">今日</view>
- <view class="date-btn" :class="dateType == 'yesterday' ? 'select' : ''"
- @click="switchDateType('yesterday')" value="yesterday">昨日</view>
- <view class="date-btn" :class="dateType == 'week' ? 'select' : ''" @click="switchDateType('week')"
- value="week">7日内</view>
- <view class="date-btn" :class="dateType == 'month' ? 'select' : ''" @click="switchDateType('month')"
- value="month">30日内</view>
- <view class="date-btn" :class="dateType == 'custom' ? 'select' : ''" @click="switchDateType('custom')"
- value="custom">自定义</view>
- <view class="report text-color">
- <text class="move iconfont iconicon-test"></text>
- <text></text>
- </view>
- </view>
- <view class="money" v-if="businessdata">
- <view class="estimate" :class="statType == 'expected_earnings_total_money' ? 'estimate-active' : ''">
- <view class="income">
- <text class="income-name">预计收入(元)</text>
- <!-- <uni-dropdown>
- <view class="action" slot="dropdown-link"><i class="iconfont iconbangzhu js-prompt-top"></i></view>
- <view slot="dropdown">
- <view class="dropdown-content-box">
- <view class="text">弹框展示内容</view>
- <view class="arrow"></view>
- </view>
- </view>
- </uni-dropdown> -->
- </view>
- <view class="num-money">
- <text class="last_income">{{ businessdata.expected_earnings_total_money || 0.0 }}</text>
- <text class="detail" @click="switchStatType('expected_earnings_total_money')">查看详情</text>
- </view>
- </view>
- <view class="estimate" :class="statType == 'billing_money' ? 'estimate-active' : ''">
- <view class="income">
- <text class="income-name">开单金额数(元)</text>
- <!-- <uni-dropdown>
- <view class="action" slot="dropdown-link"><i class="iconfont iconbangzhu js-prompt-top"></i></view>
- <view slot="dropdown">
- <view class="dropdown-content-box">
- <view class="text">弹框展示内容</view>
- <view class="arrow"></view>
- </view>
- </view>
- </uni-dropdown> -->
- </view>
- <view class="num-money">
- <text class="last_income">{{ businessdata.billing_money || 0.0 }}</text>
- <text class="detail" @click="switchStatType('billing_money')">查看详情</text>
- </view>
- </view>
- <view class="estimate" :class="statType == 'billing_count' ? 'estimate-active' : ''">
- <view class="income"><text class="income-name">开单数量</text></view>
- <view class="num-money">
- <text class="last_income">{{ businessdata.billing_count || 0 }}</text>
- <text class="detail" @click="switchStatType('billing_count')">查看详情</text>
- </view>
- </view>
- <view class="estimate" :class="statType == 'buycard_money' ? 'estimate-active' : ''">
- <view class="income"><text class="income-name">办卡金额数(元)</text></view>
- <view class="num-money">
- <text class="last_income">{{ businessdata.buycard_money || 0.0 }}</text>
- <text class="detail" @click="switchStatType('buycard_money')">查看详情</text>
- </view>
- </view>
- <view class="estimate" :class="statType == 'buycard_count' ? 'estimate-active' : ''">
- <view class="income"><text class="income-name">办卡数</text></view>
- <view class="num-money">
- <text class="last_income">{{ businessdata.buycard_count || 0 }}</text>
- <text class="detail" @click="switchStatType('buycard_count')">查看详情</text>
- </view>
- </view>
- <view class="estimate" :class="statType == 'recharge_money' ? 'estimate-active' : ''">
- <view class="income"><text class="income-name">会员充值金额(元)</text></view>
- <view class="num-money">
- <text class="last_income">{{ businessdata.recharge_money || 0.0 }}</text>
- <text class="detail" @click="switchStatType('recharge_money')">查看详情</text>
- </view>
- </view>
- <view class="estimate" :class="statType == 'recharge_count' ? 'estimate-active' : ''">
- <view class="income"><text class="income-name">会员充值数量</text></view>
- <view class="num-money">
- <text class="last_income">{{ businessdata.recharge_count || 0 }}</text>
- <text class="detail" @click="switchStatType('recharge_count')">查看详情</text>
- </view>
- </view>
- <view class="estimate" :class="statType == 'refund_money' ? 'estimate-active' : ''">
- <view class="income"><text class="income-name">会员退款金额(元)</text></view>
- <view class="num-money">
- <text class="last_income">{{ businessdata.refund_money || 0.0 }}</text>
- <text class="detail" @click="switchStatType('refund_money')">查看详情</text>
- </view>
- </view>
- <view class="estimate" :class="statType == 'refund_count' ? 'estimate-active' : ''">
- <view class="income"><text class="income-name">会员退款数量</text></view>
- <view class="num-money">
- <text class="last_income">{{ businessdata.refund_count || 0 }}</text>
- <text class="detail" @click="switchStatType('refund_count')">查看详情</text>
- </view>
- </view>
- <view class="estimate" :class="statType == 'order_member_count' ? 'estimate-active' : ''">
- <view class="income"><text class="income-name">门店下单会员数</text></view>
- <view class="num-money">
- <text class="last_income">{{ businessdata.order_member_count || 0 }}</text>
- <text class="detail" @click="switchStatType('order_member_count')">查看详情</text>
- </view>
- </view>
- <view class="estimate" :class="statType == 'balance_money' ? 'estimate-active' : ''">
- <view class="income"><text class="income-name">会员余额消费金额</text></view>
- <view class="num-money">
- <text class="last_income">{{ businessdata.balance_money || 0.0 }}</text>
- <text class="detail" @click="switchStatType('balance_money')">查看详情</text>
- </view>
- </view>
- </view>
- </view>
- <uni-popup ref="customTime">
- <view class="pop-box">
- <view class="pop-header">
- <view class="pop-header-text">自定义时间选择</view>
- <view class="pop-header-close" @click="$refs.customTime.close()"><i
- class="iconguanbi1 iconfont"></i></view>
- </view>
- <view class="pop-content ">
- <uni-datetime-picker v-model="timeObj.custom" @change="changeTime" :end="endDate" :clearIcon="false"
- type="datetimerange" rangeSeparator="至" />
- </view>
- <view class="pop-bottom"><button class="primary-btn" @click="getStatData()">确定</button></view>
- </view>
- </uni-popup>
- <uni-popup ref="chartsPop">
- <view class="pop-box charts-pop">
- <view class="pop-header">
- <view class="pop-header-text">运营数据图表展示</view>
- <view class="pop-header-close" @click="$refs.chartsPop.close()"><i class="iconguanbi1 iconfont"></i>
- </view>
- </view>
- <view class="pop-content">
- <qiun-data-charts type="line" :chartData="chartData" :eopts="{ seriesTemplate: { smooth: true } }"
- :ontouch="true" :opts="chartsOpts" />
- </view>
- <!-- <view class="pop-bottom"><button class="primary-btn" @click="getStatData()">确定</button></view> -->
- </view>
- </uni-popup>
- </base-page>
- </template>
- <script>
- export default {
- data() {
- return {
- statType: 'expected_earnings_total_money',
- statTypeArr: {
- expected_earnings_total_money: '预计收入',
- billing_money: '开单金额数',
- billing_count: '开单数量',
- buycard_money: '办卡金额数',
- buycard_count: '办卡数',
- recharge_money: '会员充值金额',
- recharge_count: '会员充值数量',
- refund_money: '会员退款金额',
- refund_count: '会员退款数量',
- order_member_count: '门店下单会员数',
- balance_money: '会员余额消费金额'
- },
- dateType: 'today',
- timeObj: {
- today: [],
- yesterday: [],
- week: [],
- month: [],
- custom: []
- },
- chartData: {
- categories: [],
- series: []
- },
- businessdata: null,
- chartsOpts: {
- enableScroll: true,
- xAxis: {
- scrollShow: true,
- itemCount: 24,
- disableGrid: true
- }
- }
- };
- },
- onLoad() {
- this.setDate();
- this.getStatData();
- },
- onShow() {
- let date = new Date();
- var y = date.getFullYear();
- var m = date.getMonth() + 1;
- var d = date.getDate();
- this.endDate = y + '-' + m + '-' + d + ' 23:59:59';
- },
- methods: {
- // 重置图表数据
- resetChartData() {
- this.chartData.categories = [];
- this.chartData.series = [];
- },
- setDate() {
- let time = this.$util.timeTurnTimeStamp(this.$util.timeFormat(Date.now() / 1000, 'y-m-d'));
- this.timeObj.today = [time, time + 86399];
- this.timeObj.yesterday = [time - 86400, time - 1];
- this.timeObj.week = [time - 604800, time];
- this.timeObj.month = [time - 2592000, time];
- },
- switchDateType(type) {
- this.dateType = type;
- if (type == 'custom') {
- this.$refs.customTime.open();
- return false;
- }
- if (type == 'month') this.chartsOpts.xAxis.itemCount = 10;
- else this.chartsOpts.xAxis.itemCount = 24;
- this.getStatData();
- },
- switchStatType(type) {
- this.statType = type;
- this.$refs.chartsPop.open();
- this.resetChartData();
- this.getStatData();
- setTimeout(() => {
- this.getChartData();
- }, 500);
- },
- changeTime(e) {
- this.timeObj.custom = e;
- this.chartsOpts.xAxis.itemCount = 10;
- },
- getStatData() {
- if (this.dateType == 'custom') {
- this.$refs.customTime.close();
- this.timeObj.custom[0] = this.$util.timeTurnTimeStamp(this.timeObj.custom[0]) *
- 1000; // 解决自定义数据保存之后再次点击出现的数据错乱
- this.timeObj.custom[1] = this.$util.timeTurnTimeStamp(this.timeObj.custom[1]) *
- 1000; // 解决自定义数据保存之后再次点击出现的数据错乱
- }
- this.getBusinessData();
- },
- getChartData() {
- let url = '/cashier/storeapi/stat/dayStatData';
- let data = {};
- data.start_time = this.timeObj[this.dateType][0];
- if (this.dateType == 'today' || this.dateType == 'yesterday') url = '/cashier/storeapi/stat/hourStatData';
- else data.end_time = this.timeObj[this.dateType][1];
- this.$api.sendRequest({
- url: url,
- data: data,
- success: res => {
- if (res.code >= 0) {
- this.chartData.series = [];
- this.chartData.series.push({
- data: res.data[this.statType],
- name: this.statTypeArr[this.statType]
- });
- this.chartData.categories = res.data.time;
- }
- }
- });
- },
- getBusinessData() {
- let data = {};
- data.start_time = this.dateType == 'custom' ? parseInt(this.timeObj[this.dateType][0] / 1000) : parseInt(
- this.timeObj[this.dateType][0]);
- data.end_time = this.dateType == 'custom' ? parseInt(this.timeObj[this.dateType][1] / 1000) : parseInt(this
- .timeObj[this.dateType][1]);
- this.$api.sendRequest({
- url: '/cashier/storeapi/stat/statTotal',
- data: data,
- success: res => {
- if (res.code >= 0) {
- this.businessdata = res.data;
- }
- }
- });
- }
- }
- };
- </script>
- <style>
- .stat-input-inline .uni-date {}
- .pop-content>>>.uni-icons {
- line-height: 0.32rem;
- }
- </style>
- <style lang="scss" scoped>
- .common-wrap {
- padding: 0.2rem;
- height: 100vh;
- box-sizing: border-box;
- }
- .title {
- display: flex;
- margin-bottom: 0.21rem;
- font-size: 0.16rem;
- font-family: Source Han Sans CN;
- font-weight: bold;
- line-height: 0.2rem;
- }
- .choice-day {
- display: flex;
- }
- .choice-time {
- margin-top: 0.09rem;
- font-size: 0.12rem;
- font-family: Source Han Sans CN;
- font-weight: 400;
- line-height: 0.36rem;
- }
- .report {
- display: flex;
- justify-content: flex-end;
- margin-right: 0.2rem;
- font-size: 0.14rem;
- font-family: Source Han Sans CN;
- font-weight: 400;
- line-height: 0.36rem;
- cursor: pointer;
- }
- .move {
- margin-right: 0.06rem;
- }
- .money {
- display: flex;
- flex-wrap: wrap;
- margin-top: 0.35rem;
- .estimate {
- width: calc((100% - 0.85rem) / 5);
- margin: 0 0.08rem 0.2rem;
- padding: 0.2rem;
- background: #fff;
- border: 0.01rem solid #eee;
- border-radius: 0.02rem;
- cursor: pointer;
- position: relative;
- box-sizing: border-box;
- .income {
- display: flex;
- flex-direction: row;
- box-sizing: border-box;
- line-height: 0.2rem;
- .income-name {
- font-size: 0.16rem;
- }
- }
- .num-money {
- .last_income {
- display: block;
- margin: 0.15rem 0;
- font-size: 0.24rem;
- font-weight: 500;
- line-height: 0.2rem;
- }
- .detail {
- display: block;
- text-align: right;
- color: $primary-color;
- font-size: $uni-font-size-sm;
- position: relative;
- bottom: -0.05rem;
- }
- }
- }
- .estimate:last-child {
- margin-right: 0;
- }
- }
- .jantou {
- margin-top: 0.05rem;
- padding-left: 0.1rem;
- height: 0.11rem;
- }
- .yesterday {
- display: flex;
- flex-wrap: wrap;
- font-size: 0.12rem;
- }
- .top-num {
- display: flex;
- margin-left: 0.05rem;
- font-size: 0.12rem;
- font-weight: 400;
- }
- .date-btn {
- height: 0.42rem;
- line-height: 0.42rem;
- font-size: 0.14rem;
- padding: 0 0.3rem;
- box-sizing: border-box;
- border: 0.01rem solid #d2d2d2;
- cursor: pointer;
- border-right: none;
- border-left: none;
- position: relative;
- }
- .date-btn:nth-child(6)::after {
- border-radius: 0 0.02rem 0.02rem 0;
- }
- .date-btn:first-child::after {
- border-radius: 0.02rem 0 0 0.02rem;
- }
- .date-btn:first-child {
- border-radius: 0.02rem 0 0 0.02rem;
- }
- .date-btn::after {
- content: '';
- position: absolute;
- top: -0.01rem;
- left: 0;
- bottom: -0.01rem;
- right: -0.01rem;
- border-right: 0.01rem solid #d2d2d2;
- border-left: 0.01rem solid #d2d2d2;
- }
- .select {
- color: #fff;
- background-color: $primary-color;
- border-color: $primary-color;
- }
- .select::after {
- z-index: 2;
- border-color: $primary-color;
- }
- .select:first-child {
- border-radius: 0.02rem 0 0 0.02rem;
- }
- .seleced:nth-child(6) {
- border-radius: 0 0.02rem 0.02rem 0;
- }
- .c-datepicker-picker {
- z-index: 99999999 !important;
- }
- .yesterday {
- display: none;
- }
- .dropdown-content-box {
- padding: 0.05rem 0;
- margin-top: 0.05rem;
- background-color: #fff;
- border: 0.01rem solid #ebeef5;
- border-radius: 0.04rem;
- box-shadow: 0 0.01rem 0.12rem 0 rgba(0, 0, 0, 0.1);
- position: relative;
- .arrow {
- position: absolute;
- top: -0.06rem;
- right: 0.06rem;
- width: 0;
- height: 0;
- border-left: 0.06rem solid transparent;
- border-right: 0.06rem solid transparent;
- border-bottom: 0.06rem solid #fff;
- }
- .text {
- display: flex;
- align-items: center;
- justify-content: center;
- margin: 0;
- padding: 0 0.1rem;
- transition: all 0.3s;
- font-size: 0.12rem;
- width: 1.5rem;
- box-sizing: border-box;
- text-align: left;
- line-height: 1.5;
- }
- }
- .js-prompt-top {
- color: #c8c9cc;
- font-size: 0.14rem;
- z-index: 999;
- margin-left: 0.05rem;
- cursor: pointer;
- }
- // pop弹框
- .pop-box {
- background: #ffffff;
- width: 6rem;
- height: 3.38rem;
- .pop-header {
- padding: 0 0.15rem 0 0.2rem;
- height: 0.5rem;
- line-height: 0.5rem;
- border-bottom: 0.01rem solid #f0f0f0;
- font-size: 0.14rem;
- color: #333;
- overflow: hidden;
- border-radius: 0.02rem 0.2rem 0 0;
- box-sizing: border-box;
- display: flex;
- justify-content: space-between;
- .pop-header-text {}
- .pop-header-close {
- cursor: pointer;
- i {
- font-size: 0.18rem;
- }
- }
- }
- .pop-content {
- height: calc(100% - 1.05rem);
- // overflow-y: scroll;
- padding: 0.2rem;
- box-sizing: border-box;
- }
- .pop-bottom {
- padding: 0.1rem;
- height: 0.65rem;
- border-top: 0.01rem solid #eee;
- button {
- width: 95%;
- }
- }
- }
- .charts-pop {
- width: 9.5rem;
- height: 5.4rem;
- background-color: #fff;
- .pop-content {
- width: 100%;
- height: calc(100% - 1rem);
- }
- }
- </style>
|