货无忧
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 

714 lines
15 KiB

<template>
<BasicContainer ref='basicContainer' :option="option">
<!-- 头部 -->
<template #head>
<view class="header-container">
<!-- <view class="tabBar_container">
<view :class="{'tabBar_item': true, 'active': details.tabBarCode === 1}" @click="handletabBarState(1)">
入库扫描
</view>
<view :class="{'tabBar_item': true, 'active': details.tabBarCode === 2}" @click="handletabBarState(2)">
配送回库
</view>
</view> -->
<!-- 顶部背景 -->
<view class="header">
<view class="search_row">
<view class="input_container">
<input placeholder="请输入包条码" v-model.trim="details.searchText" type="text" name="" id="">
<view class="clearIcon">
<u-icon @click="details.searchText = ''" v-show="details.searchText" name="close-circle"
color="#999999" size="40"></u-icon>
</view>
</view>
<view @click="handleSearch" class="search_button">
确认
</view>
</view>
</view>
<view @click='showCalendar' class="timeInput">
<view class="timerView">
{{details.datatime|| '请选择时间'}}
</view>
<view @click.stop.prevent class="icon_container">
<u-icon @click='showCalendar' style="margin-right: 10rpx;" v-if="!details.datatime" name="calendar"
color="#999999" size="50"></u-icon>
<u-icon @click="cleartime" style="margin-right: 10rpx;" v-else name="reload" color="#999999"
size="40"></u-icon>
</view>
</view>
<view class="header_total_container" @click="handleClickInfo">
<PullDownBox ref="pullDownPageInfo">
<template #title>
<view class="">
<text class="fwb">
车次号:
</text>
<text>
{{details.pageInfo.tranNumber || '暂无数据'}}
</text>
</view>
</template>
<template #content>
<view class="header_total">
<view class="header_total_item">
<view class="">
总件数
</view>
<view class="total">
{{ details.info.totalNum || 0 }}
</view>
</view>
<view class="header_total_item">
<view class="">
已扫件数
</view>
<view class="scanNum">
{{ details.info.scanNum || 0 }}
</view>
</view>
<view class="header_total_item">
<view class="">
未扫件数
</view>
<view class="notScanNum">
{{ (details.info.totalNum || 0) - (details.info.scanNum || 0) }}
</view>
</view>
</view>
</template>
</PullDownBox>
</view>
</view>
</template>
<!-- 主体 -->
<template #body>
<u-divider text="订单列表" textPosition="left"></u-divider>
<!-- 提货单件数 -->
<scroll-view class="scollView" scroll-y="true" :style="{height: details.height}"
@scrolltolower="utils.debounce(reachDown, 500)">
<block v-for="(item, index) in details.data" :key="item.id">
<view @click="handleChooseStatus(index)"
:class="{'list_container': true, 'active': details.chooseIndex === index}"
:style="index === 0 ? 'margin-top: 0px;': ''">
<view class="list_row" @click="handleGoDetails(item)">
订单号: {{item.orderCode || '暂无数据'}}
</view>
<view class="list_row">
<view class="">
总数:
<text>
{{item.totalNum }}
</text>
</view>
<view>
已扫:
<text style="color: #10d269;">
{{item.scanNum }}
</text>
</view>
<view class="">
未扫:
<text :style="{color: item.residueNum > 0? '#f00': '#000'}">
{{item.residueNum }}
</text>
</view>
</view>
<!-- 状态标签 -->
<view :class="{
'list_tips': true,
'none':item.scanNum === 0,
'portion':item.scanNum < item.totalNum && item.scanNum > 0,
'all':item.scanNum === item.totalNum}">
{{details.type[item.scanNum ===item.totalNum? 3: item.scanNum !==0?2: 1]|| '暂无状态数据'}}
</view>
</view>
</block>
<!-- 底部站位 -->
<!-- <view class="footer">
</view> -->
</scroll-view>
<!-- 底部站位 -->
<!-- <view class="button_container">
<view @click="handleConfirm">
确认打托
</view>
</view> -->
</template>
</BasicContainer>
<l-calendar v-model:value="details.show" :initStartDate='details.date[0]' :initEndDate='details.date[1]'
@hide='showCalendar' @change="onConfirm"></l-calendar>
<saomiao2 :ishidestop="scanState !== 0"></saomiao2>
</template>
<script lang="ts" setup>
import {
postIncomingIncomingPackage,
postIncomingBillladingBillladingList
} from '@/api/user.js'
import {
onLoad,
onShow,
} from '@dcloudio/uni-app'
import { nextTick, reactive, ref } from "vue";
import utils from '@/utils/utils.js'
import useSystemSettingsStore from '@/store/useSystemSettingsStore';
import { storeToRefs } from 'pinia';
const { scanState } = storeToRefs(useSystemSettingsStore())
// 组件配置
const option = reactive({
// 标题
title: '入库扫描',
// 下拉刷新回调函数
async pullDownRefreshInitPage() {
// 重置被选中数据
details.chooseIndex = -1
details.data = []
details.page.pageNum = 1
initpage()
return null
},
// 触底加载回到函数
reachBottomInitPage: async () => { return null },
haveData: true,
isEnd: false
})
let details = reactive({
/** 时间 */
date: [],
/** 是否显示时间选择框 */
show: false,
datatime: '',
/** 提货批次列表 */
data: [] as any[],
/** 页面数据 */
info: {},
/** 页面分页 */
page: {
pageSize: 10,
pageNum: 1,
total: 0
},
/** 被选中的元素的索引 */
chooseIndex: -1,
/** 提货状态 */
type: {
1: '未 扫', 2: '部分扫', 3: '齐 套',
},
/** 滚动区高度 */
height: '80vh',
/** 页面数据 */
pageInfo: {} as any,
/** 扫描的码值 */
scancode: '',
detauser: {},
/** tabBar激活状态 */
tabBarCode: 1,
/** 搜索框的值 */
searchText: ''
})
// 组件实例
const basicContainer = ref()
const pullDownPageInfo = ref()
/** 扫描后执行的回调函数 */
const scandata = async () => {
const _code = details.scancode
const _submitData : any = {
orderPackageCode: _code,
billladingId: details.pageInfo.id,
incomingType: "2",
}
if (details.pageInfo.tranNumber) _submitData.customerTrain = details.pageInfo.tranNumber
const res = await postIncomingIncomingPackage(_submitData)
if (res.code !== 200) return
basicContainer.value.startPullDownRefresh()
console.log('res :>> ', res);
}
/** 初始化时间 */
const initTime = () => {
details.date[0] = (uni as any).$u.timeFormat((new Date().valueOf() - 1000 * 60 * 60 * 24 * 3), 'yyyy-mm-dd')
details.date[1] = (uni as any).$u.timeFormat((new Date().valueOf()), 'yyyy-mm-dd')
details.datatime = details.date[0] + ' 至 ' + details.date[1]
}
onLoad(async (op) => {
console.log('op :>> ', op);
details.pageInfo = op.pageInfo ? JSON.parse(op.pageInfo) : {}
// 初始化时间
initTime()
// #ifdef APP
utils.ttsspke('请扫描或输入包条码')
// #endif
await nextTick()
pullDownPageInfo.value.handleShowPullDown(true)
})
onShow(async () => {
// 初始化关闭监听
uni.$off('scancodedate')
uni.$on('scancodedate', (code) => {
if (code) {
details.scancode = code
scandata()
}
})
await nextTick()
basicContainer.value.startPullDownRefresh()
const timer = setTimeout(async () => {
// 设置滚动区高度
details.height = await utils.getViewDistanceFormTop('.scollView')
clearTimeout(timer)
}, 10)
})
/** 数据请求 */
async function initpage() {
if (details.date.length === 0) return uni.showToast({
title: '请选择时间',
icon: 'none'
})
try {
const _submitData : any = {
...details.page,
startDateStr: details.date[0],
endDateStr: details.date[1]
}
if (details.pageInfo.tranNumber) _submitData.customerTrain = details.pageInfo.tranNumber
const res = await postIncomingBillladingBillladingList(_submitData)
const { code, data } = res
const { page } = data
if (code !== 200) return
for (let item of page.records) {
item.scanNum = item.scanNum || 0
item.totalNum = item.totalNum || 0
item.residueNum = (item.totalNum || 0) - (item.scanNum || 0)
}
details.data = [...details.data, ...page.records]
details.page.total = data.total
details.info = data
return null
} catch (err) {
//TODO handle the exception
console.log('err :>> ', err);
} finally {
return null
}
}
/** tabBar激活状态 */
const handletabBarState = (code : number) => {
details.tabBarCode = code
}
/** 搜索 */
const handleSearch = () => {
details.scancode = details.searchText
scandata()
}
/** 显示日期选择器 */
function showCalendar() {
details.show = !details.show
}
function onConfirm(e : any) {
const startTime = new Date(e.startDate).getTime()
const endTime = new Date(e.endDate).getTime()
// 一周的时间戳
const maxTime = 1000 * 60 * 60 * 24 * 7
if (endTime - startTime > maxTime) {
details.show = true
return uni.showToast({
title: '时间范围最大暂时为一周',
icon: 'none'
})
}
console.log(e);
details.date[0] = e.startDate
details.date[1] = e.endDate
details.datatime = details.date[0] + ' 至 ' + details.date[1]
basicContainer.value.startPullDownRefresh()
// details.datatime=(uni as any).$u.timeFormat(date.value[0], 'yyyy-mm-dd')+' 至 '+(uni as any).$u.timeFormat(date.value[1], 'yyyy-mm-dd')
}
/** 清空时间 */
function cleartime() {
// details.datatime = ''
// details.date = []
initTime()
basicContainer.value.startPullDownRefresh()
}
const handleClickInfo = async () => {
await nextTick()
// 设置滚动区高度
details.height = await utils.getViewDistanceFormTop('.scollView')
}
/** 触底加载 */
const reachDown = () => {
console.log('111 :>> ', 111);
details.page.pageNum += 1
if (details.page.total <= details.data.length) return uni.showToast({
title: '数据加载完毕',
icon: 'none'
})
initpage()
}
/** 元素激活状态 */
const handleChooseStatus = (index : number) => {
// details.chooseIndex = details.chooseIndex === index ? -1 : index
}
/** 确认 */
const handleConfirm = () => {
}
/** 跳转包件明细 */
const handleGoDetails = (item) => {
uni.navigateTo({
url: '/pagesHome/pages/onLoadOrderDetails/onLoadOrderDetails?pageInfo=' + JSON.stringify(item)
})
// const _data = JSON.stringify({
// orderCode: item.orderCode,
// totalNum: item.totalNum,
// scanNum: 0
// })
// uni.navigateTo({
// url: '/pagesHome/pages/OrderDetailsInTheStorage/OrderDetailsInTheStorage?pageInfo='
// + _data
// })
}
</script>
<style lang="scss" scoped>
@import url(@/utils/style/common.scss);
:deep(.Pulldown-title-container) {
background-color: #fff;
padding: 10upx;
}
// tabBar
.tabBar_container {
display: flex;
>view {
flex: 1;
text-align: center;
padding: 20upx 0;
position: relative;
background: #fff;
&::after {
content: '';
display: block;
width: 0;
height: 4upx;
position: absolute;
background: var(--subjectColor);
left: 0;
bottom: 0;
transition: all cubic-bezier(0.075, 0.82, 0.165, 1) .3s;
transform: translateX(-50%);
left: 50%;
}
&:first-child {
&::before {
content: '';
display: block;
width: 4upx;
height: 60%;
position: absolute;
background: var(--subjectColor);
right: 0;
top: 50%;
transform: translateY(-50%);
}
}
&.active {
&::after {
width: 50%;
}
}
}
}
// 顶部背景
.header-container {
position: relative;
}
// 头部统计容器
.header_total_container {
padding: 0 10upx;
}
// 头部统计
.header_total {
padding: 10upx;
border-radius: 10upx;
margin-top: 20upx;
display: flex;
align-items: center;
justify-content: space-around;
background: #f5f7fb;
font-size: 0.9rem;
}
.header_total_item {
height: 100upx;
text-align: center;
display: flex;
flex-direction: column;
justify-content: space-between;
>view {
&:nth-child(2) {
font-size: 1.2rem;
&.total {
color: var(--subjectColor);
}
&.scanNum {
color: #0f0;
}
&.notScanNum {
color: #f00;
}
}
}
}
// 头部
.header {
width: calc(100vw - 60upx);
background: #fff;
padding: 20upx;
border-radius: 10upx;
margin: 10upx 10upx;
font-size: 0.8rem;
// 搜索行
.search_row {
display: flex;
align-items: center;
.input_container {
flex: 1;
position: relative;
}
input {
margin-right: 20upx;
background: #eee;
padding: 10upx 20upx;
border-radius: 5upx;
}
.clearIcon {
position: absolute;
right: 40upx;
top: 50%;
transform: translateY(-50%);
}
.search_button {
padding: 10upx 30upx;
background: var(--subjectColor);
color: #fff;
border-radius: 5upx;
}
}
.header_row {
margin-top: 10upx;
display: flex;
>view {
flex: 1;
}
}
}
.timeInput {
position: relative;
background: #fff;
margin: 10upx;
border-radius: 5upx;
.timerView {
padding: 20upx;
font-size: 0.8rem;
}
.icon_container {
position: absolute;
right: 0;
top: 50%;
transform: translateY(-50%);
}
}
// 分割线
:deep(.u-divider__text) {
font-size: 1rem !important;
color: var(--subjectColor) !important;
}
:deep(.u-line) {
border-color: var(--subjectColor) !important;
}
// 列表容器
.list_container {
// 边框圆角
$borderRadius: 10upx;
position: relative;
margin: 20upx;
font-size: 0.8rem;
background: #fff;
padding: 10upx;
border-radius: $borderRadius;
box-shadow: 0 0 10px #eee, 3px 3px #eee;
&.active {
box-shadow: 0 0 10px var(--subjectColor), 3px 3px var(--subjectColor);
}
.list_row {
padding: 10upx;
display: flex;
>view {
flex: 1;
}
}
.list_tips {
position: absolute;
top: 0;
right: 0;
padding: 10upx 20upx;
background: var(--subjectColor);
color: #fff;
border-top-right-radius: $borderRadius;
&.none {
color: #f8625a;
background-color: #feeded;
}
&.all {
color: #0086F1;
background-color: #e5f2fd;
}
&.portion {
color: #fa8c16;
background: #fef3e7;
}
}
}
// 底部按钮
.button_container {
display: flex;
justify-content: center;
position: fixed;
width: 100%;
bottom: 40upx;
left: 0;
>view {
width: 60vw;
padding: 20upx;
text-align: center;
background: var(--subjectColor);
border-radius: 5upx;
color: #fff;
box-shadow: 0 0 10px var(--subjectColor);
}
}
// 底部站位
.footer {
height: 160upx;
}
.fwb {
font-weight: bold;
}
</style>