优化构架

This commit is contained in:
2026-08-03 18:52:30 +08:00
parent 35c713a7ca
commit fed46f42ef
59 changed files with 691 additions and 325 deletions
@@ -1,5 +1,5 @@
import { getMerchantPartnerCandidates, type MerchantPartner } from '@/api/partners'
import type { FirstLegParty, FirstLegPartyRole } from '@/data/firstLegParties'
import { getMerchantPartnerCandidates, type MerchantPartner } from '@/modules/first-leg/api/partners'
import type { FirstLegParty, FirstLegPartyRole } from '@/modules/first-leg/data/firstLegParties'
export interface FirstLegPartySource {
listAvailable(role: FirstLegPartyRole): readonly FirstLegParty[]
+2
View File
@@ -0,0 +1,2 @@
export { useFirstLegOrdersStore } from './store/firstLegOrders'
export { getFirstLegStatusLabel, getFirstLegStatusTone } from './utils/firstLegOrder'
+40
View File
@@ -0,0 +1,40 @@
import { FileText, Package, Ship, Zap } from '@lucide/vue'
import type { ClientModuleManifest } from '../types.ts'
export const firstLegModule = {
key: 'first-leg',
navigationGroup: { title: '头程物流', icon: Ship },
routes: [
{
path: 'orders/first-leg',
name: 'first-leg-orders',
component: () => import('./views/FirstLegOrdersView.vue'),
release: 'active',
meta: { title: '头程订单', description: '创建、查询并跟进本企业头程订单', permission: 'order:first-leg:list' },
navigation: { key: 'first-leg-orders', title: '头程下单', icon: FileText },
},
{
path: 'orders/first-leg/create',
name: 'first-leg-order-create',
component: () => import('./views/FirstLegOrdersView.vue'),
release: 'active',
meta: { title: '创建头程订单', description: '填写发货、目的地和货物信息', permission: 'order:first-leg:create' },
},
{
path: 'first-leg/import',
name: 'first-leg-import',
component: () => import('./views/BatchImportView.vue'),
release: 'prototype',
meta: { title: '一键导入', description: '批量导入头程订单', permission: 'merchant:first-leg:import' },
navigation: { key: 'first-leg-import', icon: Package },
},
{
path: 'first-leg/quick-order',
name: 'first-leg-quick-order',
component: () => import('./views/QuickOrderView.vue'),
release: 'prototype',
meta: { title: '快速下单', description: '快速创建头程订单', permission: 'merchant:first-leg:quick-create' },
navigation: { key: 'first-leg-quick-order', icon: Zap },
},
],
} satisfies ClientModuleManifest
@@ -14,12 +14,12 @@ import {
type MerchantFirstLegOrder,
type MerchantFirstLegOrderDetail,
type MerchantWarehouse,
} from '@/api/firstLeg'
import type { MerchantTenantStatus } from '@/api/merchantIam'
} from '@/modules/first-leg/api/firstLeg'
import type { MerchantTenantStatus } from '@/modules/tenant-management/public'
import type { PlatformReceivingWarehouse, PlatformReceivingWarehouseSnapshot } from '@chongchong/shared'
import type { FirstLegPartySnapshot } from '@/data/firstLegParties'
import type { FirstLegOrder, FirstLegOrderDraft, FirstLegOrderTimelineItem } from '@/types/firstLegOrder'
import { canClientEditFirstLegOrder } from '@/utils/firstLegOrder'
import type { FirstLegPartySnapshot } from '@/modules/first-leg/data/firstLegParties'
import type { FirstLegOrder, FirstLegOrderDraft, FirstLegOrderTimelineItem } from '@/modules/first-leg/types/firstLegOrder'
import { canClientEditFirstLegOrder } from '@/modules/first-leg/utils/firstLegOrder'
const countryCodes: Readonly<Record<string, string>> = {
中国: 'CN', 美国: 'US', 德国: 'DE', 英国: 'GB', 加拿大: 'CA', 日本: 'JP', 澳大利亚: 'AU',
@@ -1,5 +1,5 @@
<script setup lang="ts">
import PrototypeFeatureView from '@/views/prototype/PrototypeFeatureView.vue'
import PrototypeFeatureView from '@/components/common/PrototypeFeatureView.vue'
</script>
<template><PrototypeFeatureView title="一键导入" description="批量导入头程订单" /></template>
@@ -3,15 +3,15 @@ import { readFileSync } from 'node:fs'
import test from 'node:test'
const source = readFileSync(new URL('./FirstLegOrdersView.vue', import.meta.url), 'utf8')
const routerSource = readFileSync(new URL('../router/index.ts', import.meta.url), 'utf8')
const editorShellSource = readFileSync(new URL('../components/first-leg/FirstLegOrderEditorShell.vue', import.meta.url), 'utf8')
const routerSource = readFileSync(new URL('../routes.ts', import.meta.url), 'utf8')
const editorShellSource = readFileSync(new URL('../components/FirstLegOrderEditorShell.vue', import.meta.url), 'utf8')
test('routes the confirmed first-leg path to the implemented order view', () => {
assert.match(routerSource, /path: 'orders\/first-leg'.*FirstLegOrdersView\.vue/)
assert.match(routerSource, /path: 'orders\/first-leg'[\s\S]*?component: \(\) => import\('\.\/views\/FirstLegOrdersView\.vue'\)[\s\S]*?release: 'active'/)
})
test('opens order creation as a dedicated protected page while keeping draft editing in a drawer', () => {
assert.match(routerSource, /path: 'orders\/first-leg\/create'.*name: 'first-leg-order-create'.*permission: 'order:first-leg:create'/)
assert.match(routerSource, /path: 'orders\/first-leg\/create'[\s\S]*?name: 'first-leg-order-create'[\s\S]*?release: 'active'[\s\S]*?permission: 'order:first-leg:create'/)
assert.match(source, /router\.push\(\{ name: 'first-leg-order-create' \}\)/)
assert.match(source, /const isCreatePage = computed\(\(\) => route\.name === 'first-leg-order-create'\)/)
assert.match(source, /<FirstLegOrderEditorShell[^>]*:page="isCreatePage"/)
@@ -6,13 +6,13 @@ import { AlertTriangle, Box, Eye, FilePlus2, MapPin, PackageCheck, Pencil, Plus,
import { FIRST_LEG_ORDER_STATUSES, FIRST_LEG_TRANSPORT_MODES, type FirstLegOrderStatus } from '@chongchong/shared'
import QueryToolbar, { type QueryField, type QueryModel } from '@/components/common/QueryToolbar.vue'
import DataTable, { type DataTableColumn } from '@/components/common/DataTable.vue'
import FirstLegOrderEditorShell from '@/components/first-leg/FirstLegOrderEditorShell.vue'
import { useFirstLegOrdersStore } from '@/stores/firstLegOrders'
import { useTenantAdministrationStore } from '@/stores/tenantAdministration'
import { useAuthStore } from '@/stores/auth'
import { createFirstLegPartySnapshot, type FirstLegPartyRole } from '@/data/firstLegParties'
import { firstLegPartySource } from '@/data/firstLegPartySource'
import type { FirstLegOrder, FirstLegOrderDraft } from '@/types/firstLegOrder'
import FirstLegOrderEditorShell from '@/modules/first-leg/components/FirstLegOrderEditorShell.vue'
import { useFirstLegOrdersStore } from '@/modules/first-leg/store/firstLegOrders'
import { useTenantAdministrationStore } from '@/modules/tenant-management/public'
import { useAuthStore } from '@/modules/auth/public'
import { createFirstLegPartySnapshot, type FirstLegPartyRole } from '@/modules/first-leg/data/firstLegParties'
import { firstLegPartySource } from '@/modules/first-leg/data/firstLegPartySource'
import type { FirstLegOrder, FirstLegOrderDraft } from '@/modules/first-leg/types/firstLegOrder'
import {
canClientEditFirstLegOrder,
createEmptyCargoItem,
@@ -21,7 +21,7 @@ import {
getFirstLegTransportModeLabel,
summarizeFirstLegCargo,
validateFirstLegOrderDraft,
} from '@/utils/firstLegOrder'
} from '@/modules/first-leg/utils/firstLegOrder'
const store = useFirstLegOrdersStore()
const tenantStore = useTenantAdministrationStore()
@@ -1,5 +1,5 @@
<script setup lang="ts">
import PrototypeFeatureView from '@/views/prototype/PrototypeFeatureView.vue'
import PrototypeFeatureView from '@/components/common/PrototypeFeatureView.vue'
</script>
<template><PrototypeFeatureView title="快速下单" description="快速创建头程订单" /></template>