Files
dvcp_v2_wechat_app/src/mods/AppCreditPoints/supermarket.vue
2022-02-15 11:42:13 +08:00

452 lines
10 KiB
Vue
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<template>
<div class="page">
<div class="supermarket">
<div class="fixed-top title" @click="$linkTo(`./system?areaName=${areaName}`)"
v-if="propAreaId == '341021104000'">{{ areaName }}信用好超市管理制度点击查看 >>
</div>
<div class="goods-list" v-if="numList.length"
:style="propAreaId == '341021104000' ? 'padding-top:80rpx' : 'padding-top: 0;'">
<div class="left">
<div
:class="numIndex == index ? 'item active' : 'item'"
v-for="(item, index) in numList"
:key="index"
@click="numClick(index)">
<i v-show="item.total > 0">{{ item.total }}</i>
{{ item.type }}分区
</div>
</div>
<div class="right">
<div class="item" v-for="(item, index) in goodsList[numIndex]" :key="index">
<img :src="item.photo[0].url" alt="">
<div class="item-info">
<p class="item-name">{{ item.merchandiseName }}</p>
<div class="item-point"><span class="num">{{ item.costIntegral }}</span>积分</div>
<div class="item-bottom">
<div></div>
<div class="item-bottom__right">
<image v-show="item.num > 0" @click="cut(numIndex, index)" src="/static/img/cut.png"/>
<input v-show="item.num > 0" v-model="item.num">
<image src="/static/img/add.png" @click="add(numIndex, index)"/>
</div>
</div>
</div>
</div>
</div>
</div>
<AiEmpty v-else/>
<div class="goods-footer" v-if="numList.length">
<div class="goods-footer__top">
<h2>{{ userInfo.familyName || user.nickName }}{{ userInfo.familyName ? '家' : '' }}</h2>
<span>剩余积分:{{ userInfo.familyIntegral || 0 }}</span>
</div>
<div class="goods-footer__bottom">
<div class="goods-footer__bottom__left">
<h3>{{ total }}件商品</h3>
<div class="goods-footer__bottom--middle">
<span>合计 </span>
<i>{{ money }}</i>
<em>积分</em>
</div>
</div>
<div class="goods-footer__bottom--btn" @click="toOrder" hover-class="text-hover">去结算</div>
</div>
</div>
</div>
</div>
</template>
<script>
import {mapState} from 'vuex'
export default {
name: 'supermarket',
data() {
return {
numList: [],
numIndex: 0,
goodsList: [],
areaId: '',
userInfo: {},
areaName: '',
propAreaId: ''
}
},
computed: {
...mapState(['global', 'user', 'token']),
total() {
let total = 0
if (!this.numList.length) {
return total
}
this.numList.forEach(item => {
total = item.total + total
})
return total
},
money() {
let money = 0
if (!this.goodsList.length) {
return money
}
this.goodsList.forEach(arr => {
arr.forEach(item => {
money = money + Number(item.num) * item.costIntegral
})
})
return money
}
},
onLoad() {
this.propAreaId = this.$areaId
uni.$on('update', () => {
this.getInfo()
})
if (uni.getStorageSync('areaId')) {
this.areaId = uni.getStorageSync('areaId')
}
this.getUserInfo()
this.getInfo()
},
onShow() {
this.getUserInfo()
},
methods: {
getInfo() {
this.$instance.post(`/admin/area/queryAreaByAreaid?id=${this.areaId}`, null, {}).then(res => {
if (res.code === 0) {
if (res.data) {
this.areaName = res.data.name
this.getList()
}
}
})
},
getUserInfo() {
this.$instance.post(`/app/appresident/queryFamilyById?id=${this.user.residentId}`, null, {}).then(res => {
if (res.code === 0) {
this.userInfo = res.data
}
})
},
toOrder() {
if (this.user.status == 0) {
if (!this.user.phone) {
return this.$linkTo('/pages/phone/bingPhoneNumber?from=auth')
} else {
return this.$linkTo('/pages/auth/authenticationInfo')
}
}
if (!this.total) {
return this.$toast('请选择商品')
}
if (this.money > this.userInfo.familyIntegral) {
return this.$toast('积分不足')
}
let goods = []
this.goodsList.forEach(arr => {
arr.forEach(item => {
if (item.num) {
goods.push(item)
}
})
})
this.$linkTo(`./submitOrder?familyId=${this.userInfo.familyId}&userName=${this.userInfo.familyName}&memberId=${this.userInfo.memberId}&goods=${JSON.stringify(goods)}&total=${this.total}&money=${this.money}&familyIntegral=${this.userInfo.familyIntegral}`)
},
getList() {
this.$instance.post(`/app/appvillagerintegralmerchandise/listByIntegral?areaId=${this.areaId}`, null, {}).then(res => {
if (res.code === 0) {
if (res.data) {
this.numList = Object.keys(res.data).map(item => {
return {
type: item,
total: 0
}
})
this.goodsList = Object.values(res.data).map((item) => {
item.map((items) => {
items.num = 0
items.photo = JSON.parse(items.photo)
return items
})
return item
})
}
}
})
},
add(index, i) {
this.$set(this.goodsList[index][i], 'num', Number(this.goodsList[index][i].num) + 1)
let total = 0
this.goodsList[index].forEach(item => {
total = total + item.num
})
this.$set(this.numList[index], 'total', total)
},
cut(index, i) {
this.$set(this.goodsList[index][i], 'num', Number(this.goodsList[index][i].num) - 1)
let total = 0
this.goodsList[index].forEach(item => {
total = total + item.num
})
this.$set(this.numList[index], 'total', total)
},
numClick(index) {
this.numIndex = index
}
},
}
</script>
<style scoped lang="scss">
@import "../../common/common.scss";
.item-bottom {
display: flex;
align-items: center;
justify-content: space-between;
margin-top: 28px;
.item-bottom__right {
display: flex;
align-items: center;
height: 60px;
}
image {
width: 27px;
height: 27px;
}
input {
width: 90px;
height: 60px;
padding: 020px;
margin: 010px;
background: #F6F6F6;
border-radius: 10px;
font-size: 26px;
color: #666;
text-align: center;
}
}
.goods-footer {
position: fixed;
left: 0;
bottom: 0;
z-index: 111;
width: 100%;
background: #fff;
.goods-footer__top {
display: flex;
align-items: center;
justify-content: space-between;
height: 80px;
padding: 030px;
background: #EFF4FF;
color: #333333;
font-size: 32px;
}
.goods-footer__bottom--btn {
width: 212px;
height: 104px;
line-height: 104px;
font-size: 36px;
color: #fff;
text-align: center;
background: #197DF0;
}
.goods-footer__bottom__left {
display: flex;
align-items: center;
justify-content: space-between;
flex: 1;
padding: 0 32px;
h3 {
color: #F94246;
font-size: 32px;
}
.goods-footer__bottom--middle {
display: flex;
align-items: baseline;
span {
color: #F94246;
font-size: 32px;
}
i {
position: relative;
top: 2px;
margin-right: 12px;
color: #FA444B;
font-size: 40px;
}
em {
color: #F94246;
font-size: 24px;
}
}
}
.goods-footer__bottom {
display: flex;
align-items: center;
justify-content: space-between;
height: 104px;
}
}
.page {
width: 100%;
background-color: #fff;
.supermarket {
height: 100%;
overflow-y: hidden;
.title {
width: 100%;
height: 80px;
line-height: 80px;
background: #EFF4FF;
padding-left: 30px;
color: #3A7EE2;
font-size: 28px;
}
.goods-list {
// padding-top:80px; padding-bottom: 184px;
height: 100%;
box-sizing: border-box;
overflow-y: hidden;
.left {
width: 168px;
height: 100%;
overflow-y: scroll;
overflow-x: hidden;
float: left;
background: #FAF9FB;
.item {
display: flex;
align-items: center;
justify-content: center;
position: relative;
width: 100%;
height: 104px;
line-height: 1.1;
border-bottom: 2px solid #D8E5FF;
text-align: center;
color: #333;
font-size: 28px;
border-left: 6px solid #FAF9FB;
i {
position: absolute;
right: 8px;
top: 8px;
height: 28px;
line-height: 28px;
padding: 012px;
color: #fff;
font-size: 20px;
border-radius: 13px;
background: #FB4E44;
}
}
.active {
border-left: 6px solid #1D58FE;
background: linear-gradient(270deg, #FFFFFF 0%, #FFFFFF 77%, #E7EAFA 100%);
}
}
.right {
float: left;
width: calc(100% - 168px);
height: 100%;
overflow-y: scroll;
.item {
width: 100%;
padding: 28px 30px 44px;
box-sizing: border-box;
img {
width: 192px;
height: 192px;
border: 2px solid #D7D5D5;
}
.item-info {
display: inline-block;
width: 276px;
padding-left: 30px;
vertical-align: top;
.item-name {
width: 100%;
word-break: break-all;
line-height: 42px;
margin-bottom: 30px;
font-size: 30px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
}
.item-point {
font-size: 24px;
font-family: PingFangSC-Medium, PingFang SC;
font-weight: 500;
color: #FA4A51;
line-height: 34px;
.num {
font-size: 40px;
font-family: PingFangSC-Semibold, PingFang SC;
font-weight: 600;
margin-right: 8px;
}
}
}
}
}
}
}
}
</style>