Files

363 lines
8.4 KiB
Vue
Raw Permalink 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>
<scroll-view scroll-y class="page">
<cu-custom bgColor="bg-blue" :isBack="true"><block slot="backText">返回</block><block slot="content">入库列表</block></cu-custom>
<!-- 搜索框 -->
<view class="search-box">
<input
class="search-input"
type="text"
v-model="searchKeyword"
placeholder="请输入入库批次"
placeholder-class="search-placeholder"
/>
<text class="search-icon" v-if="!searchKeyword">🔍</text>
<text class="clear-icon" v-else @click="clearSearch"></text>
</view>
<!-- 空数据提示 -->
<view v-if="!filteredInListData || filteredInListData.length === 0" class="empty-container">
<text class="empty-icon">📦</text>
<text class="empty-text">{{searchKeyword ? '未找到匹配的入库批次' : '暂无入库数据'}}</text>
</view>
<!-- 表格展示 -->
<view v-else class="table-wrapper">
<view class="table-container">
<view class="table-header">
<view class="table-cell cell-batch">入库批次</view>
<view class="table-cell cell-count">总袋数</view>
<view class="table-cell cell-bags">总重量</view>
<view class="table-cell cell-time">入库时间</view>
<view class="table-cell cell-person">入库人员</view>
<view class="table-cell cell-action">操作</view>
</view>
<view class="table-row" v-for="(item, index) in currentPageData" :key="index">
<view class="table-cell cell-batch">{{item.in_ware_batch}}</view>
<view class="table-cell cell-count">{{item.totalCount}}</view>
<view class="table-cell cell-bags">{{item.totalWeight}}</view>
<view class="table-cell cell-time">{{formatTime(item.in_ware_time)}}</view>
<view class="table-cell cell-person">{{item.in_ware_name}}</view>
<view class="table-cell cell-action">
<navigator :url="'/pages/plugin/inDetails?batch=' + item.in_ware_batch" hover-class="none" class="detail-btn">详情</navigator>
</view>
</view>
</view>
<!-- 分页控件 -->
<view class="pagination-wrapper">
<view class="pagination-info">
<text> {{totalItems}} {{currentPage}}/{{totalPages}} </text>
</view>
<view class="pagination-controls">
<button class="page-btn" :disabled="currentPage === 1" @click="changePage('prev')">上一页</button>
<button class="page-btn" :disabled="currentPage === totalPages" @click="changePage('next')">下一页</button>
</view>
</view>
</view>
</scroll-view>
</view>
</template>
<script>
export default {
data() {
return {
hospital: '',
sortHospital: '',
department: '',
name: '',
duty: '',
inListData: [],
searchKeyword: '',
currentPage: 1,
pageSize: 20,
totalItems: 0,
totalPages: 0
}
},
computed: {
filteredInListData() {
if (!this.searchKeyword) {
return this.inListData
}
return this.inListData.filter(item => {
return item.in_ware_batch && item.in_ware_batch.includes(this.searchKeyword)
})
},
currentPageData() {
const start = (this.currentPage - 1) * this.pageSize
const end = start + this.pageSize
return this.filteredInListData.slice(start, end)
}
},
watch: {
inListData(newVal) {
this.currentPage = 1
},
searchKeyword() {
this.currentPage = 1
},
filteredInListData(newVal) {
this.totalItems = newVal.length
this.totalPages = Math.ceil(this.totalItems / this.pageSize)
if (this.currentPage > this.totalPages && this.totalPages > 0) {
this.currentPage = this.totalPages
}
}
},
mounted(){
this.hospital = getApp().globalData.hospital
this.sortHospital = getApp().globalData.sortHospital
this.department = getApp().globalData.department
this.name = getApp().globalData.name
this.duty = getApp().globalData.duty
this.getInListData()
},
methods: {
// 获取入库列表数据
getInListData(){
let that = this;
uni.request({
url: 'https://mtx.mini.opmonitor.com/?c=app_api&a=getInListData',
data: {hospital: that.hospital, sortHospital: that.sortHospital, department: that.department, duty: that.duty},
header: {
'Content-type': 'application/json'
},
success: function(res){
that.inListData = res.data.data
},
fail: () => {
console.info('获取入库列表失败')
}
})
},
// 格式化时间 m-d H:i
formatTime(timeStr) {
if (!timeStr) return ''
const date = new Date(timeStr.replace(/-/g, '/'))
const month = String(date.getMonth() + 1).padStart(2, '0')
const day = String(date.getDate()).padStart(2, '0')
const hours = String(date.getHours()).padStart(2, '0')
const minutes = String(date.getMinutes()).padStart(2, '0')
return `${month}-${day} ${hours}:${minutes}`
},
// 切换页面
changePage(direction) {
if (direction === 'prev' && this.currentPage > 1) {
this.currentPage--
} else if (direction === 'next' && this.currentPage < this.totalPages) {
this.currentPage++
}
},
// 清空搜索
clearSearch() {
this.searchKeyword = ''
}
}
}
</script>
<style>
.page {
width: 100vw;
height: 100vh;
}
/* 搜索框 */
.search-box {
margin: 12rpx;
padding: 0 24rpx;
background-color: #fff;
border-radius: 30rpx;
display: flex;
align-items: center;
box-shadow: 0 2rpx 12rpx rgba(74, 144, 226, 0.15);
border: 1px solid #e1e8f0;
}
.search-input {
flex: 1;
height: 70rpx;
font-size: 26rpx;
color: #333;
}
.search-placeholder {
color: #999;
}
.search-icon, .clear-icon {
font-size: 28rpx;
margin-left: 10rpx;
}
.clear-icon {
color: #999;
padding: 10rpx;
}
/* 空数据容器 */
.empty-container {
display: flex;
flex-direction: column;
align-items: center;
justify-content: center;
padding: 200rpx 0;
}
.empty-icon {
font-size: 120rpx;
margin-bottom: 30rpx;
}
.empty-text {
font-size: 32rpx;
color: #999;
}
/* 表格包裹层 */
.table-wrapper {
height: calc(100vh - 88rpx);
display: flex;
flex-direction: column;
}
/* 表格容器 - 入库列表使用蓝色系 */
.table-container {
flex: 1;
overflow-y: auto;
margin: 12rpx;
background-color: #fff;
border-radius: 8rpx;
overflow-x: hidden;
box-shadow: 0 2rpx 8rpx rgba(74, 144, 226, 0.1);
border: 1px solid #e1e8f0;
}
/* 表头 */
.table-header {
display: flex;
background: linear-gradient(90deg, #4a90e2 0%, #357abd 100%);
color: #fff;
font-weight: 600;
font-size: 22rpx;
padding: 0;
position: sticky;
top: 0;
z-index: 10;
}
/* 表格行 */
.table-row {
display: flex;
border-bottom: 1px solid #eef3f8;
background-color: #fff;
min-height: 68rpx;
}
.table-row:last-child {
border-bottom: none;
}
.table-row:nth-child(even) {
background-color: #f8fbff;
}
/* 表格单元格 - 统一高度和最小宽度 */
.table-cell {
padding: 12rpx 10rpx;
font-size: 22rpx;
color: #333;
display: flex;
align-items: center;
word-break: break-all;
overflow: hidden;
text-overflow: ellipsis;
white-space: nowrap;
}
.cell-batch {
flex: 1.3;
min-width: 160rpx;
}
.cell-count {
flex: 0.8;
min-width: 80rpx;
justify-content: center;
}
.cell-bags {
flex: 0.8;
min-width: 80rpx;
justify-content: center;
}
.cell-time {
flex: 1.2;
min-width: 120rpx;
}
.cell-person {
flex: 1.2;
min-width: 110rpx;
}
.cell-action {
flex: 0.8;
min-width: 80rpx;
justify-content: center;
}
/* 详情按钮 */
.detail-btn {
padding: 6rpx 18rpx;
background: linear-gradient(135deg, #4a90e2 0%, #357abd 100%);
color: #fff;
border-radius: 16rpx;
font-size: 20rpx;
box-shadow: 0 1rpx 6rpx rgba(74, 144, 226, 0.25);
white-space: nowrap;
}
/* 分页包裹层 */
.pagination-wrapper {
margin: 0 12rpx 12rpx 12rpx;
padding: 14rpx 20rpx;
background-color: #fff;
border-radius: 8rpx;
box-shadow: 0 2rpx 8rpx rgba(0, 0, 0, 0.06);
display: flex;
justify-content: space-between;
align-items: center;
}
.pagination-info {
font-size: 22rpx;
color: #666;
}
.pagination-controls {
display: flex;
gap: 12rpx;
}
.page-btn {
padding: 8rpx 24rpx;
background: linear-gradient(135deg, #4a90e2 0%, #357abd 100%);
color: #fff;
border-radius: 16rpx;
font-size: 22rpx;
border: none;
box-shadow: 0 1rpx 6rpx rgba(74, 144, 226, 0.25);
}
.page-btn[disabled] {
background: #ccc;
box-shadow: none;
opacity: 0.5;
}
</style>