bonus-material-app/src/pages/standardBox/acceptBox.vue

605 lines
19 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="page-container">
<view class="complete-btn">
<view class="btn" @click="changeTab(1)">
<span>未接收</span>
<div v-if="active == 1" class="bt-line"></div>
</view>
<view class="btn" style="margin-left: 120rpx" @click="changeTab(2)">
<span>已完成</span>
<div v-if="active == 2" class="bt-line"></div>
</view>
</view>
<uni-row :gutter="24" class="search-form">
<uni-col :span="24">
<view>
<uni-datetime-picker
v-model="dateArray"
type="daterange"
@maskClick="maskClick"
@change="onChangeDate"
placeholder="选择日期范围"
/>
</view>
</uni-col>
</uni-row>
<uni-row :gutter="24" class="search-form">
<uni-col :span="18">
<view>
<uni-easyinput placeholder="请输入内容" v-model="queryParams.keyWord"/>
</view>
</uni-col>
<uni-col :span="6">
<view class="search" @click="getTableList(true)">搜索</view>
</uni-col>
</uni-row>
<scroll-view scroll-y @scrolltolower="onScrollTolower" class="scroll-container">
<div class="table-list-item" v-for="(item, index) in tableList" :key="index">
<uni-swipe-action>
<uni-swipe-action-item :right-options="item.status==4 ? swipeOptions:swipeOptionsFail" @click="onClick($event,item)" @change="onSwipeChange">
<div class="content-wrapper">
<div class="title">
<span class="code">{{ item.boxCode }}</span>
<span :class="['status', item.status == 4 ? 'completed' : 'pending']">
{{ item.status == 4 ? '已完成' : '未接收' }}
</span>
</div>
<div class="line"></div>
<uni-row :gutter="24">
<uni-col :span="7">标准箱名称:</uni-col>
<uni-col :span="17"><div class="cont">{{ item.boxName }}</div></uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="7">机具数量:</uni-col>
<uni-col :span="17"><div class="cont">{{ item.devNum }}</div></uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="7">创建人:</uni-col>
<uni-col :span="17"><div class="cont">{{ item.createBy }}</div></uni-col>
</uni-row>
<uni-row :gutter="24">
<uni-col :span="7">创建时间:</uni-col>
<uni-col :span="17"><div class="cont">{{ item.createTime }}</div></uni-col>
</uni-row>
<!-- <div class="storage-info">
<div class="storage-item">
<span class="label">已入库</span>
<span class="value">{{ item.inputMaNumber || 0 }}</span>
</div>
<div class="storage-item">
<span class="label">待入库</span>
<span class="value">{{ item.waitInputNumber || 0 }}</span>
</div>
</div> -->
</div>
</uni-swipe-action-item>
</uni-swipe-action>
</div>
<view class="loading-text">
{{ finish ? '没有更多数据了~' : '正在加载...' }}
</view>
</scroll-view>
</view>
</template>
<script setup>
import { ref,computed } from 'vue'
import { onLoad, onShow } from '@dcloudio/uni-app'
import { debounce } from 'lodash-es'
import { getPurchaseList } from '@/services/purchase.js'
import { getQrCodeBoxListApi,appReceiveApi,appTransferRejectApi } from '@/services/standard.js'
const total = ref(0) // 数据总量
const active = ref(1) // tap索引
const tableList = ref([]) // 列表数据源
const dateArray = ref([]) // 日期范围
// 查询参数
const queryParams = ref({
startTime: '', // 开始时间
endTime: '', // 结束时间
keyWord: '', // 关键字
status: 3,
pageNum: 1,
pageSize: 5,
})
// 日期 change 事件
const onChangeDate = (val) => {
const [val_1, val_2] = val
queryParams.value.startTime = val_1
queryParams.value.endTime = val_2
}
//点击事件
const onClick=(e,item)=> {
if(item.status==4){
if(e.index==0){
uni.navigateTo({ url: `/pages/standardBox/codeView?boxInfo=${JSON.stringify(item)}` })
}
}else{
if(e.index==0){
uni.navigateTo({ url: `/pages/standardBox/codeView?boxInfo=${JSON.stringify(item)}` })
}else if(e.index==1){//接收
console.log(item)
uni.showModal({
title: '提示',
content: '是否确认接收?',
confirmText: '确定',
cancelText: '取消',
success: async (modalRes) => {
if (modalRes.confirm) {
let param = {
boxId:item.boxId
}
const res = await appReceiveApi(param)
console.log("yyyyyyyyyyy",res)
if (res.code == 200) {
uni.showToast({
title: '接收成功',
icon: 'none',
})
setTimeout(() => {
getTableList(true)
}, 500)
}else{
console.log("xxxxxxxxxxxxxxxxxxxxxxxxx")
uni.showToast({ title: '接收失败', icon: 'none' })
}
}
}
})
}else{//驳回
console.log(item)
uni.showModal({
title: '提示',
content: '是否确认驳回移交?',
confirmText: '确定',
cancelText: '取消',
success: async (res) => {
if (res.confirm) {
let param = {
boxId:item.boxId
}
// console.log(param)
const res = await appTransferRejectApi(param)
if (res.code === 200) {
uni.showToast({
title: '驳回成功',
icon: 'none',
})
setTimeout(() => {
getTableList(true)
}, 500)
}else{
uni.showToast({ title: '驳回失败', icon: 'none' })
}
}
}
})
}
}
}
//左滑选择项1
const swipeOptions = ref([
{
text: '查看',
style: { backgroundColor: '#34C759' },
onClick: () => { handleAction('查看'); }
},
// {
// text: '驳回',
// style: { backgroundColor: '#dd524d' },
// onClick: () => { handleAction('驳回'); }
// }
])
//左滑选择项2
const swipeOptionsFail = ref([
{
text: '查看',
style: { backgroundColor: '#34C759' },
},
{
text: '接收',
style: { backgroundColor: '#007AFF' },
},
{
text: '驳回',
style: { backgroundColor: '#dd524d' },
}
])
//左滑改变
const onSwipeChange= (e) => {
console.log("Swipe Changed", e);
}
// 获取列表数据
const getTableList = async (isTap = false) => {
try {
const { data:res } = await getQrCodeBoxListApi(queryParams.value)
console.log('res列表数据', res)
// 更新总数
total.value = res.total
// 处理数据
if (isTap) {
// 点击搜索时,直接替换数据
tableList.value = res.rows || []
// 重置页码
queryParams.value.pageNum = 1
} else {
// 下拉加载时,追加数据
if (res.rows && res.rows.length > 0) {
// 使用展开运算符安全地合并数组
tableList.value = [...tableList.value, ...res.rows]
}
}
} catch (error) {
console.error('获取列表数据失败:', error)
// 发生错误时重置数据
if (isTap) {
tableList.value = []
}
}
}
// 滚动触底事件
const onScrollTolower = debounce(() => {
// 判断是否还有更多数据
if (tableList.value.length < total.value) {
queryParams.value.pageNum++
getTableList(false)
}
}, 500)
// tap 栏切换
const changeTab = (index) => {
active.value = index
// 重置查询参数
queryParams.value.pageNum = 1
queryParams.value.keyWord = ''
queryParams.value.startTime = ''
queryParams.value.endTime = ''
dateArray.value = [] // 清空日期选择
if (index == 1) {
queryParams.value.status = 3 // 查未完成的
} else if (index == 2) {
queryParams.value.status = 4 // 查已完成的
}
// 重置列表数据
tableList.value = []
// 重新获取数据
getTableList(true)
}
const maskClick = () => {}
// // 页面加载完毕
// onLoad(() => {
// getTableList()
// })
onShow(() => {
tableList.value = []
getTableList(true)
})
// 判断数据是否加载完毕
const finish = computed(() => {
console.log('total.value',total.value)
console.log('tableList.value.length',tableList.value.length)
if (total.value === tableList.value.length) return true
})
</script>
<style lang="scss" scoped>
.page-container {
display: flex;
height: 100vh;
flex-direction: column;
background-color: #f7f8fa;
padding: 24rpx;
.complete-btn {
display: flex;
justify-content: center;
/* padding: 28rpx 24rpx; */
/* background: #fff;
border-radius: 20rpx;
margin-bottom: 24rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05); */
.btn {
display: flex;
flex-direction: column;
align-items: center;
padding: 0 60rpx;
position: relative;
transition: all 0.3s ease;
span {
font-size: 32rpx;
color: #8c8c8c;
font-weight: 500;
&.active {
color: #3784fb;
font-weight: 600;
.second-active & {
color: #fa8c16;
}
}
}
.bt-line {
width: 32rpx;
height: 6rpx;
background: #3784fb;
margin-top: 12rpx;
border-radius: 6rpx;
transition: all 0.3s ease;
.second-active & {
background: #fa8c16;
}
}
}
}
.search-form {
display: flex;
align-items: center;
padding: 10rpx;
/* background: #fff; */
/* border-radius: 20rpx;
margin-bottom: 20rpx;
box-shadow: 0 4rpx 16rpx rgba(0, 0, 0, 0.05); */
:deep(.uni-easyinput__content),
:deep(.uni-date-editor) {
background-color: #f7f8fa;
border: 2rpx solid #e8e8e8;
border-radius: 12rpx;
height: 75rpx;
transition: all 0.3s ease;
&:focus-within {
border-color: #3784fb;
box-shadow: 0 0 0 2rpx rgba(55, 132, 251, 0.1);
}
}
:deep(.uni-date-editor) {
width: 100%;
.uni-date {
width: 100%;
}
.uni-date-x {
width: 100%;
}
.uni-date-range {
display: flex;
align-items: center;
justify-content: space-between;
width: 100%;
padding: 0 20rpx;
.uni-date-range--text {
flex: 1;
text-align: center;
color: #333;
white-space: nowrap;
overflow: hidden;
text-overflow: ellipsis;
font-size: 28rpx;
}
.uni-date-range--delimeter {
padding: 0 20rpx;
color: #8c8c8c;
flex-shrink: 0;
}
}
.uni-date-x--border {
width: 100%;
border: 2rpx solid #e8e8e8;
border-radius: 12rpx;
background-color: #f7f8fa;
&:focus-within {
border-color: #3784fb;
box-shadow: 0 0 0 2rpx rgba(55, 132, 251, 0.1);
}
}
}
}
.search {
height: 60rpx;
background: linear-gradient(135deg, #4b8eff 0%, #3784fb 100%);
text-align: center;
line-height: 60rpx;
color: #fff;
border-radius: 12rpx;
font-size: 28rpx;
font-weight: 600;
box-shadow: 0 6rpx 20rpx rgba(55, 132, 251, 0.2);
transition: all 0.3s ease;
&:active {
transform: translateY(2rpx);
opacity: 0.9;
}
}
.scroll-container {
padding: 0 2rpx;
.table-list-item {
margin: 24rpx 0;
padding: 0;
background-color: #fff;
min-height: 300rpx;
border-radius: 20rpx;
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.06);
overflow: hidden;
.content-wrapper {
padding: 32rpx;
background-color: #fff;
}
.title {
display: flex;
justify-content: space-between;
align-items: center;
margin-bottom: 20rpx;
.code {
font-size: 32rpx;
font-weight: 600;
color: #007AFF;
letter-spacing: 1rpx;
}
span.status {
padding: 8rpx 28rpx;
border-radius: 8rpx;
font-size: 26rpx;
font-weight: 600;
&.completed {
background-color: rgba(82, 196, 26, 0.1);
color: #52c41a;
}
&.pending {
background-color: rgba(250, 140, 22, 0.1);
color: #fa8c16;
}
}
}
.line {
margin: 24rpx 0;
height: 2rpx;
background: linear-gradient(90deg,
rgba(232, 232, 232, 0) 0%,
rgba(232, 232, 232, 1) 50%,
rgba(232, 232, 232, 0) 100%
);
}
:deep(.uni-row) {
/* margin-bottom: 20rpx; */
.uni-col-6 {
color: #8c8c8c;
font-size: 28rpx;
font-weight: 500;
}
}
.cont {
display: flex;
justify-content: flex-end;
line-height: 1.8;
color: #262626;
font-size: 28rpx;
font-weight: 500;
}
.storage-info {
display: flex;
justify-content: flex-end;
align-items: center;
gap: 32rpx;
margin-top: 20rpx;
padding-top: 20rpx;
border-top: 2rpx solid #f5f5f5;
.storage-item {
display: flex;
align-items: center;
.label {
color: #8c8c8c;
font-size: 28rpx;
font-weight: 500;
}
.value {
color: #262626;
font-size: 28rpx;
font-weight: 500;
margin-left: 8rpx;
}
}
}
// 优化左滑区域样式
:deep(.uni-swipe_action) {
border-radius: 20rpx;
overflow: hidden;
.uni-swipe_content {
margin: 0 !important;
padding: 0;
background-color: #fff;
}
.uni-swipe_button-group {
height: 100%;
.uni-swipe_button {
height: 100%;
padding: 0 40rpx;
display: flex;
align-items: center;
justify-content: center;
font-size: 28rpx;
font-weight: 600;
color: #fff;
border: none;
// 查看按钮
&:nth-child(1) {
background: linear-gradient(to bottom, #3ad980, #34C759);
}
// 入库按钮
&:nth-child(2) {
background: linear-gradient(to bottom, #3b95ff, #007AFF);
}
}
}
}
}
}
}
// 加载提示文字
.loading-text {
text-align: center;
font-size: 26rpx;
color: #8c8c8c;
padding: 32rpx 0;
letter-spacing: 1rpx;
}
</style>