优化
This commit is contained in:
@@ -194,7 +194,7 @@ describe('InboundFeeDetailManager', () => {
|
||||
const dialog = document.querySelector<HTMLElement>('.el-dialog.admin-density-dialog')!
|
||||
expect(dialog).not.toBeNull()
|
||||
expect(dialog.querySelector('.density-form')).not.toBeNull()
|
||||
expect(dialog.style.getPropertyValue('--el-dialog-width')).toBe(action === '编辑' ? 'min(680px, calc(100vw - 28px))' : 'min(560px, calc(100vw - 28px))')
|
||||
expect(dialog.style.getPropertyValue('--el-dialog-width')).toBe(action === '编辑' ? 'min(880px, calc(100vw - 28px))' : 'min(720px, calc(100vw - 28px))')
|
||||
if (action === '驳回') {
|
||||
const confirm = [...dialog.querySelectorAll<HTMLButtonElement>('button')].find(button => button.textContent?.trim() === '确认驳回')!
|
||||
confirm.click()
|
||||
|
||||
@@ -336,7 +336,7 @@ onMounted(() => void load())
|
||||
</div>
|
||||
</template>
|
||||
|
||||
<AppDialog class="admin-density-dialog" v-model="editorOpen" :title="editorMode === 'create' ? '新增费用' : editorMode === 'adjust' ? '调整已审核费用' : '编辑费用'" width="min(680px, calc(100vw - 28px))" :confirm-loading="saving" confirm-text="保存" @confirm="save">
|
||||
<AppDialog class="admin-density-dialog" v-model="editorOpen" :title="editorMode === 'create' ? '新增费用' : editorMode === 'adjust' ? '调整已审核费用' : '编辑费用'" width="min(880px, calc(100vw - 28px))" :confirm-loading="saving" confirm-text="保存" @confirm="save">
|
||||
<el-alert v-if="editorMode === 'adjust'" title="调整将生成新版本并重新进入待审核状态" type="warning" :closable="false" show-icon />
|
||||
<el-alert v-if="selectedFeeItem?.feeCode === privateDeliveryFeeCode" title="私人仓尾程派送费仅适用于目的仓类型为“私人仓”的订单,最终资格由服务端校验。" type="info" :closable="false" show-icon />
|
||||
<el-alert v-if="!canViewFeeItems" title="当前账号缺少费用项目查看权限,无法新增或修改费用" type="warning" :closable="false" show-icon />
|
||||
@@ -369,7 +369,7 @@ onMounted(() => void load())
|
||||
</el-form>
|
||||
</section>
|
||||
</AppDialog>
|
||||
<AppDialog class="admin-density-dialog" v-model="rejectOpen" title="驳回费用" :confirm-loading="saving" confirm-text="确认驳回" confirm-type="warning" @confirm="reject">
|
||||
<AppDialog class="admin-density-dialog" v-model="rejectOpen" title="驳回费用" :confirm-loading="saving" confirm-text="确认驳回" confirm-type="warning" width="min(720px, calc(100vw - 28px))" @confirm="reject">
|
||||
<el-alert v-if="actionError" type="error" :closable="true" @close="actionError = null"><template #title>{{ actionError.message }}</template><ApiErrorMeta :details="actionError" /></el-alert>
|
||||
<el-form class="density-form" label-position="top"><el-form-item label="驳回原因" required><el-input v-model="rejectReason" type="textarea" :rows="4" maxlength="500" show-word-limit placeholder="请输入驳回原因" /></el-form-item></el-form>
|
||||
</AppDialog>
|
||||
|
||||
@@ -63,6 +63,20 @@ describe('OrderDeclarationEditorDialog', () => {
|
||||
expect([...parent.querySelectorAll('.density-dialog-section__title')].map(title => title.textContent)).toEqual(['原订单资料', '订单申报资料', '货品申报明细 不允许新增、删除或调整明细序号'])
|
||||
expect(parent.style.getPropertyValue('--el-dialog-width')).toBe('min(1180px, calc(100vw - 36px))')
|
||||
expect(parent.querySelector('.density-descriptions')).not.toBeNull()
|
||||
const fields = parent.querySelector<HTMLTableElement>('table[aria-label="订单申报资料"]')!
|
||||
expect(fields.rows).toHaveLength(2)
|
||||
expect([...fields.querySelectorAll('.el-form-item__label')].map(label => label.textContent?.trim())).toEqual(['渠道名称', '渠道编码', '预估体积(m³)', '预计到货时间', '客户备注'])
|
||||
expect(fields.rows[1]!.cells[1]!.colSpan).toBe(2)
|
||||
const remark = fields.querySelector<HTMLInputElement>('input[aria-label="客户备注"]')!
|
||||
remark.value = '待保存的客户备注'
|
||||
remark.dispatchEvent(new Event('input', { bubbles: true }))
|
||||
await flushPromises()
|
||||
for (const label of ['展开全屏', '退出全屏']) {
|
||||
parent.querySelector<HTMLButtonElement>(`button[aria-label="${label}"]`)!.click()
|
||||
await flushPromises()
|
||||
expect(parent.querySelector<HTMLInputElement>('input[aria-label="客户备注"]')!.value).toBe('待保存的客户备注')
|
||||
expect(fields.querySelector('[aria-label="渠道编码"]')!.textContent).toBe('OLD')
|
||||
}
|
||||
parent.querySelector<HTMLButtonElement>('.cargo-table .density-action')!.click()
|
||||
await flushPromises()
|
||||
const dialogs = document.querySelectorAll<HTMLElement>('.el-dialog.admin-density-dialog')
|
||||
@@ -97,10 +111,20 @@ describe('OrderDeclarationEditorDialog', () => {
|
||||
expect(listWarehouseLogisticsChannels).toHaveBeenCalledWith('700000000000000001')
|
||||
expect(wrapper.text()).toContain('国内收货仓和中转仓不可修改,如需变更请重新下单')
|
||||
expect(wrapper.text()).toContain('RK-001')
|
||||
const volume = wrapper.findComponent({ name: 'ElInputNumber' })
|
||||
expect(volume.props()).toMatchObject({ min: 0.0001, precision: 4, controls: false, modelValue: 0.625 })
|
||||
volume.vm.$emit('update:modelValue', 0.875)
|
||||
const arrival = wrapper.findComponent({ name: 'ElDatePicker' })
|
||||
expect(arrival.props()).toMatchObject({ type: 'datetime', valueFormat: 'YYYY-MM-DDTHH:mm:ss', format: 'YYYY-MM-DD HH:mm', clearable: true, modelValue: '2026-09-06T10:00:00' })
|
||||
arrival.vm.$emit('update:modelValue', '2026-09-07T11:30:00')
|
||||
const remark = wrapper.get('input[aria-label="客户备注"]')
|
||||
expect(remark.attributes('maxlength')).toBe('1000')
|
||||
await remark.setValue('调整后的客户备注')
|
||||
const channelSelect = wrapper.findAllComponents({ name: 'ElSelect' })[0]!
|
||||
channelSelect.vm.$emit('update:modelValue', 'NEW')
|
||||
channelSelect.vm.$emit('change', 'NEW')
|
||||
await wrapper.vm.$nextTick()
|
||||
expect(wrapper.get('span[aria-label="渠道编码"]').text()).toBe('NEW')
|
||||
await wrapper.get('[data-testid="save"]').trigger('click')
|
||||
await flushPromises()
|
||||
|
||||
@@ -108,7 +132,9 @@ describe('OrderDeclarationEditorDialog', () => {
|
||||
expect(ElMessageBox.confirm).toHaveBeenCalledWith(expect.stringContaining('纸面上的旧渠道文字不会自动变化'), '确认变更渠道', expect.any(Object))
|
||||
expect(updatePlatformUnifiedOrderDeclaration).toHaveBeenCalledWith('208', '90001', expect.objectContaining({
|
||||
expectedVersion: 7,
|
||||
estimatedVolumeCbm: 0.625,
|
||||
estimatedVolumeCbm: 0.875,
|
||||
expectedArrivalAt: '2026-09-07T11:30:00',
|
||||
customerRemark: '调整后的客户备注',
|
||||
channelCode: 'NEW',
|
||||
channelName: '新渠道',
|
||||
cargoes: [expect.objectContaining({ itemNo: 1, usage: '照明' })],
|
||||
@@ -122,7 +148,8 @@ describe('OrderDeclarationEditorDialog', () => {
|
||||
const wrapper = createWrapper()
|
||||
await flushPromises()
|
||||
|
||||
expect(wrapper.find('input[aria-label="渠道编码"]').attributes('readonly')).toBeDefined()
|
||||
expect(wrapper.find('input[aria-label="渠道编码"]').exists()).toBe(false)
|
||||
expect(wrapper.get('span[aria-label="渠道编码"]').text()).toBe('OLD')
|
||||
expect(wrapper.findAllComponents({ name: 'ElSelect' })).toHaveLength(1)
|
||||
expect(wrapper.find('.cargo-table').exists()).toBe(true)
|
||||
expect(wrapper.text()).toContain('箱数 / 数量')
|
||||
|
||||
@@ -253,14 +253,21 @@ async function save() {
|
||||
|
||||
<section class="density-dialog-section" data-tone="work">
|
||||
<h3 class="density-dialog-section__title">订单申报资料</h3>
|
||||
<el-form label-position="top" class="order-fields density-form">
|
||||
<el-row :gutter="14">
|
||||
<el-col :span="8"><el-form-item label="渠道名称" required><el-select v-model="form.channelCode" aria-label="渠道名称" filterable clearable :loading="channelsLoading" placeholder="请选择正式渠道" @change="selectChannel"><el-option v-for="channel in channels" :key="channel.channelCode" :label="`${channel.channelName} · ${channel.channelCode}`" :value="channel.channelCode" /></el-select></el-form-item></el-col>
|
||||
<el-col :span="8"><el-form-item label="渠道编码"><el-input :model-value="form.channelCode" readonly aria-label="渠道编码" /></el-form-item></el-col>
|
||||
<el-col :span="8"><el-form-item label="预估体积(m³)"><el-input-number v-model="form.estimatedVolumeCbm" :min="0.0001" :precision="4" :controls="false" placeholder="请输入预估体积(选填)" /></el-form-item></el-col>
|
||||
<el-col :span="8"><el-form-item label="预计到货时间"><el-date-picker v-model="form.expectedArrivalAt" type="datetime" value-format="YYYY-MM-DDTHH:mm:ss" format="YYYY-MM-DD HH:mm" clearable /></el-form-item></el-col>
|
||||
<el-col :span="16"><el-form-item label="客户备注"><el-input v-model="form.customerRemark" maxlength="1000" show-word-limit placeholder="请输入客户备注(选填)" /></el-form-item></el-col>
|
||||
</el-row>
|
||||
<el-form label-position="left" label-width="110px" class="order-fields density-form">
|
||||
<table class="density-table density-table--editable order-declaration-fields" aria-label="订单申报资料">
|
||||
<colgroup><col style="width: 40%"><col style="width: 27%"><col style="width: 33%"></colgroup>
|
||||
<tbody>
|
||||
<tr>
|
||||
<td><el-form-item label="渠道名称" required><el-select v-model="form.channelCode" aria-label="渠道名称" filterable clearable :loading="channelsLoading" placeholder="请选择正式渠道" @change="selectChannel"><el-option v-for="channel in channels" :key="channel.channelCode" :label="`${channel.channelName} · ${channel.channelCode}`" :value="channel.channelCode" /></el-select></el-form-item></td>
|
||||
<td><el-form-item label="渠道编码"><span aria-label="渠道编码">{{ form.channelCode || '—' }}</span></el-form-item></td>
|
||||
<td><el-form-item label="预估体积(m³)"><el-input-number v-model="form.estimatedVolumeCbm" :min="0.0001" :precision="4" :controls="false" aria-label="预估体积(m³)" placeholder="请输入预估体积(选填)" /></el-form-item></td>
|
||||
</tr>
|
||||
<tr>
|
||||
<td><el-form-item label="预计到货时间"><el-date-picker v-model="form.expectedArrivalAt" type="datetime" value-format="YYYY-MM-DDTHH:mm:ss" format="YYYY-MM-DD HH:mm" aria-label="预计到货时间" clearable /></el-form-item></td>
|
||||
<td colspan="2"><el-form-item label="客户备注"><el-input v-model="form.customerRemark" maxlength="1000" show-word-limit aria-label="客户备注" placeholder="请输入客户备注(选填)" /></el-form-item></td>
|
||||
</tr>
|
||||
</tbody>
|
||||
</table>
|
||||
</el-form>
|
||||
</section>
|
||||
|
||||
@@ -314,13 +321,13 @@ async function save() {
|
||||
</template>
|
||||
|
||||
<style scoped>
|
||||
.order-fields :deep(.el-date-editor), .order-fields :deep(.el-input) { width: 100%; }
|
||||
.order-declaration-fields { table-layout: fixed; }
|
||||
.cargo-table { width: 100%; }
|
||||
.cargo-table small, .cargo-table .cell-primary { display: block; max-width: 100%; overflow: hidden; text-overflow: ellipsis; white-space: nowrap; }
|
||||
.cargo-table small { margin-top: 3px; color: #98a2b3; }
|
||||
.cargo-editor-grid { display: grid; grid-template-columns: repeat(4, minmax(0, 1fr)); gap: var(--admin-space-5) var(--admin-space-5); }
|
||||
.cargo-editor-grid label { display: grid; min-width: 0; gap: var(--admin-space-1); color: #667085; font-size: var(--admin-font-caption); }
|
||||
.cargo-editor-grid label.wide { grid-column: span 3; }
|
||||
.cargo-editor-grid :deep(.el-input-number), .cargo-editor-grid :deep(.el-input), .order-fields :deep(.el-select) { width: 100%; }
|
||||
.cargo-editor-grid :deep(.el-input-number), .cargo-editor-grid :deep(.el-input) { width: 100%; }
|
||||
@media (max-width: 900px) { .cargo-editor-grid { grid-template-columns: repeat(2, minmax(0, 1fr)); } .cargo-editor-grid label.wide { grid-column: span 2; } }
|
||||
</style>
|
||||
|
||||
@@ -2981,7 +2981,7 @@ function orderDialogTitle(action: string, inboundCode?: string | null) {
|
||||
</section>
|
||||
</template>
|
||||
</AppDialog>
|
||||
<AppDialog class="admin-density-dialog" v-model="coLoadCreateOpen" title="合柜报关" confirm-text="确认建组" :confirm-loading="coLoadSaving" :confirm-disabled="!canCreateCoLoadGroup" @confirm="createCoLoadGroup">
|
||||
<AppDialog class="admin-density-dialog" v-model="coLoadCreateOpen" title="合柜报关" confirm-text="确认建组" :confirm-loading="coLoadSaving" :confirm-disabled="!canCreateCoLoadGroup" width="min(720px, calc(100vw - 28px))" @confirm="createCoLoadGroup">
|
||||
<el-alert type="warning" :closable="false" show-icon :title="`所选 ${selectedOrders.length} 票须属于同一国内仓、同一渠道,并全量进入同一柜;目的仓或目的港可以不同。资格由服务端按完整入仓片段校验。`" />
|
||||
<section class="density-dialog-section" data-tone="source">
|
||||
<h3 class="density-dialog-section__title">所选入仓码</h3>
|
||||
@@ -3019,7 +3019,7 @@ function orderDialogTitle(action: string, inboundCode?: string | null) {
|
||||
/>
|
||||
</AppDrawer>
|
||||
|
||||
<AppDialog class="admin-density-dialog" v-model="noteOpen" :title="orderDialogTitle('编辑订单备注', noteOrder?.inboundCode)" width="min(680px, calc(100vw - 28px))" confirm-text="保存备注" :confirm-loading="noteSaving" @confirm="saveNote">
|
||||
<AppDialog class="admin-density-dialog" v-model="noteOpen" :title="orderDialogTitle('编辑订单备注', noteOrder?.inboundCode)" width="min(880px, calc(100vw - 28px))" confirm-text="保存备注" :confirm-loading="noteSaving" @confirm="saveNote">
|
||||
<el-form label-position="top" class="order-remarks-form">
|
||||
<el-form-item label="客户备注(只读)"><el-input :model-value="noteOrder?.customerRemark || '—'" disabled /></el-form-item>
|
||||
<el-form-item label="内部备注"><el-input v-model="noteForm.internalRemark" type="textarea" :rows="3" maxlength="1000" show-word-limit placeholder="可填写、修改或清空内部备注" /></el-form-item>
|
||||
@@ -3028,12 +3028,12 @@ function orderDialogTitle(action: string, inboundCode?: string | null) {
|
||||
</el-form>
|
||||
</AppDialog>
|
||||
|
||||
<AppDialog class="admin-density-dialog" v-model="holdDialogOpen" :title="orderDialogTitle(holdAction === 'HOLD' ? '确认扣货' : '确认解除扣货', detail?.summary.inboundCode)" :confirm-text="holdAction === 'HOLD' ? '确认扣货' : '确认解除'" :confirm-type="holdAction === 'HOLD' ? 'danger' : 'primary'" :confirm-loading="holdSaving" :confirm-disabled="!holdReason.trim() || holdReason.trim().length > 1000" width="min(600px, calc(100vw - 28px))" destroy-on-close @confirm="submitHoldAction">
|
||||
<AppDialog class="admin-density-dialog" v-model="holdDialogOpen" :title="orderDialogTitle(holdAction === 'HOLD' ? '确认扣货' : '确认解除扣货', detail?.summary.inboundCode)" :confirm-text="holdAction === 'HOLD' ? '确认扣货' : '确认解除'" :confirm-type="holdAction === 'HOLD' ? 'danger' : 'primary'" :confirm-loading="holdSaving" :confirm-disabled="!holdReason.trim() || holdReason.trim().length > 1000" width="min(720px, calc(100vw - 28px))" destroy-on-close @confirm="submitHoldAction">
|
||||
<el-alert :title="holdAction === 'HOLD' ? '扣货后服务端将阻止后续实物履约操作。' : '解除后是否可继续履约仍以服务端状态为准。'" :type="holdAction === 'HOLD' ? 'warning' : 'info'" :closable="false" show-icon />
|
||||
<el-form label-position="top" class="hold-command-form"><el-form-item :label="holdAction === 'HOLD' ? '扣货原因' : '解除原因'" required><el-input v-model="holdReason" type="textarea" :rows="4" maxlength="1000" show-word-limit :placeholder="holdAction === 'HOLD' ? '请输入扣货原因' : '请输入解除扣货原因'" aria-label="扣货操作原因" /></el-form-item><el-form-item label="关联文件(选填)"><el-upload :key="holdEvidenceUploadKey" :auto-upload="false" :limit="1" accept=".txt,.pdf,.jpg,.jpeg,.png,text/plain,application/pdf,image/jpeg,image/png" :disabled="holdSaving" :on-change="selectHoldEvidenceFile" :on-remove="removeHoldEvidenceFile"><el-button :disabled="holdSaving"><FileUp :size="15" />选择文件</el-button><template #tip><div class="el-upload__tip">仅支持 TXT、PDF、JPG、PNG,单文件不超过 10MB;服务端将校验文件真实内容。</div></template></el-upload></el-form-item><LoadErrorState v-if="holdEvidenceError" compact title="关联文件处理失败" :message="holdEvidenceError.message" :show-retry="false"><template #details><ApiErrorMeta :details="holdEvidenceError" /></template></LoadErrorState></el-form>
|
||||
</AppDialog>
|
||||
|
||||
<AppDialog class="admin-density-dialog" v-model="approvalOpen" :title="orderDialogTitle('审核订单', approvalOrder?.inboundCode)" confirm-text="审核通过" confirm-type="success" :confirm-loading="approvalSaving" destroy-on-close @confirm="approveOrder" @cancel="closeApproval">
|
||||
<AppDialog class="admin-density-dialog" v-model="approvalOpen" :title="orderDialogTitle('审核订单', approvalOrder?.inboundCode)" confirm-text="审核通过" confirm-type="success" :confirm-loading="approvalSaving" width="min(720px, calc(100vw - 28px))" destroy-on-close @confirm="approveOrder" @cancel="closeApproval">
|
||||
<section v-if="approvalOrder" class="density-dialog-section" data-tone="summary">
|
||||
<h3 class="density-dialog-section__title">订单审核资料</h3>
|
||||
<dl class="approval-facts">
|
||||
|
||||
Reference in New Issue
Block a user