优化
This commit is contained in:
@@ -1,7 +1,7 @@
|
||||
<script setup lang="ts">
|
||||
import { computed, onMounted, reactive, ref } from 'vue'
|
||||
import { Eye } from '@lucide/vue'
|
||||
import { ElMessage } from 'element-plus'
|
||||
import { ElMessage, ElMessageBox } from 'element-plus'
|
||||
import { useRouter } from 'vue-router'
|
||||
import { getApiErrorDetails, type ApiErrorDetails } from '@/shared/api/http'
|
||||
import AdminPage from '@/shared/components/AdminPage.vue'
|
||||
@@ -12,7 +12,7 @@ import ListPageLayout from '@/shared/components/ListPageLayout.vue'
|
||||
import LoadErrorState from '@/shared/components/LoadErrorState.vue'
|
||||
import OperationErrorToast from '@/shared/components/OperationErrorToast.vue'
|
||||
import QueryToolbar, { type QueryField, type QueryModel } from '@/shared/components/QueryToolbar.vue'
|
||||
import { convertLastMileOrderToInboundPlan, listLastMileOrders, transferLastMileOrders } from '../api/lastMileOrders'
|
||||
import { convertLastMileOrderToInboundPlan, listLastMileOrders, setLastMileOrderDetained, setLastMileOrderPalletMergeRequired, transferLastMileOrders } from '../api/lastMileOrders'
|
||||
import { useAccessPreviewStore } from '@/core/access/accessPreview'
|
||||
import { overseasWarehousePermissions as permission } from '../permissions'
|
||||
import { toLastMileOrderListItem } from '../lastMilePresentation'
|
||||
@@ -30,6 +30,9 @@ const selectedRows = ref<LastMileOrderListItem[]>([])
|
||||
const actionLoading = ref(false)
|
||||
const actionError = ref<ApiErrorDetails | null>(null)
|
||||
const transferOpen = ref(false)
|
||||
const detainedOpen = ref(false)
|
||||
const detainedTarget = ref<LastMileOrderListItem | null>(null)
|
||||
const detainedRemark = ref('')
|
||||
const transferForm = reactive({ warehouseId: '', warehouseCode: '', warehouseName: '', remark: '' })
|
||||
const statusTab = ref<'全部' | '待分配'>('全部')
|
||||
const filters = ref<QueryModel>({ orderNo: '', orderType: '', warehouse: '', inboundCode: '', sourceOrderNo: '', containerNo: '', status: '', transferWarehouseCode: '', abnormal: '', detained: '', createdAt: [] })
|
||||
@@ -58,7 +61,7 @@ const fields = computed<QueryField[]>(() => [
|
||||
{ key: 'createdAt', type: 'daterange', label: '创建时间' },
|
||||
])
|
||||
const columns: DataTableColumn[] = [
|
||||
{ key: 'actions', label: '操作', width: 110, fixed: 'left', slotName: 'actions' },
|
||||
{ key: 'actions', label: '操作', width: 270, fixed: 'left', slotName: 'actions' },
|
||||
{ key: 'selection', type: 'selection', width: 48, fixed: 'left' },
|
||||
{ key: 'orderNo', prop: 'orderNo', label: '尾程单号', minWidth: 170 },
|
||||
{ key: 'warning', prop: 'warning', label: '预警', width: 90 },
|
||||
@@ -139,6 +142,42 @@ function openTransfer() {
|
||||
actionError.value = null
|
||||
transferOpen.value = true
|
||||
}
|
||||
function openDetained(row: LastMileOrderListItem) {
|
||||
detainedTarget.value = row
|
||||
detainedRemark.value = ''
|
||||
actionError.value = null
|
||||
detainedOpen.value = true
|
||||
}
|
||||
async function submitDetained() {
|
||||
const target = detainedTarget.value
|
||||
if (!target) return
|
||||
if (!detainedRemark.value.trim()) { ElMessage.warning('请填写操作备注'); return }
|
||||
actionLoading.value = true; actionError.value = null
|
||||
try {
|
||||
await setLastMileOrderDetained(target.id, { detained: !target.detained, remark: detainedRemark.value.trim() })
|
||||
detainedOpen.value = false; detainedTarget.value = null
|
||||
ElMessage.success(target.detained ? '已解除暂扣,库存已转为可用' : '已标记暂扣,后续入库将进入暂扣库存')
|
||||
await load()
|
||||
} catch (error) { actionError.value = getApiErrorDetails(error, target.detained ? '解除暂扣失败,请重试' : '暂扣失败,请重试') }
|
||||
finally { actionLoading.value = false }
|
||||
}
|
||||
async function togglePalletMerge(row: LastMileOrderListItem) {
|
||||
const required = row.palletMergeFlag !== 'REQUIRED'
|
||||
try {
|
||||
await ElMessageBox.confirm(
|
||||
required ? `标记后,PDA扫描入仓码 ${row.inboundCode} 的箱唛时会显示合托提示。` : '确认取消该订单的PDA合托提示?',
|
||||
required ? '合托标记' : '取消合托标记',
|
||||
{ type: 'warning', confirmButtonText: required ? '确认标记' : '确认取消', cancelButtonText: '返回' },
|
||||
)
|
||||
} catch { return }
|
||||
actionLoading.value = true; actionError.value = null
|
||||
try {
|
||||
await setLastMileOrderPalletMergeRequired(row.id, { palletMergeRequired: required })
|
||||
ElMessage.success(required ? '已标记合托,PDA扫描箱唛时将显示提示' : '已取消合托标记')
|
||||
await load()
|
||||
} catch (error) { actionError.value = getApiErrorDetails(error, required ? '合托标记失败,请重试' : '取消合托标记失败,请重试') }
|
||||
finally { actionLoading.value = false }
|
||||
}
|
||||
async function submitTransfer() {
|
||||
if (!transferForm.warehouseId.trim() || !transferForm.warehouseCode.trim() || !transferForm.warehouseName.trim()) {
|
||||
ElMessage.warning('请填写目的仓 ID、代码和名称')
|
||||
@@ -185,9 +224,9 @@ onMounted(() => { void load() })
|
||||
<template #details><ApiErrorMeta :details="loadError" /></template>
|
||||
</LoadErrorState>
|
||||
</template>
|
||||
<section v-if="!loadError" class="surface-panel table-panel"><DataTable v-model:page="page" v-model:page-size="pageSize" :data="rows" :columns="columns" :loading="loading" :total="total" preference-key="overseas-last-mile-orders" row-key="id" empty-text="暂无尾程订单" @selection-change="onSelectionChange" @update:page="load()" @update:page-size="page = 1; load()">
|
||||
<section v-if="!loadError" class="surface-panel table-panel"><DataTable v-model:page="page" v-model:page-size="pageSize" :data="rows" :columns="columns" :loading="loading" :total="total" preference-key="overseas-last-mile-orders" row-key="id" empty-text="暂无尾程订单" :row-class-name="({ row }: { row: LastMileOrderListItem }) => row.detained ? 'is-detained-row' : ''" @selection-change="onSelectionChange" @update:page="load()" @update:page-size="page = 1; load()">
|
||||
<template #toolbar-actions><el-button v-if="access.can(permission.lastMileOrderTransfer)" plain :disabled="!selectedRows.length || actionLoading" @click="openTransfer">转仓</el-button><el-button v-if="access.can(permission.inboundOrderCreate)" type="primary" plain :disabled="selectedRows.length !== 1 || actionLoading" @click="convertInboundPlan">生成入库计划</el-button></template>
|
||||
<template #actions="{ row }"><el-button size="small" plain type="primary" @click="openDetail(row)"><Eye :size="15" />查看</el-button></template>
|
||||
<template #actions="{ row }"><el-button size="small" plain type="primary" @click="openDetail(row)"><Eye :size="15" />查看</el-button><el-button v-if="access.can(permission.lastMileOrderTransfer)" size="small" plain :type="(row as LastMileOrderListItem).detained ? 'success' : 'danger'" :disabled="actionLoading" @click="openDetained(row as LastMileOrderListItem)">{{ (row as LastMileOrderListItem).detained ? '解除暂扣' : '暂扣' }}</el-button><el-button v-if="access.can(permission.lastMileOrderTransfer) && (row as LastMileOrderListItem).palletMergeFlag !== 'MERGED'" size="small" plain :type="(row as LastMileOrderListItem).palletMergeFlag === 'REQUIRED' ? 'warning' : 'primary'" :disabled="actionLoading" @click="togglePalletMerge(row as LastMileOrderListItem)">{{ (row as LastMileOrderListItem).palletMergeFlag === 'REQUIRED' ? '取消合托' : '合托标记' }}</el-button></template>
|
||||
<template #pagination-left>共 {{ total }} 条尾程订单 · 已选 {{ selectedRows.length }} 条</template>
|
||||
</DataTable></section>
|
||||
</ListPageLayout></AdminPage>
|
||||
@@ -199,9 +238,14 @@ onMounted(() => { void load() })
|
||||
<el-form-item label="备注"><el-input v-model="transferForm.remark" type="textarea" maxlength="500" /></el-form-item>
|
||||
</el-form>
|
||||
</AppDialog>
|
||||
<AppDialog v-model="detainedOpen" :title="detainedTarget?.detained ? '解除暂扣' : '暂扣订单'" :confirm-text="detainedTarget?.detained ? '确认解除' : '确认暂扣'" :confirm-loading="actionLoading" @confirm="submitDetained">
|
||||
<el-form label-position="top"><el-form-item label="操作备注" required><el-input v-model="detainedRemark" type="textarea" :rows="4" maxlength="500" show-word-limit placeholder="请填写暂扣或解除原因" /></el-form-item></el-form>
|
||||
</AppDialog>
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.last-mile-toolbar { padding: 14px 16px 0; }
|
||||
.last-mile-toolbar :deep(.query-toolbar) { margin-top: 12px; padding: 12px 0 16px; border: 0; border-top: 1px solid var(--cc-border); border-radius: 0; }
|
||||
.table-panel :deep(.el-table .is-detained-row > td.el-table__cell) { background: #fff1f0 !important; color: #b42318; }
|
||||
.table-panel :deep(.el-table .is-detained-row:hover > td.el-table__cell) { background: #ffe4e1 !important; }
|
||||
</style>
|
||||
|
||||
Reference in New Issue
Block a user