glhcp/business/pages/goods_manage/goods_manage.vue

292 lines
11 KiB
Vue
Raw Normal View History

2023-08-10 06:59:52 +00:00
<template>
<view class="">
<!-- Header -->
<view class="header bg-white">
<u-search placeholder="输入商品名称" @change="change(current)" :show-action="false" v-model="keyword"></u-search>
</view>
<!-- Nav -->
<view class="nav bg-white">
<u-tabs name="name" :show-bar="false" :list="list" :is-scroll="true" :current="current" @change="change"
active-color="#40AFFA" />
</view>
<!-- Section -->
<view class="section" :style="{'height': height}">
<swiper :duration="400" style="height: 100%; overflow: hidden;" @change="change" :current="current">
<swiper-item v-for="(items, index) in list" :key="index">
<view v-show="index == current">
<mescroll-uni ref="mescrollRef" bottom="220rpx" height="100%" @init="mescrollInit"
@up="upCallback" :up="upOption" @down="downCallback">
<view class="title muted sm">
{{ count }}件商品
</view>
<block v-for="(item2, index2) in items.lists" :key="index2">
<goods-card :data="item2">
<template v-if="btns.recycle_btn">
<button class="btn hollow br60 flex row-center normal"
@click="openFunc(item2, 'recycle')">移至回收站</button>
</template>
<template v-if="btns.edit_btn">
<router-link :to="'/bundle/pages/spec_edit/spec_edit?id='+item2.id">
<button class="btn hollow br60 flex row-center normal">编辑</button>
</router-link>
</template>
<template v-if="btns.delete_btn">
<button class="btn hollow br60 flex row-center normal"
@click.stop="openFunc(item2, 'del')">删除</button>
</template>
<template v-if="current==0">
<button class="btn solid br60 flex row-center normal"
@click.stop="openFunc(item2, 'off_shelf')">下架</button>
</template>
<template v-if="current==1">
<button class="btn solid br60 flex row-center normal"
@click.stop="openFunc(item2, 'on_shelf')"
style="background: #40AFFA;">上架</button>
</template>
<template v-if="btns.warehouse_btn">
<button class="btn solid br60 flex row-center normal"
@click.stop="openFunc(item2, 'warehouse')"
style="background: #40AFFA;">放入仓库</button>
</template>
</goods-card>
</block>
</mescroll-uni>
</view>
</swiper-item>
</swiper>
</view>
<modal height="200rpx" v-model="off_shelf" @confirm="goodsSetting">
<view class="black nr" style="height: 200rpx;">
确认下架<text style="color:#FF4141;">{{curData.name}}</text>
</view>
</modal>
<modal height="200rpx" v-model="on_shelf" @confirm="goodsSetting">
<view class="black nr" style="height: 200rpx;">
确认上架<text style="color:#FF4141;">{{curData.name}}</text>
</view>
</modal>
<modal height="200rpx" v-model="del" @confirm="goodsSetting">
<view class="black nr" style="height: 200rpx;">
确认删除<text style="color:#FF4141;">{{curData.name}}</text>
</view>
</modal>
<modal height="200rpx" v-model="recycle" @confirm="goodsSetting">
<view class="black nr" style="height: 200rpx;">
确认移至回收站<text style="color:#FF4141;">{{curData.name}}</text>
</view>
</modal>
<modal height="200rpx" v-model="warehouse" @confirm="goodsSetting">
<view class="black nr" style="height: 200rpx;">
确认放入仓库<text style="color:#FF4141;">{{curData.name}}</text>
</view>
</modal>
<u-toast ref="uToast" />
</view>
</template>
<script>
import MescrollMixin from "@/components/mescroll-uni/mescroll-mixins.js";
import {
apiGoodsLists,
apiGoodsOperation
} from '@/api/goods'
import {
debounce
} from "@/utils/tools.js"
export default {
mixins: [MescrollMixin],
data() {
return {
height: '100%',
keyword: '',
list: [{
name: '销售中',
type: 1,
lists: []
},
{
name: '仓库中',
type: 2,
lists: []
},
{
name: '库存预警',
type: 3,
lists: []
},
{
name: '回收站',
type: 4,
lists: []
},
{
name: '待审核',
type: 5,
lists: []
},
{
name: '未通过',
type: 6,
lists: []
}
],
current: 0,
count: 0,
action: '',
curData: {},
btns: {},
off_shelf: false, //下架
on_shelf: false, // 上架
del: false, //删除
recycle: false, //回收站
warehouse: false, //放入仓库
upOption: {
empty: {
icon: '/static/images/empty/shop.png',
tip: '暂无商品!', // 提示
fixed: true,
top: "200rpx",
}
}
}
},
async onShow() {
// 使用防抖是为了防止v-show的时候出发多条数据所以使用防抖触发多次的时候可以只成为触发一次优化性能请求
this.upCallback = debounce(this.upCallback, 200, this)
this.$nextTick(() => {
this.$refs.mescrollRef[this.current].mescroll.resetUpScroll()
})
uni.getSystemInfo({
success: (res) => {
this.height = res.windowHeight - 107 + 'px';
}
});
},
methods: {
change(event) {
let index;
event.detail ? index = event.detail.current : index = event
this.current = Number(index)
this.$refs.mescrollRef[this.current].mescroll.resetUpScroll()
},
async upCallback(page) {
const index = this.current;
const pageNum = page.num
const pageSize = page.size
apiGoodsLists({
name: this.keyword,
type: this.list[index].type,
page_no: pageNum,
page_size: pageSize,
}).then(({
lists,
page_size,
btns,
more,
count,
}) => {
// 如果是第一页需手动置空列表
if (pageNum == 1 || this.keyword) this.list[index].lists = []
// 重置列表数据
this.btns = btns;
this.count = count;
const hasNext = !!more;
this.list[index].lists = [...this.list[index].lists, ...lists]
this.$refs.mescrollRef[index].mescroll.endSuccess(lists.length, hasNext);
}).catch((err) => {
console.log(err)
this.mescroll.endErr()
})
},
openFunc(item, action) {
this.curData = item;
this.action = action;
this[action] = true;
},
// 操作商品
async goodsSetting() {
let id = this.curData.id,
action = this.action == 'del' ? 'delete' : this.action
await apiGoodsOperation({
action,
id
})
this.$refs.mescrollRef[this.current].mescroll.resetUpScroll()
this.$refs.uToast.show({
title: '操作成功',
type: 'success'
})
}
}
}
</script>
<style lang="scss">
/*根元素需要有固定的高度*/
page {
height: 100%;
box-sizing: border-box;
.header {
padding: 16rpx 30rpx;
}
.nav {
padding: 15rpx 0;
}
.section {
overflow: hidden;
.title {
padding: 20rpx;
}
.btn {
margin-top: 20rpx;
margin-left: 20rpx;
width: 180rpx;
height: 64rpx;
// border-radius: 8rpx;
font-size: $-font-size-sm;
}
.solid {
color: $-color-white;
background-color: #FF4141;
}
.hollow {
color: $-color-lighter;
border: 1px solid #DBDBDB;
}
}
}
</style>