diff --git a/src/modules/first-leg/components/FirstLegOrderEditorShell.vue b/src/modules/first-leg/components/FirstLegOrderEditorShell.vue index 9bf5a06..d790f7b 100644 --- a/src/modules/first-leg/components/FirstLegOrderEditorShell.vue +++ b/src/modules/first-leg/components/FirstLegOrderEditorShell.vue @@ -47,7 +47,7 @@ const emit = defineEmits<{ .editor-page-nav span { color: var(--muted); font-size: 12px; } .editor-page-body { padding: 26px 32px 34px; } .editor-page-footer { position: sticky; z-index: 3; bottom: 0; display: flex; justify-content: center; padding: 12px 24px; border-top: 1px solid #edf0f5; background: rgba(255, 255, 255, 0.96); box-shadow: 0 -6px 18px rgba(15, 31, 58, .06); backdrop-filter: blur(10px); } -.editor-page-footer :deep(.editor-actions) { width: min(100%, 900px); justify-content: flex-start; } +.editor-page-footer :deep(.editor-actions) { width: min(100%, 900px); justify-content: center; } .editor-page-footer :deep(.editor-actions > .el-button) { min-width: 132px; min-height: 42px; } .editor-page-footer :deep(.editor-actions > .el-button:last-child) { min-width: 172px; } :global(.first-leg-editor-dialog.el-dialog) { display: flex; max-width: 1500px; height: 94vh; margin-bottom: 0; flex-direction: column; overflow: hidden; border-radius: 6px; } diff --git a/src/modules/first-leg/views/FirstLegOrdersView.test.mjs b/src/modules/first-leg/views/FirstLegOrdersView.test.mjs index 4c465a1..68d679a 100644 --- a/src/modules/first-leg/views/FirstLegOrdersView.test.mjs +++ b/src/modules/first-leg/views/FirstLegOrdersView.test.mjs @@ -26,6 +26,7 @@ test('opens order creation as a dedicated protected page while keeping draft edi assert.match(editorShellSource, /width="94vw"/) assert.doesNotMatch(editorShellSource, / { @@ -330,6 +331,7 @@ test('collects the backend-required first-leg fields', () => { test('distills order creation into the confirmed prototype sections with server pricing', () => { const cargoTableSource = source.slice(source.indexOf(''), source.indexOf('
', source.indexOf(''))) + const cargoToolbarSource = source.slice(source.indexOf('
'), source.indexOf('
', source.indexOf('
'))) assert.match(source, /

目的地信息<\/h3>/) assert.match(source, /

客户下单<\/h3>/) assert.match(source, /

货物明细<\/h3>/) @@ -339,11 +341,16 @@ test('distills order creation into the confirmed prototype sections with server assert.match(source, /class="prototype-form-row prototype-form-row--tabs"/) assert.match(source, /

/) assert.match(source, /auth\.hasPermission\('order:first-leg:create'\)[\s\S]*批量导入订单/) - assert.doesNotMatch(source, /create-batch-import-entry|需要一次创建多条订单|页面上方“Excel 批量导入”/) + assert.doesNotMatch(source, /create-batch-import-entry/) + assert.match(cargoToolbarSource, /isCreatePage && !routeDraftId && canCreateOrder/) + assert.match(cargoToolbarSource, /downloadBatchTemplate[\s\S]*下载 Excel 模板/) + assert.match(cargoToolbarSource, /openBatchImport[\s\S]*Excel 批量导入/) + assert.match(cargoToolbarSource, /Excel 导入用于一次创建多条订单草稿/) assert.match(source, /导入成功的数据只创建草稿,不会直接提交审核/) assert.match(source, /下载正式模板[\s\S]*选择 Excel/) assert.match(source, /仅支持 \.xlsx,文件不超过 5MB、最多 50 行/) - assert.match(source, /cargo\.woodenProduct(true\/false)[\s\S]*customsInspection 必须填写 true/) + assert.match(source, /直接选择模板内的中文下拉项,不需要填写英文代码或内部编号/) + assert.match(source, /选择木制品时,模板会要求同步选择需要商检/) assert.match(source, /下载 Excel 错误报告/) assert.match(source, /batchImportError[\s\S]*requestId[\s\S]*traceId/) assert.match(source, /添加行[\s\S]*删除所选行/) diff --git a/src/modules/first-leg/views/FirstLegOrdersView.vue b/src/modules/first-leg/views/FirstLegOrdersView.vue index aa0f9db..01ae10a 100644 --- a/src/modules/first-leg/views/FirstLegOrdersView.vue +++ b/src/modules/first-leg/views/FirstLegOrdersView.vue @@ -1931,7 +1931,12 @@ async function searchOrders(model: QueryModel) {

货物明细

- 可逐行维护货物明细;批量订单请返回订单列表使用正式 Excel 导入。 +
+ 下载 Excel 模板 + Excel 批量导入 + Excel 导入用于一次创建多条订单草稿。 +
+ 可逐行维护货物明细。
添加行删除所选行
@@ -2001,7 +2006,7 @@ async function searchOrders(model: QueryModel) {
- +