This commit is contained in:
2026-08-17 17:49:10 +08:00
parent 911a3620e1
commit c7334b2cf8
30 changed files with 1043 additions and 249 deletions
@@ -151,11 +151,14 @@ describe('UnifiedOrdersView contract', () => {
it('keeps only confirmed business actions as explicit boundaries', () => {
expect(source).toContain('nextActionBoundary')
expect(source).not.toContain('class="action-boundary"')
expect(source).toContain("can('platform:firstleg:inbound:view')")
expect(source).toContain("can('platform:firstleg:inbound:measure:view')")
expect(source).toContain('openMeasurement')
expect(source).toContain('<InboundMeasurementPanel')
expect(source).toContain('width="min(1180px, calc(100vw - 32px))"')
expect(source).toContain('<InboundMeasurementDialog')
expect(source).toContain('measurementDialogOpen.value = true')
expect(source).toContain('@updated="handleMeasurementUpdated"')
expect(source).toContain('@submitted="handleMeasurementSubmitted"')
expect(source).not.toContain('<InboundMeasurementPanel')
expect(source).not.toContain('class="inbound-task-dialog"')
expect(source).not.toContain("name: 'inbound-order-detail'")
expect(source).not.toContain('openInboundFromDetail')
expect(source).not.toContain('inbound-code-link')
@@ -50,7 +50,7 @@ import {
import {
downloadWeightImage,
getInboundMeasurement,
InboundMeasurementPanel,
InboundMeasurementDialog,
type InboundMeasurementDetail,
} from '@/modules/inbounds'
import {
@@ -644,17 +644,23 @@ async function openDetail(row: UnifiedOrderResource) {
}
function openMeasurement(row: UnifiedOrderResource) {
if (!row.inboundId || !can('platform:firstleg:inbound:view')) return
if (!row.inboundId || !can('platform:firstleg:inbound:measure:view')) return
measurementOrder.value = row
measurementDialogOpen.value = true
}
function handleMeasurementChanged() {
measurementDialogOpen.value = false
measurementOrder.value = null
function handleMeasurementUpdated() {
void loadOrders()
}
function handleMeasurementSubmitted() {
void loadOrders()
}
function clearMeasurementOrder() {
measurementOrder.value = null
}
type UnifiedOrderRowAction = 'note' | 'approve' | 'measurement'
const unifiedOrderRowActionIcons: Record<UnifiedOrderRowAction, Component> = {
note: StickyNote,
@@ -665,7 +671,7 @@ function unifiedOrderSecondaryActions(row: UnifiedOrderResource): UnifiedOrderRo
return [
...(can('platform:order:note') ? ['note' as const] : []),
...(canApprove(row) ? ['approve' as const] : []),
...(row.mainStatus === 'WAIT_MEASURE' && row.inboundId && can('platform:firstleg:inbound:view') ? ['measurement' as const] : []),
...(row.mainStatus === 'WAIT_MEASURE' && row.inboundId && can('platform:firstleg:inbound:measure:view') ? ['measurement' as const] : []),
]
}
function directUnifiedOrderActions(row: UnifiedOrderResource) {
@@ -1048,23 +1054,16 @@ onMounted(() => {
<el-alert title="确认订单资料无误后审核通过,订单将进入待测量阶段。" type="info" :closable="false" show-icon />
</AppDialog>
<el-dialog
<InboundMeasurementDialog
v-if="measurementOrder?.inboundId"
v-model="measurementDialogOpen"
:title="measurementOrder?.inboundCode ? `测量 · ${measurementOrder.inboundCode}` : '测量'"
width="min(1180px, calc(100vw - 32px))"
top="4vh"
destroy-on-close
append-to-body
class="inbound-task-dialog"
@closed="measurementOrder = null"
>
<InboundMeasurementPanel
v-if="measurementOrder?.inboundId"
:tenant-id="String(measurementOrder.tenantId)"
:inbound-id="String(measurementOrder.inboundId)"
@changed="handleMeasurementChanged"
/>
</el-dialog>
:customer-id="String(measurementOrder.tenantId)"
:inbound-id="String(measurementOrder.inboundId)"
:inbound-code="measurementOrder.inboundCode"
@updated="handleMeasurementUpdated"
@submitted="handleMeasurementSubmitted"
@closed="clearMeasurementOrder"
/>
</section>
</AdminPage>