Files
CompanyProject/金壶/appV1/pages/shoppingCart/shoppingCart.vue
2024-09-27 01:32:49 +08:00

773 lines
20 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>
<!-- 购物车 页面 -->
<view class="content w-100 h-100">
<view class="header bg-linear-gradient x-text-white text-center">
购物车
<view class="edit_shoppingCar" @click="edit_shoppingCar()" v-if="isEdit==false">管理</view>
<view class="edit_shoppingCar" @click="edit_shoppingCar()" v-if="isEdit==true">完成</view>
</view>
<view v-if='available_goods.length<=0' align="center">
<image src="../../static/no/u/carno.png" mode="" class="noCar_img"></image>
</view>
<view class="list" v-if='available_goods.length>0'>
<view class="list_items" v-for="(item,index) in available_goods" :key="index" v-if="available_goods.length>0">
<checkbox-group class="block" style='padding:0 30upx 30upx'>
<view class=" d-flex a-center">
<view class="d-flex goods_items a-center w-100">
<view class="uni-list">
<checkbox-group @change="selected(item)">
<checkbox class="xuanzhong" :checked="item.checked" />
</checkbox-group>
</view>
<!-- <view class="box_img" @click="goodsDetail(index)">
<an-image :src="'https://'+item.pc_thumb" alt="https://ydyd-develop-file.oss-cn-hangzhou.aliyuncs.com/imageerror.jpg"></an-image>
</view> -->
<view class="box_img" @click="goodsDetail(index)" :style="{backgroundImage: 'url(' + 'https://'+item.pc_thumb + ')', backgroundSize:'contain',backgroundPosition:'center'}">
</view>
<view class="goods_txt flex-1" style="width:60%;">
<view class="font-weight d-flex a-center">
<image src="../../static/shoppingCart/xian.png" mode="" class="" style="height:30upx; width:30upx; margin-right:30upx;" v-if='item.is_limit==1'></image>
<image src="../../static/shoppingCart/re.png" mode="" style="height:30upx; width:30upx;margin-right:30upx;" v-if='item.supplier_id<=10000'></image>
<view class="textOVerFlow flex-1">{{item.name}}</view>
</view>
<view v-if='item.is_limit==1' class="x-text-159">{{item.limit_info}}</view>
<view class="x_text_hui zhuyi_title">{{item.manufacturer_name}}</view>
<view class="d-flex a-center">
<view class="x_text_hui zhuyi_title">{{item.spec_desc}}</view>
</view>
<view class="d-flex a-center">
<view class="x_text_hui">{{item.retail_flag==1?item.entirety_num:item.retail_num}}{{item.unit}}/</view>
<image src="../../static/shoppingCart/zheng.png" mode="" style="height:30upx; width:30upx;margin:0 30upx;" v-if="item.retail_flag==1" class=""></image>
<image src="../../static/shoppingCart/ling.png" mode="" style="height:30upx; width:30upx; margin:0 30upx;" v-if="item.retail_flag==0" class=""></image>
</view>
<view class="x-text-159 font-weight font_28">{{item.price}}</view>
</view>
<view class="goods_count d-flex">
<view class="bianji_cars_num bianji_cars_num bianji_cars_numJian" @click="reduce(item)">-</view>
<view class=" bianji_cars_numAdd">
<input type="number" value="" cursor-spacing="30" class=" uni-input change-w bianji_cars_num w-100 text-center" style="padding:0;" v-model="item.num"
@blur="outComputeNum(item,index)" @focus="inComputeNum(item)" @input="changeInput($event,item,index)" />
</view>
<view class="bianji_cars_num " @click="add(item)">+</view>
</view>
</view>
</view>
</checkbox-group>
<view class="line"></view>
</view>
<!-- <view class="list_items" v-for="(item,index) in inavailable_goods" :key="index" v-if="inavailable_goods.length>0">
<checkbox-group class="block" @change="changeCheckbox" style='padding:0 30upx 30upx'>
<view class=" d-flex a-center">
<view class="d-flex goods_items a-center w-100">
<view class="uni-list">
<checkbox-group @change="selected(item)">
<checkbox class="xuanzhong" :checked="item.checked" />
</checkbox-group>
</view>
<view class="box_img" @click="goodsDetail(index)">
<image :src="'https://'+item.pc_thumb" mode="" class="h-100 w-100" v-if="item.pc_thumb!=''"></image>
<image src="../../static/noimg.png" mode="" class="h-100 w-100" v-if="item.pc_thumb==''"></image>
</view>
<view class="goods_txt flex-1" @click="goodsDetail(index)">
<view class="font-weight">{{item.name}}</view>
<view class="">{{item.manufacturer_name}}</view>
<view class="">{{item.spec_desc}} &nbsp;&nbsp;&nbsp;{{item.retail_flag==1?'整':'零'}}</view>
<view class="x-text-159"> {{item.price}}</view>
</view>
<view class="goods_count d-flex">
<view class="bianji_cars_num bianji_cars_numJian" @click="reduce(item)">-</view>
<view class="bianji_cars_num bianji_cars_numAdd" style="padding:0;">{{item.num}}</view>
<view class="bianji_cars_num bianji_cars_numAdd" @click="add(item)">+</view>
</view>
</view>
</view>
</checkbox-group>
<view class="line"></view>
</view> -->
</view>
<view class="settlement shadow d-flex a-center" v-if="isEdit==false && available_goods.length>0">
<view class="all_choose">
<checkbox-group @change="selectedall()">
<checkbox class="quanxuananniu" :checked="allchecked" />全选
</checkbox-group>
</view>
<view class="x_textRight flex-1 d-flex text-right">
<view>总计:</view>
<view class="x-text-159"> {{Math.round(is_conut * 100) / 100}}</view>
<!-- <view class=""> {{totel}}</view> -->
</view>
<view class="x-bg-159 to_buy text-center x-text-white" @click="to_pay()">去结算({{jianshu}})</view>
</view>
<view class="settlement shadow d-flex a-center" v-if="isEdit==true && available_goods.length>0">
<view class="all_choose">
<checkbox-group @change="selectedall()">
<checkbox class="quanxuananniu" :checked="allchecked" />全选
</checkbox-group>
</view>
<view class="text-center add_toCollection" @click="add_collage()">移入收藏夹</view>
<view class="x-bg-159 text-center del_goods" @click="del()">删除</view>
</view>
<view class="no_list x_margin0auto" v-if="list.length>0">
<image src="../../static/shoppingCart/nopic.png" mode="" class="no_list_img"></image>
</view>
</view>
</template>
<script>
import { mapMutations, mapGetters } from 'vuex'
import HeaderTop from '../../components/HeaderTop/HeaderTop.vue'
import X_goods from '../../utils/models/goods.js'
import {
Config
} from '../../utils/config.js'
import auth from '../../utils/models/auth.js'
import anImage from '@/components/an-image/an-image'
export default {
data() {
return {
goods_num: 0, //商品当前数量
Stock: 20, //当前商品的总库存
isEdit: false, // 判断是否编辑购物车true为编辑false为不编辑
add_choose_checked: false,
list: [], // 购物车数据
isChecked: false,
checkedArr: [], //复选框选中的值
allChecked: false, //是否全选
flag: true, // 用于判断用户购物车是否有商品没有商品为true有商品为false
//cartlist: [], // 购物车商品信息
allchecked: false, //默认全选为true因为后台数据没有是否选中的信息
available_goods: '', //正常的购物车数据
inavailable_goods: '', //非正常的购物车数据(下架,失效等等)
chooseArr: [], // 被选择的商品列表的id的数组
id: '', //
batch_id: '',
goods_id: '',
collageGoods_id: '', //加入收藏夹的goods_id 的集合
result: [],
result_list: [],
jianshu: 0,
is_conut: 0, // 总计
old_num: 0,
is_next: true,
change_jiage:[]
}
},
comments: {
HeaderTop,
anImage
},
onLoad(option) {
if (option.goods_num) {
this.goods_num = option.goods_num
}
this.allchecked = false
},
onShow() {
this.is_conut = 0;
this.jianshu = 0;
this.allchecked = false;
this.shoppingCarList();
},
mounted() {
},
methods: {
...mapMutations([
'SetShopCarNums'
]),
// 监听input值的变化计算总价格
async changeInput(event, item, index) {
item.num = event.detail.value
if(item.num=='' || item.num==0 || item.num * 100 == 0){
item.num = 0
//item.checked = false
}
},
inComputeNum(item) {
this.is_next = false
this.old_num = item.num
},
async outComputeNum(item, index) {
if(item.num=='' || item.num==0 || item.num * 100 == 0){
item.num = 0
}
if (item.retail_flag == 0) { //零售
let num = Math.ceil(item.num / item.retail_num)
if (num > 0) {
item.num = num * item.retail_num
if (item.stock_num < item.num) {
uni.showToast({
title: '库存不足',
duration: 2000,
icon: 'none'
});
item.num = item.stock_num;
}
}
} else { // 整售
let num = Math.ceil(item.num / item.entirety_num)
if (num > 0) {
item.num = num * item.entirety_num
if (item.stock_num < item.num) {
uni.showToast({
title: '库存不足',
duration: 2000,
icon: 'none'
});
item.num = item.stock_num;
}
}
}
let res = await X_goods.X_update(item.id, item.num)
this.is_next = true
this.handleError(res, res => {
if(res.data.errcode == 0){
if (item.checked) {
if(this.old_num > item.num){
this.is_conut -= Number(this.old_num - item.num) * item.price
}
if(this.old_num < item.num){
this.is_conut += Number(item.num - this.old_num) * item.price
}
}
// if(item.num == 0){
// item.checked = false
// }
}
if (res.data.errcode != 0) {
item.num = this.old_num ;
uni.showToast({
title: res.data.errmsg,
duration: 2000,
icon: 'none'
});
return
}
})
},
//移入收藏夹
async add_collage() {
this.collageGoods_id = ''
this.available_goods.forEach(item => {
if (item.checked == true) {
this.collageGoods_id += item.goods_id + ','
}
})
this.collageGoods_id = this.collageGoods_id.substr(0, this.collageGoods_id.length - 1);
if (this.collageGoods_id.length <= 0) {
uni.showToast({
title: '请选择商品',
duration: 2000,
icon: 'none'
});
} else {
let res = await X_goods.X_addCollect_app(this.collageGoods_id, 1)
this.handleError(res, res => {
uni.showToast({
title: res.data.errmsg,
duration: 2000,
icon: 'none'
});
})
}
},
// 减号操作
async reduce(item) {
if (item.num < 0) {
uni.showToast({
title: '数量不得为负',
duration: 2000,
icon: 'none'
});
item.num = 0
return
}else if(item.num ==0){
// item.checked = false
return
} else {
if (item.retail_flag == 0) { //零售
// item.num -= item.retail_num
item.num = Number(item.num) - Number(item.retail_num)
if (item.checked) {
this.is_conut -= Number(item.retail_num) * item.price
}
} else { // 整售
// item.num -= item.entirety_num
item.num = Number(item.num) - Number(item.entirety_num)
if (item.checked) {
this.is_conut -= Number(item.entirety_num) * item.price
}
}
if (item.num < 0) {
item.num = 0
uni.showToast({
title: '数量不得为负',
duration: 2000,
icon: 'none'
});
} else {
let res = await X_goods.X_update(item.id, item.num)
// this.shoppingCarList();
this.handleError(res, res => {
if (res.data.errcode != 0) {
if (item.retail_flag == 0) { //零售
item.num += item.retail_num
if (item.checked) {
this.is_conut += Number(item.retail_num) * item.price
}
} else { // 整售
item.num += item.entirety_num
if (item.checked) {
this.is_conut += Number(item.entirety_num) * item.price
}
}
uni.showToast({
title: res.data.errmsg,
duration: 2000,
icon: 'none'
});
return
}
})
}
}
},
// 加号操作
async add(item) {
if (item.stock_num <= this.goods_num) {
uni.showToast({
title: '库存不足',
duration: 2000,
icon: 'none'
});
this.goods_num = item.stock_num;
} else {
if (item.retail_flag == 0) { //零售
item.num = Number(item.num) + Number(item.retail_num)
if (item.checked) {
this.is_conut += Number(item.retail_num) * item.price
}
} else { // 整售
item.num = Number(item.num) + Number(item.entirety_num)
if (item.checked) {
this.is_conut += Number(item.entirety_num) * item.price
}
}
let res = await X_goods.X_update(item.id, item.num)
this.handleError(res, res => {
if (res.data.errcode != 0) {
if (item.retail_flag == 0) { //零售
item.num -= item.retail_num
if (item.checked) {
this.is_conut -= Number(item.retail_num) * item.price
}
} else { // 整售
item.num -= item.entirety_num
if (item.checked) {
this.is_conut -= Number(item.entirety_num) * item.price
}
}
uni.showToast({
title: res.data.errmsg,
duration: 2000,
icon: 'none'
});
return
}
})
}
},
// 删除单挑购物车商品
async del() {
this.chooseArr = []
this.available_goods.forEach(item => {
if (item.checked == true) {
this.chooseArr.push(item.id)
}
})
if (this.chooseArr.length <= 0) {
uni.showToast({
title: '请选择商品',
duration: 2000,
icon: 'none'
});
} else {
let res = await X_goods.X_delCar(this.chooseArr)
this.isEdit = !this.isEdit;
this.handleError(res, res => {
uni.showToast({
title: res.message,
duration: 2000,
icon: 'none'
});
this.is_conut = 0;
this.jianshu = 0;
this.shoppingCarList();
})
}
},
// 单个商品前的勾选
selected(item) {
// if(item.num==0){
// // item.checked =false
// }else{
// }
item.checked = !item.checked
if (!item.checked) {
this.allchecked = false
this.jianshu--
this.is_conut -= (item.price * item.num)
} else {
this.jianshu++
this.is_conut += (item.price * item.num)
const test = this.available_goods.every(item => {
return item.checked === true
})
if (test) {
this.allchecked = true
} else {
this.allchecked = false
}
}
},
// 全选按钮
selectedall() {
this.jianshu = 0;
this.is_conut = 0;
if (this.available_goods.length <= 0) {
return
} else {
this.allchecked = !this.allchecked
if (this.allchecked) {
this.available_goods.map(item => {
item.checked = true
this.is_conut += item.price * item.num
// this.is_conut++
})
this.jianshu = this.available_goods.length
} else {
this.available_goods.map(item => {
item.checked = false
})
}
}
},
//去结算 X_orderPreview
async to_pay() {
if (!this.is_next) {
return
}
this.goods_id = ''
for (let i = 0; i < this.available_goods.length; i++) {
if (this.available_goods[i].checked == true) {
if(this.available_goods[i].num==0){
uni.showToast({
title: '请选择商品数量',
duration: 2000,
icon: 'none'
});
return
}else{
this.goods_id += this.available_goods[i].id + ','
}
}
}
this.goods_id = this.goods_id.substr(0, this.goods_id.length - 1);
if (this.goods_id.length <= 0) {
} else {
this.goodid();
this.is_checkAuth()
// if (this.the_checkAuth == 'finish') {
// uni.navigateTo({
// url: './sureOrder?goods_id=' + this.goods_id
// })
// }
}
},
goodid(){
this.$store.commit('goodid',this.goods_id)
},
//checkAuth 检测用户是否完成认证
async is_checkAuth() {
let res = await auth.checkAuth()
this.the_checkAuth = res.data
if (res.data != 'finish') {
if (res.data == 'auditing') {
uni.showToast({
title: '您的企业认证正在审核中!',
duration: 2000,
icon: 'none'
});
} else {
uni.showModal({
title: '提示',
content: '请先完成认证',
success: function(res) {
if (res.confirm) {
uni.redirectTo({
url: '../auth/baisc'
})
} else if (res.cancel) {
}
}
});
}
} else {
uni.navigateTo({
url: './sureOrder?goods_id=' + this.goods_id
})
}
this.handleError(res, res => {
})
},
// 购物车列表
async shoppingCarList() {
this.available_goods = []
let res = await X_goods.x_shoppingCar()
// if (res.code == 40000) {
// uni.navigateTo({
// url: './x_login'
// })
// }
this.handleError(res, res => {
if (res.data == '') {
} else {
this.available_goods = res.data.data.available_goods;
this.SetShopCarNums(this.available_goods.length)
// Config.shooppingCar_num = this.available_goods.length
// this.inavailable_goods = res.data.data.inavailable_goods
this.available_goods.map(item => {
item.checked = false
})
}
})
},
// 管理购物车
edit_shoppingCar() {
this.isEdit = !this.isEdit
},
// 进入商品详情页
goodsDetail(index) {
if (this.isEdit == false) {
if (this.available_goods[index].price_id) {
uni.navigateTo({
url: './goodsDetail?sku_id=' + this.available_goods[index].price_id + '&goods_num=' + this.available_goods[
index].num
})
}
}
},
// 登录
to_login() {
uni.navigateTo({
url: 'x_login'
});
}
}
}
</script>
<style lang="scss">
.content {
.header {
height: 148upx;
font-size: 32upx;
position: relative;
line-height: 194upx;
.edit_shoppingCar {
position: absolute;
bottom: -48upx;
right: 31upx;
}
}
.noCar_img {
height: 238upx;
width: 350upx;
margin-top: 100upx;
}
.cartlist {
background-color: #999999;
padding: 10px;
.cartitem {
background-color: #FFFFFF;
height: 50px;
margin-bottom: 10px;
.xuanzhong {
float: left;
line-height: 50px;
padding-left: 5px;
}
image {
display: inline-block;
height: 40px;
width: 40px;
padding: 5px 0;
float: left;
}
.itemright {
display: inline-block;
padding: 5px;
.del {
margin-left: 10px;
background-color: red;
color: #FFFFFF;
border-radius: 3px;
padding: 0 5px;
}
}
}
}
.list {
height: calc(100% - 248upx);
overflow-y: auto;
.list_items {
.box_img {
height: 153.3upx;
// width: 270upx;
width:40%;
padding: 10upx 20upx;
margin: 0 10upx;
overflow: hidden;
background-repeat: no-repeat;
}
.goods_items {
position: relative;
.goods_count {
position: absolute;
bottom: -14upx;
right: 8upx;
.change-w{
width:65upx;
}
.bianji_cars_num{
background: #FBFBFB;
}
.bianji_cars_numAdd{
margin-left: 2upx;
margin-right: 2upx;
}
}
}
.line {
height: 4upx;
background-color: #F2F2F2;
}
}
}
.no_list {
margin-top: 315upx;
text-align: center;
.no_list_img {
height: 198upx;
width: 395upx;
}
}
.settlement {
height: 100upx;
.all_choose {
width: 30%;
margin-left: 30upx;
}
.to_buy {
line-height: 100upx;
width: 260upx;
min-width: 224.6upx;
font-size: 34upx;
}
.add_toCollection {
border: 1upx solid #EDCA4A;
border-radius: 30upx;
height: 60upx;
line-height: 60upx;
width: 198.8upx;
color: #EDCA4A;
margin: 0 22px 0 30px;
}
.del_goods {
border: 1upx solid #EB5159;
border-radius: 30upx;
height: 60upx;
line-height: 60upx;
width: 150upx;
color: #EB5159;
border: 1upx solid #EB5159;
background-color: #FFFFFF;
}
}
}
</style>