statement.vue 5.35 KB
<template>
	<view class="statement-view">
		<u-navbar back-icon-color="#333333" background="#F4F5F7" title="收入流水" titleColor="#333333"
			:border-bottom="false" title-bold></u-navbar>
		<view class="statement-conten">
			<view class="statement-content-view">
				<view class="head-view">
					<view class="head-top-view">
						<picker mode="date" :value="date" fields="month" @change="bindDateChange" :end="endTime">
						    <view class="date-input">
								<text class="date-text">{{date}}</text>
								<u-icon name="arrow-down"></u-icon>
							</view>
						</picker>
					</view>
					<view class="head-bottom-view">
						<view v-for="(value, key) in items" :key="key" class="head-amount-view">
							<view><text>{{value}}</text></view>
							<view class="head-amount-text"><text>{{info[key]}}</text></view>
						</view>
					</view>
				</view>
				<image :src="liushuibeijingImage" class="head-back-image" mode="widthFix"></image>
				<view class="list-view"  v-if="hasInfo">
					<view class="u-flex u-row-center" v-if="loading">
						<u-gap height="20"></u-gap>
						<u-loading color="#2272FF" :show="loading"></u-loading>
					</view>
					<view v-else v-for="(item, index) in data.statementList" :key="index">
						<Statement :data="item" @click="handleClickCell"></Statement>
					</view>
				</view>
				<view class="list-view-empty" v-else>
					<u-image class="empty-image" :src="banner" width="374" height="246" mode="widthFix" :fade="true" duration="450">
						<u-loading slot="loading"></u-loading>
						<view slot="error" style="font-size: 24rpx;">加载失败</view>
					</u-image>
					<text class="desc">本月没有流水信息</text>
				</view>
			</view>
		</view>
	</view>
</template>

<script>
	let now = new Date(new Date().toLocaleDateString()).getTime();
	const baseinfo = {expectedAmount: 0, settledAmount: 0, statementList: []}
	import Statement from "@/components/mine/statement.vue"
	export default {
		components: {
			Statement
		},
		data() {
			return {
				data: {
					expectedAmount: 0,
					settledAmount: 0,
					statementList: []
				},
				date: '2021-05',
				params: {
					starDate: null,
					endDate: null,
				},
				loading: true,
			}
		},
		computed: {
			info() {
				return {
					...this.data,
					number: this.data.statementList.length
				}
			},
			endTime() {
				this.moment().format('YYYY-MM-DD')
			},
			items() {
				return {
					expectedAmount: '预结(元)',
					settledAmount: '已确认(元)',
					number: '订单数(单)',
				}

			},
			liushuibeijingImage() {
				return this.imageUrl + 'liushuibeijing.png'
			},
			imageUrl() {
				return process.uniEnv.qn_base_url
			},
			banner() {
				return this.imageUrl + 'receipt.png'
			},
			hasInfo() {
				return this.loading || this.data.statementList && this.data.statementList.length
			},
		},
		onLoad() {
			getApp().trackPage('收入流水列表页')
			this.loadStatement()
		},
		methods: {
			bindDateChange: function(e) {
			   this.date = e.target.value
			   this.loadStatement()
			},
			handleClickCell(orderId) {
				
				uni.navigateTo({
					url: 'pages/order/detail?isFromMine=1&id=' + orderId
				})
			},
			async loadStatement() {
				let self = this
				self.loading = true
				let startTime = self.moment(self.date).format('YYYY-MM-DD')
				let endTime = self.moment(self.date).endOf('month').format('YYYY-MM-DD')
				self.params.starDate = startTime
				self.params.endDate = endTime
				let res = await self.$u.api.listStatement(self.params)
				self.loading = false
				if(res && res.code == 200) {
					let data = res.data
					self.data.settledAmount = data && data.settledAmount || 0
					self.data.expectedAmount = data && data.expectedAmount || 0
					self.data.statementList = data && data.orderList || []
				}
			},
		}
	}
</script>

<style lang="scss" scoped>
	.statement-view {
		display: flex;
		flex-direction: column;
		height: 100vh;
		background-color: #F4F5F7;
		.statement-conten {
		overflow: auto;

		.statement-content-view {
			margin: 10rpx 30rpx 30rpx 30rpx;
			border-radius: 12rpx;
			position: relative;
			
			border-radius: 12rpx;
			background-color: #FFFFFF;
				.head-back-image {
					position: relative;
					width: 100%;
					z-index: 0;
				}

			.head-view {
				z-index: 1;
				padding: 30rpx;
				color: #FFFFFF;
				
				position: absolute;
					width: 100%;

				.head-top-view {
					margin-top: 10rpx;
					margin-bottom: 50rpx;
					.date-input {
						.date-text {
							padding-right: 10rpx;
							font-size: 28rpx;
						}
					}
				}

				.head-bottom-view {
					
					display: flex;
					align-items: flex-start;
					justify-content: space-between;

					.head-amount-view {
						font-size: 24rpx;

						.head-amount-text {
							font-size: 40rpx;
							margin-top: 10rpx;
						}
					}
				}
			}
			.list-view {
				position: relative;
				z-index: 1;
				padding-bottom: 20rpx;
			}
			.list-view-empty {
				position: relative;
				z-index: 1;
				height: 680rpx;
				display: flex;
				flex-direction: column;
				align-items: center;
				margin-top: 142rpx;
				.empty-image {
					width: 376rpx;
				}
				.desc {
					margin-top: 48rpx;
					font-size: 28rpx;
					font-weight: 400;
					color: #666666;
					line-height: 40px;
				}
			}
		}
		}
	}
</style>