feat:任务/产品查看更多页面
parent
d3dfc45074
commit
b1e6d3af72
@ -0,0 +1,273 @@
|
||||
<template>
|
||||
<view class="page-container">
|
||||
<view class="task-list">
|
||||
<view v-for="(task, index) in taskList" :key="index" class="task-card" @click="handleTaskClick(task)">
|
||||
<view class="task-header">
|
||||
<text class="task-code">{{ task.code }}</text>
|
||||
<view class="task-status" :class="'status-' + task.statusType">
|
||||
<text>{{ task.statusText }}</text>
|
||||
</view>
|
||||
</view>
|
||||
<view class="task-body">
|
||||
<view class="task-row">
|
||||
<text class="task-label">{{ t('taskList.taskType') }}</text>
|
||||
<text class="task-value">{{ task.taskType || '-' }}</text>
|
||||
</view>
|
||||
<view class="task-row">
|
||||
<text class="task-label">{{ t('taskList.orderDate') }}</text>
|
||||
<text class="task-value">{{ task.orderDateText }}</text>
|
||||
</view>
|
||||
<view class="task-row">
|
||||
<text class="task-label">{{ t('taskList.deliveryDate') }}</text>
|
||||
<text class="task-value">{{ task.deliveryDateText }}</text>
|
||||
</view>
|
||||
<view class="task-row">
|
||||
<text class="task-label">{{ t('taskList.totalNumber') }}</text>
|
||||
<text class="task-value task-num">{{ task.totalNumber }}</text>
|
||||
</view>
|
||||
<view class="task-row">
|
||||
<text class="task-label">{{ t('taskList.planNumber') }}</text>
|
||||
<text class="task-value task-num">{{ task.planNumber }}</text>
|
||||
</view>
|
||||
<view class="task-row">
|
||||
<text class="task-label">{{ t('taskList.unPlanNumber') }}</text>
|
||||
<text class="task-value task-num">{{ task.unPlanNumber }}</text>
|
||||
</view>
|
||||
<view class="task-row">
|
||||
<text class="task-label">{{ t('taskList.storedPlanNumber') }}</text>
|
||||
<text class="task-value task-num">{{ task.storedPlanNumber }}</text>
|
||||
</view>
|
||||
<view v-if="task.isUrgent === 1" class="task-urgent">
|
||||
<text class="urgent-text">{{ t('taskList.urgent') }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
</view>
|
||||
<view v-if="loading" class="loading-state">
|
||||
<text class="loading-text">{{ t('functionCommon.loading') }}</text>
|
||||
</view>
|
||||
<view v-else-if="taskList.length === 0" class="empty-state">
|
||||
<text class="empty-text">{{ t('taskList.noData') }}</text>
|
||||
</view>
|
||||
<view v-else-if="noMore" class="no-more-state">
|
||||
<text class="no-more-text">{{ t('functionCommon.noMoreData') }}</text>
|
||||
</view>
|
||||
</view>
|
||||
</template>
|
||||
|
||||
<script setup>
|
||||
import { ref, reactive, onMounted } from 'vue'
|
||||
import { onReachBottom, onShow } from '@dcloudio/uni-app'
|
||||
import { useI18n } from 'vue-i18n'
|
||||
import request from '@/utils/request'
|
||||
import { setNavigationTitle } from '@/locales'
|
||||
|
||||
const { t } = useI18n()
|
||||
|
||||
const taskList = reactive([])
|
||||
const pageNo = ref(1)
|
||||
const pageSize = ref(10)
|
||||
const total = ref(0)
|
||||
const loading = ref(false)
|
||||
const noMore = ref(false)
|
||||
|
||||
function formatDate(dateStr) {
|
||||
if (!dateStr) return '-'
|
||||
const date = new Date(dateStr)
|
||||
if (Number.isNaN(date.getTime())) return '-'
|
||||
const pad2 = (n) => String(n).padStart(2, '0')
|
||||
return `${date.getFullYear()}-${pad2(date.getMonth() + 1)}-${pad2(date.getDate())}`
|
||||
}
|
||||
|
||||
function mapTaskStatus(status) {
|
||||
const v = status === '' || status === null || status === undefined ? undefined : String(status)
|
||||
if (v === '1') return { statusText: t('dashboard.pending'), statusType: 'pending' }
|
||||
if (v === '2') return { statusText: t('dashboard.running'), statusType: 'running' }
|
||||
if (v === '3') return { statusText: t('dashboard.finished'), statusType: 'finished' }
|
||||
return { statusText: '-', statusType: 'pending' }
|
||||
}
|
||||
|
||||
function handleTaskClick(task) {
|
||||
uni.showToast({ title: t('taskList.viewTask', { code: task.code }), icon: 'none' })
|
||||
}
|
||||
|
||||
async function loadTaskList(reset = false) {
|
||||
if (loading.value) return
|
||||
if (reset) {
|
||||
pageNo.value = 1
|
||||
noMore.value = false
|
||||
taskList.splice(0, taskList.length)
|
||||
}
|
||||
if (noMore.value && !reset) return
|
||||
loading.value = true
|
||||
try {
|
||||
const res = await request({
|
||||
url: '/admin-api/mes/task/pagePlanTask',
|
||||
method: 'get',
|
||||
params: { pageNo: pageNo.value, pageSize: pageSize.value }
|
||||
})
|
||||
const list = res?.data?.list || []
|
||||
total.value = res?.data?.total || 0
|
||||
const mapped = list.map((item) => {
|
||||
const statusInfo = mapTaskStatus(item?.status)
|
||||
return {
|
||||
id: item?.id,
|
||||
code: item?.code ?? '-',
|
||||
taskType: item?.taskType ?? '-',
|
||||
orderDateText: formatDate(item?.orderDate),
|
||||
deliveryDateText: formatDate(item?.deliveryDate),
|
||||
isUrgent: item?.isUrgent,
|
||||
isScheduled: item?.isScheduled,
|
||||
status: item?.status,
|
||||
statusText: statusInfo.statusText,
|
||||
statusType: statusInfo.statusType,
|
||||
totalNumber: item?.totalNumber ?? 0,
|
||||
planNumber: item?.planNumber ?? 0,
|
||||
unPlanNumber: item?.unPlanNumber ?? 0,
|
||||
storedPlanNumber: item?.storedPlanNumber ?? 0,
|
||||
remark: item?.remark ?? ''
|
||||
}
|
||||
})
|
||||
taskList.splice(taskList.length, 0, ...mapped)
|
||||
if (taskList.length >= total.value) {
|
||||
noMore.value = true
|
||||
} else {
|
||||
pageNo.value++
|
||||
}
|
||||
} finally {
|
||||
loading.value = false
|
||||
}
|
||||
}
|
||||
|
||||
onMounted(() => {
|
||||
loadTaskList(true)
|
||||
})
|
||||
|
||||
onReachBottom(() => {
|
||||
loadTaskList()
|
||||
})
|
||||
|
||||
onShow(() => {
|
||||
setNavigationTitle('dashboard.productionPlan')
|
||||
})
|
||||
</script>
|
||||
|
||||
<style lang="scss" scoped>
|
||||
.page-container {
|
||||
min-height: 100vh;
|
||||
background-color: #f0f2f5;
|
||||
padding: 24rpx;
|
||||
}
|
||||
|
||||
.task-list {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.task-card {
|
||||
background: #ffffff;
|
||||
border-radius: 16rpx;
|
||||
padding: 24rpx;
|
||||
margin-bottom: 20rpx;
|
||||
box-shadow: 0 4rpx 20rpx rgba(0, 0, 0, 0.05);
|
||||
|
||||
&:active {
|
||||
background: #e8f4ff;
|
||||
}
|
||||
}
|
||||
|
||||
.task-header {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 20rpx;
|
||||
}
|
||||
|
||||
.task-code {
|
||||
font-size: 28rpx;
|
||||
font-weight: 600;
|
||||
color: #1a3a5c;
|
||||
}
|
||||
|
||||
.task-status {
|
||||
padding: 8rpx 20rpx;
|
||||
border-radius: 20rpx;
|
||||
font-size: 22rpx;
|
||||
}
|
||||
|
||||
.status-pending {
|
||||
background: rgba(255, 140, 0, 0.15);
|
||||
color: #ff8c00;
|
||||
}
|
||||
|
||||
.status-running {
|
||||
background: rgba(24, 188, 55, 0.15);
|
||||
color: #18bc37;
|
||||
}
|
||||
|
||||
.status-finished {
|
||||
background: rgba(74, 144, 194, 0.15);
|
||||
color: #4a90c2;
|
||||
}
|
||||
|
||||
.task-body {
|
||||
display: flex;
|
||||
flex-direction: column;
|
||||
}
|
||||
|
||||
.task-row {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
align-items: center;
|
||||
margin-bottom: 12rpx;
|
||||
|
||||
&:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
}
|
||||
|
||||
.task-label {
|
||||
font-size: 26rpx;
|
||||
color: #999999;
|
||||
}
|
||||
|
||||
.task-value {
|
||||
font-size: 26rpx;
|
||||
color: #333333;
|
||||
}
|
||||
|
||||
.task-num {
|
||||
font-weight: 600;
|
||||
color: #1a3a5c;
|
||||
}
|
||||
|
||||
.task-urgent {
|
||||
margin-top: 12rpx;
|
||||
padding: 8rpx 16rpx;
|
||||
background: rgba(255, 59, 48, 0.1);
|
||||
border-radius: 8rpx;
|
||||
align-self: flex-start;
|
||||
}
|
||||
|
||||
.urgent-text {
|
||||
font-size: 22rpx;
|
||||
color: #ff3b30;
|
||||
font-weight: 600;
|
||||
}
|
||||
|
||||
.loading-state,
|
||||
.empty-state,
|
||||
.no-more-state {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: 200rpx;
|
||||
}
|
||||
|
||||
.loading-text,
|
||||
.empty-text,
|
||||
.no-more-text {
|
||||
font-size: 28rpx;
|
||||
color: #999999;
|
||||
}
|
||||
</style>
|
||||
Loading…
Reference in New Issue