freight-web/src/PagesStatistics/components/ProductDialog.vue

180 lines
4.2 KiB
Vue

<template>
<u-popup :show="show" mode="right" :closeable="true" @close="handleClose">
<view class="c-dialog-filter">
<view class="title">{{ isShipment ? "出货" : "收货" }}产品</view>
<view v-if="isShipment">
<view v-for="(item, index) in state.list" :key="index">
<view class="first-title">{{ item.shmCategoryName }}</view>
<view v-for="(cItem, cIndex) in item.childrenList" :key="cIndex">
<view class="second-title">{{ cItem.shmCategoryName }}</view>
<view class="dialog-product-layout">
<view v-if="cItem.childrenLists">
<text
v-for="(child, childIndex) in cItem.childrenLists"
:key="childIndex"
:class="{ active: state.current === child.id }"
@click="handleSelect(child)"
>{{ child.shmProductsName }}</text
>
</view>
<view v-else style="flex: auto">
<u-empty
mode="data"
icon="http://cdn.uviewui.com/uview/empty/data.png"
>
</u-empty>
</view>
</view>
</view>
</view>
</view>
<view class="dialog-product-layout" v-else>
<text
v-for="(item, index) in state.list"
:class="{ active: state.current === item.id }"
@click="handleSelect(item)"
:key="index"
>{{ isShipment ? item.shmProductsName : item.reProductsName }}</text
>
</view>
</view>
<view class="bottom">
<u-button
text="清空"
color="#E8E8E8"
:customStyle="{ color: '#999' }"
shape="circle"
@click="reset"
></u-button>
</view>
</u-popup>
</template>
<script setup lang="ts">
import { ReceiveProductApi, GoodsApi } from "@/services";
const props = defineProps<{
show: boolean;
isShipment: boolean;
}>();
const emit = defineEmits(["handleDialog", "changeProduct"]);
const handleClose = () => {
emit("handleDialog", false);
};
const reset = () => {
state.current = -1;
emit("changeProduct", { id: -1 });
emit("handleDialog", false);
};
const state = reactive<any>({
list: [],
current: -1,
});
const handleSelect = (item: any) => {
state.current = item.id;
emit("changeProduct", item);
emit("handleDialog", false);
};
const getList = () => {
if (props.isShipment) {
GoodsApi.getChildrenList().then((res) => {
if (res.code === 200) {
state.list = res.data;
}
});
} else {
ReceiveProductApi.getAllReProducts().then((res) => {
if (res.code === 200) {
state.list = res.data;
}
});
}
};
onMounted(() => {
getList();
});
</script>
<style lang="scss" scoped>
.c-dialog-filter {
width: 95vw;
padding: 25rpx;
height: 90vh;
overflow-y: scroll;
.title {
font-weight: 500;
font-size: 32rpx;
color: #000000;
text-align: center;
}
}
.first-title {
font-size: 28rpx;
font-weight: 500;
}
.second-title {
font-size: 26rpx;
font-weight: 500;
color: rgba(0, 0, 0, 0.7);
margin: 20rpx;
}
// 产品dialog
.dialog-product-layout {
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(5, 68, 37, 0.12);
border-radius: 13rpx;
margin: 30rpx 24rpx;
padding: 20rpx;
display: flex;
justify-content: flex-start;
align-items: center;
flex-flow: row wrap;
max-height: 70vh;
overflow: auto;
text {
font-weight: 400;
font-size: 26rpx;
color: #999999;
background: #ffffff;
border-radius: 6rpx;
border: 1px solid rgba(153, 153, 153, 0.64);
text-align: center;
cursor: pointer;
padding: 0rpx 20rpx;
margin-bottom: 20rpx;
margin-left: 10rpx;
margin-right: 10rpx;
}
.active {
border-color: $u-primary;
color: $u-primary;
}
}
.btn-confirm {
box-shadow: 0rpx 0rpx 10rpx 0rpx rgba(0, 56, 93, 0.12);
border-radius: 13rpx 13rpx 0rpx 0rpx;
position: absolute;
bottom: 0rpx;
width: 100%;
left: 0rpx;
padding: 27.56rpx;
.btn {
text-align: center;
::v-deep button {
width: 80%;
border-radius: 43rpx;
}
}
}
.bottom {
position: fixed;
bottom: 0;
left: 0;
margin: 30rpx;
width: calc(100% - 60rpx);
}
</style>