goodsSearch.vue 7.4 KB
<!-- 物品类型弹窗页面 -->
<template>
	<view class="goodsSearch">
		<!-- 头部 -->
		<view class="searchBox-title">
			<view class="title">
				物品名称
				<view class="label"></view>
			</view>
			<view class="stopSend" @click="openForbidGoodsDialog">
				禁寄物品
				<view class="gantanhao"></view>
			</view>
		</view>
		<!-- 搜索框 -->
		<view class="seachBox" v-if="!isSelectedGoods">
			<uni-search-bar :cancelButton='isFocus && searchValue?"none":"auto"' :focus="isFocus" placeholder="请输入搜索内容"
				v-model="searchValue" @blur="blur" @focus="focus" @input="input" @cancel="cancel" @clear="clear">
				<template v-slot:searchIcon>
					<view class="search-icon"></view>
				</template>
			</uni-search-bar>
			<view class="search-btn" @click="userDefined" v-if="searchValue && isFocus">确定</view>
		</view>

		<!-- 最近寄件 -->
		<view class="recent-send-goods" v-if='!isSelectedGoods && recentSendList.data.length && !isInput'>
			<view class="title">最近寄件</view>
			<view class="recent-send-list">
				<view class="recent-send-item" v-for="(item,index) in recentSendList.data" :key='index'
					@click="handleClick(item)">
					{{item.name}}{{item.goodsType?'('+item.goodsType.name+')':''}}
				</view>
			</view>
		</view>
		<!-- 选择的物品 -->
		<view class="selected-goods" v-if="isSelectedGoods">
			<view class="goods" @click.prevent="handleSelectedGoods">
				<image src='../../../static/shanchu-after.png' @click.stop="handleCancelGood"></image>
				{{goods.info.name}}{{goods.info.goodsType?'('+goods.info.goodsType.name+')':""}}
			</view>


		</view>

		<!-- 热门寄件 -->
		<view class="hot-send-goods" v-if='!isSelectedGoods && !isInput && isFocus'>
			<view class="title">热门寄件</view>
			<view class="recent-send-list">
				<view class="recent-send-item" v-for="(item,index) in hotSendList.data" :key='index'
					@click="handleClick(item)">
					{{item.name}}{{item.goodsType?'('+item.goodsType.name+')':''}}
				</view>
			</view>
		</view>

		<!-- 模糊查询出的列表 -->
		<view class="search-list" v-if="isInput">
			<view class="seatch-list-item" @click="handleClick(item)" v-for="(item,index) in dimSearchList.data"
				:key="index">
				<view class="label">{{item.name}}</view>
				<view class="classify">{{item.name}}{{item.goodsType?'('+item.goodsType.name+')':''}}</view>
			</view>
		</view>

		<!-- 禁寄物品弹窗 -->
		<uni-popup ref="popup" type="bottom" :safe-area="false">
			<view class="title">禁止寄递物品目录</view>
			<view class="content">
				1.枪支(含仿制品、主要零部件)弹药。
			</view>
			<view class="content">
				2.管制器具。如匕首、三棱刮刀、带有自锁装置的弹簧刀(跳刀)、弩、催泪器等。
			</view>
			<view class="content">
				3.爆炸物品。如炸药、雷管、导火索、烟花、鞭炮、摔炮、拉炮、砸炮等。
			</view>
			<view class="content">
				4.压缩和液化气体及其容器。如氢气、甲烷、乙烷、乙炔、打火机、氯气、压缩氧气、氮气等。
			</view>
			<view class="content">
				5.易燃液体。如汽油、柴油、煤油、桐油、丙酮、乙醚、油漆、生漆、苯、酒精、松香油等。
			</view>
			<view class="content">
				6.易燃固体、自燃物质、遇水易燃物质。如红磷、硫磺、固体酒精、火柴、活性炭等。
			</view>
			<view class="content">
				7.氧化剂和过氧化物。如高锰酸盐、高氯酸盐、氧化氢、双氧水等。
			</view>
			<view class="content">
				8.毒性物质。如砷、砒霜、汞化物、铊化物、氰化物、硒粉、苯酚、汞、剧毒农药等。
			</view>
			<view class="content">
				9.生化制品、传染性、感染性物质。如病菌、炭疽、寄生虫、排泄物、医疗废弃物、尸骨、动物器官等。
			</view>
			<view class="content">
				10.放射性物质。如铀、钴、镭、钚等。
			</view>

			<view class="btn" @click="closeForbidGoodsDialog">知道了</view>
		</uni-popup>
	</view>
</template>

<script setup>
	import {
		ref,
		reactive,
		onMounted,
	} from 'vue';
	import {
		usualGoodsList,
		goodsList
	} from '@/pages/api/order.js'
	import {
		useStore
	} from 'vuex';
	const store = useStore(); //vuex获取、储存数据
	const users = store.state.user
	const emits = defineEmits(["@getGoodsInfo"]);
	const props = defineProps({
		isShowOther: {
			type: Function,
			required: true
		},
	})
	const goods = reactive({
		info: {}
	})
	const isSelectedGoods = ref(false) //是否选择了物品
	const popup = ref()
	const searchValue = ref('')
	const isFocus = ref(false) //是否搜索框为聚焦状态
	const isInput = ref(false) //是否搜索框为输入状态
	const isUpload = ref(true) //是否输入框加载完毕
	//模糊查询出的列表数据
	const dimSearchList = reactive({
		data: []
	})
	//热门寄件物品
	const hotSendList = reactive({
		data: []
	})

	const recentSendList = reactive({
		data: [],
	})

	onMounted(() => {
		getData()
	})

	const getData = () => {
		usualGoodsList({
			name: ''
		}).then((res) => {
			if (res.data) {
				hotSendList.data = res.data.slice(0, 6)
			}
		}).catch((err) => {
			uni.showToast({
				title: '网络异常',
				duration: 2000,
				icon: 'none'
			});
		})
		isSelectedGoods.value = users.goodsInfo.name
		if (isSelectedGoods.value) goods.info = users.goodsInfo

		goodsList().then((res) => {
			if (res.data) {
				recentSendList.data = res.data.slice(0, 5)
			}
		}).catch((err) => {
			uni.showToast({
				title: '网络异常',
				duration: 2000,
				icon: 'none'
			});
		})
	}
	const handleSelectedGoods = () => {
		searchValue.value = goods.info.name
		isFocus.value = true
		isInput.value = true
		isSelectedGoods.value = false
		dimSearch(searchValue.value)
		props.isShowOther(true, 'always')
	}
	//模糊查询列表数据
	const dimSearch = (key) => {
		if (!isUpload.value) return
		isUpload.value = false
		usualGoodsList({
			name: key
		}).then((res) => {
			dimSearchList.data = res.data
			isUpload.value = true
		})
	}

	const input = (e) => {
		isFocus.value = e ? true : false
		isInput.value = Boolean(e)
		if (!isUpload.value) return
		searchValue.value = e
		dimSearch(e)
		props.isShowOther(e ? true : false)
	}
	const cancel = () => {
		isInput.value = false
		props.isShowOther(false)
	}
	const clear = () => {
		props.isShowOther(true)
	}
	const blur = () => {
		console.log('blur')
	}
	const focus = () => {
		isFocus.value = true
		props.isShowOther(true)
	}

	//用户自定义的物品
	const userDefined = () => {
		goods.info = {
			name: searchValue.value
		}
		isSelectedGoods.value = Boolean(searchValue.value)
		props.isShowOther(false)
		emits('getGoodsInfo', {
			name: searchValue.value
		})
		isFocus.value = false
	}
	//取消物品选择
	const handleCancelGood = () => {
		goods.info = {}
		store.commit('user/setGoodsInfo', {})
		emits('getGoodsInfo', {})
		isSelectedGoods.value = false
		searchValue.value = ''
		isFocus.value = false
		isInput.value = false
	}

	//点击标签物品
	const handleClick = (item) => {
		searchValue.value = item.value
		isFocus.value = true
		goods.info = item
		isSelectedGoods.value = true
		isInput.value = false
		props.isShowOther(false)
		emits('getGoodsInfo', item)
	}

	//打开禁寄物品弹窗
	const openForbidGoodsDialog = () => {
		popup.value.open('bottom');
	}

	//关闭禁寄物品弹窗
	const closeForbidGoodsDialog = () => {
		popup.value.close();
	}
</script>

<style lang="scss" scoped src='./goodsSearch.scss'></style>