You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

456 lines
16 KiB

<template>
<view class="collection-info">
<view class="ci-header">
<view class="ch-stadium">
<view class="cs-txt">当前门店</view>
<picker :range="stadiumList" range-key="name" @change="storeChange">
<view class="cs-picker">
<input :value="curStadium.name || '-'" disabled />
<image mode="aspectFit" src="/static/images/icon/arrow_b2.png"></image>
</view>
</picker>
</view>
<view class="ch-date-scene">
<view class="cds-item">
<view class="ci-txt">日期</view>
<view class="ci-frame ci-date">
<input disabled :value="curDate || '-'" />
<view></view>
<picker mode="date" @change="dateChange">
<image mode="aspectFit" src="/static/images/icon/calendar.png"></image>
</picker>
</view>
</view>
<view class="cds-item">
<view class="ci-txt">场景</view>
<view class="ci-frame ci-scene">
<picker class="cs-picker" :range="sceneList" range-key="name" @change="sceneChange">
<view class="cp-picker-frame">
<input disabled :value="curScene.name || '-'" />
<image mode="aspectFit" src="/static/images/icon/arrow_b2.png" style="transform: rotateZ(90deg);"></image>
</view>
</picker>
</view>
</view>
</view>
</view>
<view class="ci-tab">
<view class="ct-item" @click="typeChange(0)">
<view :class="[curType == 0?'active':'']">全部</view>
</view>
<view class="ct-item" @click="typeChange(1)">
<view :class="[curType == 1?'active':'']">退款</view>
</view>
</view>
<view class="ci-total">
收款{{ totalInfo.income_num || 0 }}<text>{{ totalInfo.income_amount || 0 }}</text>) 退款{{ totalInfo.refund_num || 0 }}<text>{{ totalInfo.refund_amount || 0 }}</text>
</view>
<view class="ci-ls">
<block v-for="(e, i) in recordLs" :key="i">
<view class="cl-item">
<view class="ci-name">
<view>{{ e.scene_name || '-' }}</view>
<view :class="e.amount<=0?'black': ''">{{ e.amount>0?'+':'' }}{{ e.amount || '-' }}</view>
</view>
<view class="ci-line">
<view>{{ e.order_no || '-' }}</view>
<view v-if="e.amount<=0">{{ e.refund_desc || '-' }}</view>
</view>
<view class="ci-line">
<view>{{ e.pay_time || '-' }}</view>
<view></view>
</view>
</view>
</block>
</view>
</view>
</template>
<script>
import { API } from '../../../js/api'
import { servers } from '../../../js/server'
import util from '../../../utils/util'
import { mapState } from 'vuex';
export default {
computed: {
...mapState(['brandInfo']),
},
data(){
return {
optionsQuery: {},
stadiumList: [],
curStadium: {},
sceneList: [],
curScene: {},
curDate: '',
curType: 0, // 0 -> 全部, 1 -> 退款;
recordLs: [],
totalInfo: {},
page: 1
}
},
onReachBottom(){
let { curStadium, optionsQuery, curScene, curDate, curType, page } = this;
let _query = {
brand_id: optionsQuery.brand_id,
stadium_id: optionsQuery.stadium_id == 0 ? -1 : curStadium.id,
time_str: curDate,
scene: curScene.scene,
type: curType == 1 ? '退款' : '全部',
page: ++page
}
this.getRecordLs(_query);
},
onLoad(options){
this.optionsQuery = options || {};
this.initPage(options);
},
methods: {
typeChange(idx){
this.curType = idx;
this.$nextTick(_=>this.refreshList());
},
async initPage(options){
let _stadiumLs = [];
if(!!options.stadium_id)_stadiumLs = await this.getStoreList(options.stadium_id);
let _sceneLs = await this.getSceneList();
this.curDate = util.formatDate({});
this.$nextTick(_=>this.refreshList());
},
refreshList(){
let { curStadium, optionsQuery, curScene, curDate, curType } = this;
this.page = 1;
this.recordLs = [];
let _query = {
brand_id: optionsQuery.brand_id,
stadium_id: optionsQuery.stadium_id == 0 ? -1 : curStadium.id,
time_str: curDate,
scene: curScene.scene,
type: curType == 1 ? '退款' : '全部'
}
this.getRecordLs(_query);
},
dateChange(e){
this.curDate = e.detail.value;
this.$nextTick(_=>this.refreshList());
},
sceneChange(e){
let { sceneList } = this;
this.curScene = sceneList[e.detail.value];
this.$nextTick(_=>this.refreshList());
},
async storeChange(e){
let { stadiumList } = this;
this.curStadium = stadiumList[e.detail.value] || {};
await this.getSceneList();
this.$nextTick(_=>this.refreshList());
},
getRecordLs({
brand_id,
stadium_id = '', // 空字符全部 -1品牌收款
time_str, // 日期y-m-d
scene,
type = '全部' , // 全部/退款
page_size = 15,
page = 1,
}){
let { optionsQuery } = this;
util.showLoad();
return servers.get({
url: API.consumeCountDetailLs,
data: {
brand_id,
stadium_id: stadium_id == 0 ? -1 : stadium_id == -2 ? '' : stadium_id,
time_str,
page,
page_size,
scene,
type,
},
failMsg: '加载店铺列表失败!',
})
.then(res=>{
util.hideLoad();
let _list = res.list || [];
this.totalInfo = res || {};
if(page == 1)return this.recordLs = _list;
if(!_list.length)return util.showNone('没有更多!');
this.page = page;
this.recordLs = [...this.recordLs, ..._list];
})
},
// 店铺列表
getStoreList(stadium_id = ''){
let { optionsQuery } = this;
return servers.get({
url: API.stadiumList,
data: {
brand_id: optionsQuery.brand_id,
},
failMsg: '加载店铺列表失败!',
})
.then(res=>{
let _list = res.list || [];
let _all = { name: '全部', id: -2, }
_list.unshift(_all);
let _cur = null;
if(!!stadium_id){
let _fiLs = _list.filter(e=>e.id == stadium_id);
if(_fiLs.length)_cur = _fiLs[0];
}
if(_cur&&_cur.id){
this.curStadium = _cur;
}else{
this.curStadium = _all;
}
return this.stadiumList = _list;
})
},
// 场景列表
getSceneList(){
let { optionsQuery, curStadium } = this;
return servers.get({
url: API.consumeCountGetScene,
data: {
brand_id: optionsQuery.brand_id,
stadium_id: optionsQuery.stadium_id == 0 ? -1 : curStadium.id,
},
failMsg: '加载场景列表失败!',
})
.then(res=>{
let _list = res || [];
if(_list.length)this.curScene = _list[0]
return this.sceneList = _list;
})
},
}
}
</script>
<style lang="scss">
@import "~style/public.scss";
page{
background-color: #fff;
}
.collection-info{
padding-bottom: 0upx;
padding-bottom: calc( 0upx + constant(safe-area-inset-bottom)); /* 兼容 iOS < 11.2 */
padding-bottom: calc( 0upx + env(safe-area-inset-bottom)); /* 兼容 iOS >= 11.2 */
.ci-header{
padding: 26upx 24upx 0;
.ch-stadium{
padding-bottom: 26upx;
@include centerFlex(space-between);
.cs-txt{
flex-shrink: 0;
flex-grow: 0;
margin-right: 20upx;
font-size: 28upx;
line-height: 40upx;
color: #9c9c9f;
}
picker{
flex-grow: 1;
}
.cs-picker{
padding: 0 20upx;
height: 92upx;
border-radius: 10upx;
background-color: #f2f1f6;
@include centerFlex(space-between);
>input{
flex-grow: 1;
height: 100%;
font-size: 28upx;
color: #1a1a1a;
}
image{
flex-grow: 0;
flex-shrink: 0;
width: 28upx;
height: 28upx;
transform: rotateZ(90deg);
}
}
}
.ch-date-scene{
margin-bottom: 30upx;
@include centerFlex(space-between);
.cds-item{
flex-grow: 0;
flex-shrink: 0;
@include centerFlex(flex-start);
.ci-txt{
margin-right: 16upx;
line-height: 34upx;
font-size: 24upx;
color: #9c9c9f;
}
.ci-frame{
height: 64upx;
border-radius: 10upx;
background-color: #f2f1f6;
}
.ci-date{
padding: 0 16upx;
width: 240upx;
@include centerFlex(space-between);
>input{
flex-grow: 1;
height: 100%;
font-size: 24upx;
color: #1a1a1a;
}
>view{
flex-grow: 0;
flex-shrink: 0;
margin: 0 14upx;
height: 32upx;
width: 2upx;
background-color: #B2B2B2;
}
picker{
flex-shrink: 0;
flex-grow: 0;
image{
margin: 0;
padding: 0;
display: block;
height: 40upx;
width: 40upx;
}
}
}
.ci-scene{
.cs-picker{
}
.cp-picker-frame{
padding: 0 20upx;
width: 264upx;
@include centerFlex(space-between);
input{
flex-grow: 1;
height: 64upx;
font-size: 24upx;
color: #1a1a1a;
}
image{
flex-shrink: 0;
flex-grow: 0;
margin-left: 16upx;
height: 28upx;
width: 28upx;
}
}
}
}
}
}
.ci-tab{
@include centerFlex(center);
border-bottom: 2upx solid #D8D8D8;
.ct-item{
flex-grow: 1;
@include centerFlex(center);
>view{
position: relative;
display: inline-block;
text-align: center;
line-height: 110upx;
height: 110upx;
font-size: 32upx;
color: #9C9C9F;
&.active{
color: $themeColor;
&::after{
content: '';
display: block;
position: absolute;
left: 50%;
bottom: 0;
transform: translateX(-50%);
width: 200%;
height: 8upx;
border-radius: 4upx;
background-color: $themeColor;
}
}
}
}
}
.ci-total{
padding: 0 24upx;
line-height: 96upx;
font-size: 24upx;
color: #9C9C9F;
@include textHide(1);
>text{
color: #F6843E;
}
}
.ci-ls{
padding: 0 30upx;
.cl-item{
padding: 30upx 0;
&:not(:last-child){
border-bottom: 2upx solid #D8D8D8;
}
.ci-name{
margin-bottom: 8upx;
@include centerFlex(space-between);
>view{
font-size: 32upx;
color: #1a1a1a;
width: 50%;
@include textHide(1);
&+view{
text-align: right;
font-weight: 500;
color: #F6843E;
&.black{
color: #1A1A1A;
}
}
}
}
.ci-line{
@include centerFlex(space-between);
>view{
line-height: 34upx;
font-size: 24upx;
color: #9C9C9F;
@include textHide(1);
&+view{
flex-shrink: 0;
max-width: 50%;
}
}
}
}
}
}
</style>