fix(marketplace): ttn_number varchar(32)→64 + UX подготовки отгрузки

- ttn_number в shipment/apl_reception: 32→64. Номер ТТН
  COOPNAME-TTN-<cycle8>-<ku6>-<suffix8> ≈ 36–42 символов переполнял
  varchar(32) → «value too long» при формировании партии экспедитора.
  Требует рестарта контроллера (synchronize применит ALTER, увеличение
  длины безопасно).
- CreateShipmentDialog: maximized для удобной работы с dual-list.
- OperatorBranchBar: при выборе из нескольких участков убран дублирующий
  крупный заголовок (название КУ повторялось в селекте «Участок-Участок»);
  селектор стал основным идентификатором, адрес — под ним. Один участок —
  по-прежнему текстом.

Co-Authored-By: Claude Opus 4.8 <noreply@anthropic.com>
This commit is contained in:
ant
2026-05-31 11:42:53 +00:00
parent 9f7173fc26
commit 74850036f0
4 changed files with 22 additions and 12 deletions
@@ -61,7 +61,8 @@ export class MarketplaceAplReceptionEntity {
@Column({ type: 'jsonb' })
public fact_quantity_per_order!: MarketplaceAplReceptionFactQuantityEntry[];
@Column({ type: 'varchar', length: 32, nullable: true })
// length=64 — копируется из shipment.ttn_number (см. marketplace-shipment.entity).
@Column({ type: 'varchar', length: 64, nullable: true })
public ttn_number!: string | null;
@Column({ type: 'jsonb', nullable: true })
@@ -56,7 +56,9 @@ export class MarketplaceShipmentEntity {
@Column({ type: 'numeric', precision: 24, scale: 4 })
public total_amount!: string;
@Column({ type: 'varchar', length: 32, nullable: true })
// length=64: номер ТТН = COOPNAME-TTN-<cycle8>-<ku6>-<suffix8> + дефисы ≈ 3642
// символов (varchar(32) переполнялся при формировании партии экспедитора).
@Column({ type: 'varchar', length: 64, nullable: true })
public ttn_number!: string | null;
@Column({ type: 'jsonb', nullable: true })
@@ -34,16 +34,20 @@ const options = computed<BaseSelectOption[]>(() =>
<template lang="pug">
.op-branch-bar(v-if='store.isOperator')
q-icon.op-branch-bar__icon(name='storefront', size='24px')
.op-branch-bar__info
//- Несколько участков: селектор — основной идентификатор, адрес под ним.
//- Крупный заголовок не показываем — название КУ дублировалось бы в селекте.
.op-branch-bar__info(v-if='store.hasMultiple')
BaseSelect.op-branch-bar__select(
:model-value='store.activeBraname',
:options='options',
label='Участок',
@update:model-value='store.setActive(String($event))'
)
.op-branch-bar__sub(v-if='subtitle') {{ subtitle }}
//- Один участок: выбора нет — показываем текстом.
.op-branch-bar__info(v-else)
.op-branch-bar__title {{ title }}
.op-branch-bar__sub(v-if='subtitle') {{ subtitle }}
BaseSelect.op-branch-bar__select(
v-if='store.hasMultiple',
:model-value='store.activeBraname',
:options='options',
label='Участок',
@update:model-value='store.setActive(String($event))'
)
BaseBadge(:variant='status.variant') {{ status.label }}
</template>
@@ -66,6 +70,9 @@ const options = computed<BaseSelectOption[]>(() =>
&__info {
flex: 1 1 auto;
min-width: 0;
display: flex;
flex-direction: column;
gap: var(--p-1, 4px);
}
&__title {
@@ -81,7 +88,7 @@ const options = computed<BaseSelectOption[]>(() =>
&__select {
min-width: 220px;
flex-shrink: 0;
max-width: 360px;
}
}
</style>
@@ -194,7 +194,7 @@ async function submit(): Promise<void> {
BaseDialog(
:model-value='modelValue',
title='Сформировать партию',
size='lg',
maximized,
@update:model-value='emit("update:modelValue", $event)'
)
.create-shipment(v-if='buckets.length')