@@ -118,8 +118,8 @@ const displayedPlanItems = computed<SmartLoadingPlanRow[]>(() => {
} )
const totalVolume = computed ( ( ) => ( plan . value ? . items || [ ] ) . reduce ( ( sum , item ) => sum + Number ( item . volumeCbm || 0 ) , 0 ) )
const totalWeight = computed ( ( ) => ( plan . value ? . items || [ ] ) . reduce ( ( sum , item ) => sum + Number ( item . grossWeightKg || 0 ) , 0 ) )
const volumeLimit = computed ( ( ) => Number ( container . value ? . capacityCbm || 0 ) * 1.1 )
const weightLimit = computed ( ( ) => Number ( container . value ? . maxWeightKg || 0 ) * 1.1 )
const volumeLimit = computed ( ( ) => Number ( container . value ? . capacityCbm || 0 ) * 1.5 )
const weightLimit = computed ( ( ) => Number ( container . value ? . maxWeightKg || 0 ) * 1.5 )
const volumePercent = computed ( ( ) => volumeLimit . value ? totalVolume . value / volumeLimit . value * 100 : 0 )
const weightPercent = computed ( ( ) => weightLimit . value ? totalWeight . value / weightLimit . value * 100 : 0 )
const displayedVolumePercent = computed ( ( ) => percentage ( volumePercent . value ) )
@@ -158,7 +158,7 @@ function explainCandidate(source: object) {
const weight = Number ( candidate . unitGrossWeightKg || 0 )
const volumeRoom = volumeLimit . value ? Math . floor ( Math . max ( volumeLimit . value - totalVolume . value , 0 ) / Math . max ( volume , 0.000001 ) ) : candidate . availablePackageCount
const weightRoom = weightLimit . value ? Math . floor ( Math . max ( weightLimit . value - totalWeight . value , 0 ) / Math . max ( weight , 0.000001 ) ) : candidate . availablePackageCount
return ` 按 11 0% 上限,当前最多可装 ${ Math . max ( Math . min ( candidate . availablePackageCount , volumeRoom , weightRoom ) , 0 ) } 箱 `
return ` 按 15 0% 上限,当前最多可装 ${ Math . max ( Math . min ( candidate . availablePackageCount , volumeRoom , weightRoom ) , 0 ) } 箱 `
}
function displayCabinetNo ( value : ContainerBookingResource | null | undefined ) {
if ( ! value ) return '待生成'
@@ -351,7 +351,7 @@ onMounted(load)
< / section >
< template v-else >
< section v-if = "container" class="summary-band" > < div > < span > 柜型 < / span > < strong > { { container . containerType } } < / strong > < / div > < div > < span > 装柜仓库 < / span > < strong > { { container . warehouseName || '—' } } < / strong > < / div > < / section >
< section v-if = "container" class="capacity-grid"><div><div class="meter-title"><span>体积占用(含 11 0% 上限)</span><strong>{{ formatNumber(totalVolume) }} / {{ formatNumber(volumeLimit) }} m³</strong></div><el-progress :percentage="Math.min(displayedVolumePercent,100)" :status="volumePercent > 100 ? 'exception' : undefined" /></div><div><div class="meter-title"><span>重量占用(含 11 0% 上限)</span><strong>{{ formatNumber(totalWeight,1) }} / {{ formatNumber(weightLimit,1) }} kg</strong></div><el-progress :percentage="Math.min(displayedWeightPercent,100)" :status="weightPercent > 100 ? 'exception' : undefined" / > < / div > < / section >
< section v-if = "container" class="capacity-grid"><div><div class="meter-title"><span>体积占用(含 15 0% 上限)</span><strong>{{ formatNumber(totalVolume) }} / {{ formatNumber(volumeLimit) }} m³</strong></div><el-progress :percentage="Math.min(displayedVolumePercent,100)" :status="volumePercent > 100 ? 'exception' : undefined" /></div><div><div class="meter-title"><span>重量占用(含 15 0% 上限)</span><strong>{{ formatNumber(totalWeight,1) }} / {{ formatNumber(weightLimit,1) }} kg</strong></div><el-progress :percentage="Math.min(displayedWeightPercent,100)" :status="weightPercent > 100 ? 'exception' : undefined" / > < / div > < / section >
< el-empty v-if = "noDraft" description="该柜次缺少自动生成的预装计划,请刷新后重试" / >
< template v-else-if = "plan" >
< el -alert v-if = "plan.status === 'LOADING' && plan.canEdit" type="warning" :closable="false" show-icon title="已下发 PDA,仍可维护未完成的装柜明细" description="新增、增加或移除未拣明细会刷新 PDA 明细与版本;PDA 端需要刷新后继续操作。" / >
@@ -367,7 +367,7 @@ onMounted(load)
< template # volume = "{ row }" > { { formatNumber ( Number ( row . volumeCbm || 0 ) ) } } m³ < / template > < template # weight = "{ row }" > { { formatNumber ( Number ( row . grossWeightKg || 0 ) , 1 ) } } kg < / template >
< / DataTable >
< DataTable :data = "displayedCandidates" :columns = "candidateColumns" : loading = "loading || mutating" stripe preference -key = " smart -loading -candidates " column -settings -mode = " hide " empty -text = " 当前仓库暂无可排柜货物 " >
< template # toolbar -start > < div > < h2 > 候选货物 < / h2 > < p > 系统基于装柜仓库 、 物流渠道 、 可用箱数及 110 % 容量上限校验 。 < / p > < / div > < / template >
< template # toolbar -start > < div > < h2 > 候选货物 < / h2 > < p > 系统基于装柜仓库 、 物流渠道 、 可用箱数及 150 % 容量上限校验 。 < / p > < / div > < / template >
< template # actions = "{ row }" > < el-button v-if = "canAssign && assignable" size="small" type="primary" plain :disabled="candidateBlocked(row as SmartLoadingCandidateRow)" @click="openAssign(row)"><Plus :size="15" / > { { row . coLoadGroupId ? '整组分配' : '分配' } } < / el-button > < / template >
< template # customerName = "{ row }" > < LineClampText :content = "row.customerName" / > < / template >
< template # coLoadGroup = "{ row }" > < div v-if = "row.coLoadGroupId" class="candidate-group"><el-tag size="small" type="warning">{{ row.groupNo }} · {{ row.memberOrderCount }} 票 · {{ row.inboundFragmentCount }} 个入仓片段</el-tag><span v-for="summary in row.memberOrderSummaries" :key="summary">{{ summary }}</span><span>整组 {{ row.groupTotalBoxes }} 箱,必须全量进入同一柜</span><small v-if="row.blockReason" class="candidate-block">{{ row.blockReason }}</small><small v-else-if="row.locked" > 该组已锁定 , 不能重复分配 < / small > < / div > < span v-else > 普通单票 < / span > < / template >