diff --git a/src/modules/overseas-master-data/pages/CapacityOfferDetailView.vue b/src/modules/overseas-master-data/pages/CapacityOfferDetailView.vue index 8cf28818..263fc536 100644 --- a/src/modules/overseas-master-data/pages/CapacityOfferDetailView.vue +++ b/src/modules/overseas-master-data/pages/CapacityOfferDetailView.vue @@ -53,11 +53,14 @@ async function load() { try { const value = await getCapacityOffer(String(route.params.offerNo)) let checked: CapacityInquiry | null = null + // 当前只读展示余位,旧登记深链不再打开登记窗口;原流程保留。 + if (false) { if (typeof route.query?.inquiry === 'string' && /^[A-Z][A-Z0-9-]{1,63}$/.test(route.query.inquiry)) { const returned = await getCapacityInquiry(route.query.inquiry) if (returned.offerNo !== value.offer.offerNo) throw new Error('登记不属于当前发布') if (current === sequence) { checked = returned; readonly.value = true; confirmMode.value = false; editorOpen.value = true } } else if (editing.value && editorOpen.value) checked = value.inquiries.records.find(row => row.bookingNo === editing.value?.bookingNo) || await getCapacityInquiry(editing.value.bookingNo) + } if (current === sequence) { resetting = true; detail.value = value; if (checked) editing.value = checked; page.value = value.inquiries.page; size.value = value.inquiries.size; queueMicrotask(() => { resetting = false }) } } catch (cause) { if (current === sequence) { detail.value = null; error.value = getApiErrorDetails(cause, '发布详情读取失败') } } @@ -90,18 +93,18 @@ watch([page, size], loadInquiries) onBeforeUnmount(() => { followupSequence++; sequence++; inquirySequence++ }) diff --git a/src/modules/overseas-master-data/pages/CapacityOffersView.vue b/src/modules/overseas-master-data/pages/CapacityOffersView.vue index e8f42d19..c3c3439f 100644 --- a/src/modules/overseas-master-data/pages/CapacityOffersView.vue +++ b/src/modules/overseas-master-data/pages/CapacityOffersView.vue @@ -18,10 +18,12 @@ import { listLooseboardDemands, listCapacityOffers, listCapacityInquiries, getCa import { offerStatusLabels, inquiryStatusLabels, offerTime, loadText, type LooseboardDemand, type CapacityOffer, type CapacityInquiry, type InquiryResult, type OfferQuery, type InquiryQuery } from '../capacityOfferTypes' import { inquirySourceQuery, inquiryOrderTarget } from '../inquiryNavigation' import { useCapacityInquiryCommands } from '../useCapacityInquiryCommands' +import { false } from '../capacityOfferFeatures' const router = useRouter(), access = useAccessPreviewStore() const manage = computed(() => access.can('platform:fleet:capacity-offer:manage')) -const tab = ref<'offers' | 'inquiries' | 'demands'>(manage.value ? 'inquiries' : 'offers') -const filters = ref(manage.value ? { scope: 'TODO' } : {}), applied = ref({ ...filters.value }) +// 当前只展示余位需求池;登记、原单匹配及履约模板直接隐藏,原实现保留。 +const tab = ref<'offers' | 'inquiries' | 'demands'>('offers') +const filters = ref({}), applied = ref({ ...filters.value }) const page = ref(1), size = ref(20), total = ref(0), loading = ref(false), error = ref(null) const offers = ref([]), inquiries = ref([]) const editorOpen = ref(false), editing = ref(null), selectedOffer = ref(null), readonly = ref(true) @@ -56,8 +58,8 @@ let sequence = 0, editorSequence = 0 const fields = computed(() => tab.value === 'offers' ? [ { key: 'origin', label: '起运仓', type: 'input', placeholder: '起运仓名称', width: 170 }, { key: 'destination', label: '目的站', type: 'input', placeholder: '目的站名称', width: 170 }, { key: 'departureFrom', label: '发车起日', type: 'date', placeholder: '发车起日', width: 170 }, { key: 'departureTo', label: '发车止日', type: 'date', placeholder: '发车止日', width: 170 }, - { key: 'canConfirm', label: '接单资格', type: 'select', placeholder: '全部接单资格', width: 150, options: [{ value: 'true', label: '可确认承运' }, { value: 'false', label: '暂不可确认' }] }, - ...(manage.value ? [{ key: 'scope', label: '发布范围', type: 'select', placeholder: '可登记意向', width: 180, options: [{ value: 'AVAILABLE', label: '可登记意向' }, { value: 'ALL', label: '全部发布(含历史)' }] } as QueryField, { key: 'status', label: '发布状态', type: 'select', placeholder: '全部发布状态', width: 140, options: Object.entries(offerStatusLabels).map(([value, label]) => ({ value, label })) } as QueryField] : []), + { key: 'canConfirm', label: '余位状态', type: 'select', placeholder: '全部状态', width: 150, options: [{ value: 'true', label: '余位已核对' }, { value: 'false', label: '待核对或不可承运' }] }, + ...(manage.value ? [{ key: 'scope', label: '发布范围', type: 'select', placeholder: '当前发布', width: 180, options: [{ value: 'AVAILABLE', label: '当前发布' }, { value: 'ALL', label: '全部发布(含历史)' }] } as QueryField, { key: 'status', label: '发布状态', type: 'select', placeholder: '全部发布状态', width: 140, options: Object.entries(offerStatusLabels).map(([value, label]) => ({ value, label })) } as QueryField] : []), ] : tab.value === 'demands' ? [{ key: 'keyword', label: '需求关键词', type: 'input', placeholder: '原单号 / 起运地 / 目的地', width: 280 }] : [ { key: 'keyword', label: '意向关键词', type: 'input', placeholder: '预订号 / 客户 / 车次', width: 260 }, { key: 'status', label: '意向状态', type: 'select', placeholder: '全部状态', width: 150, options: Object.entries(inquiryStatusLabels).map(([value, label]) => ({ value, label })) }, @@ -68,7 +70,7 @@ const columns = computed(() => [ { key: 'warehouseName', label: '起运仓', minWidth: 155 }, { key: 'destinations', label: '目的站与可接余位', minWidth: 310, slotName: 'destinations', singleLine: false }, { key: 'plannedDepartureAt', label: '发车 / 最晚送仓', minWidth: 195, slotName: 'times' }, ...(manage.value ? [{ key: 'segments', label: '分段计划占用 / 外接预留', minWidth: 320, slotName: 'loads', singleLine: false }] : []), - { key: 'status', label: '接单状态', minWidth: 170, slotName: 'status', singleLine: false }, { key: 'contactName', label: '调度联系信息', minWidth: 180, slotName: 'contact' }, + { key: 'status', label: '发布状态', minWidth: 170, slotName: 'status', singleLine: false }, { key: 'contactName', label: '调度联系信息', minWidth: 180, slotName: 'contact' }, ]) const canCreate = computed(() => manage.value || access.can('platform:fleet:capacity-offer:list') && access.can('platform:fleet:capacity-offer:inquiry-create')) async function create(row: CapacityOffer) { @@ -77,7 +79,7 @@ async function create(row: CapacityOffer) { try { const value = await getCapacityOffer(row.offerNo); if (current !== editorSequence) return; selectedOffer.value = value.offer; confirmMode.value = false; editing.value = null; readonly.value = false; editorOpen.value = true } catch (cause) { if (current === editorSequence) error.value = getApiErrorDetails(cause, '登记信息读取失败') } } -function switchTab(value: 'offers' | 'inquiries' | 'demands') { if (tab.value === value) return; filters.value = {}; applied.value = {}; page.value = 1; total.value = 0; tab.value = value } +function switchTab(value: 'offers' | 'inquiries' | 'demands') { if (value !== 'offers' || tab.value === value) return; filters.value = {}; applied.value = {}; page.value = 1; total.value = 0; tab.value = value } async function load() { const current = ++sequence; loading.value = true; error.value = null try { @@ -104,6 +106,7 @@ function accept(value: InquiryResult) { } const commands = useCapacityInquiryCommands('capacity-pool-command', accept) async function inquiryAction(key: string, row: CapacityInquiry) { + if (!false) return followupSequence++ if (openFulfillment(key, row)) return if (key === 'cancel') { await commands.run(row, key); return } @@ -129,30 +132,30 @@ watch([tab, page, size], load); onMounted(load); onBeforeUnmount(() => { followu diff --git a/src/modules/overseas-master-data/routes.ts b/src/modules/overseas-master-data/routes.ts index 34c4ecde..766301f6 100644 --- a/src/modules/overseas-master-data/routes.ts +++ b/src/modules/overseas-master-data/routes.ts @@ -6,13 +6,13 @@ export const overseasMasterDataRoutes = [ path: 'overseas-master-data/capacity-offers', name: 'overseas-master-data-capacity-offers', component: () => import('./pages/CapacityOffersView.vue'), - meta: { title: '散板需求', description: '查看车次可接运力并跟进拼车意向', permission: permission.capacityOfferList, permissionAnyOf: [permission.capacityOfferManage], showPageHeading: false }, + meta: { title: '散板需求', description: '查看车次余位与调度联系方式', permission: permission.capacityOfferList, permissionAnyOf: [permission.capacityOfferManage], showPageHeading: false }, }, { path: 'overseas-master-data/capacity-offers/:offerNo', name: 'overseas-master-data-capacity-offer-detail', component: () => import('./pages/CapacityOfferDetailView.vue'), - meta: { title: '散板需求详情', description: '核对可接运力与本车拼车意向', permission: permission.capacityOfferList, permissionAnyOf: [permission.capacityOfferManage], showPageHeading: false }, + meta: { title: '散板需求详情', description: '查看车次分段余位与调度联系方式', permission: permission.capacityOfferList, permissionAnyOf: [permission.capacityOfferManage], showPageHeading: false }, }, { path: 'overseas-master-data/fleet-quotes',