@@ -16,10 +16,16 @@ const props = withDefaults(defineProps<{
title ? : string
planId : string
containerBookingId : string
cabinetNo ? : string | null
containerNo ? : string | null
customers : Array < { accountId : string ; customerName : string | null } >
businessReferences : Array < { accountId : string ; customerName : string | null ; orderId : string ; orderNo : string ; inboundId : string | null ; inboundCode : string | null } >
readonly ? : boolean
} > ( ) , { title : '柜次费用' , readonly : false } )
function feeDialogTitle ( action : string ) {
const code = props . cabinetNo ? . trim ( ) || props . containerNo ? . trim ( )
return code ? ` ${ action } · ${ code } ` : action
}
const access = useAccessPreviewStore ( )
const accountId = ref ( '' )
const fees = ref < ContainerFeeResource [ ] > ( [ ] )
@@ -333,7 +339,7 @@ async function reject() {
}
async function voidFee ( item : ContainerFeeResource ) {
if ( ! canReview . value || ! accountId . value ) return
await ElMessageBox . confirm ( ` 确认作废“ ${ item . feeItemName } ”费用?作废后将同步财务来源状态。 ` , '作废费用' , { customClass : 'admin-density-confirm' , type : 'warning' , confirmButtonText : '确认作废' } )
await ElMessageBox . confirm ( ` 确认作废“ ${ item . feeItemName } ”费用?作废后将同步财务来源状态。 ` , feeDialogTitle ( '作废费用' ) , { customClass : 'admin-density-confirm' , type : 'warning' , confirmButtonText : '确认作废' } )
await ( item . allocationGroupId
? voidContainerFeeAllocationGroup ( props . planId , item . allocationGroupId , item . sourceVersion )
: voidContainerFee ( props . planId , accountId . value , item . id , item . sourceVersion ) )
@@ -370,7 +376,7 @@ onMounted(() => void load())
< template >
< section class = "fees-panel admin-density" aria -label = " 柜次费用维护 " >
< header class = "fees-header" >
< div > < h2 > { { title } } < / h2 > < p > 费用与财务分摊均来自服务端真实记录 < / p > < / div >
< div > < h2 > { { title } } < / h2 > < / div >
< div class = "fees-header__actions" >
< label v-if = "customerOptions.length > 1" class="customer-context"><span>客户</span><el-select v-model="accountId" placeholder="请选择费用归属客户"><el-option v-for="item in customerOptions" :key="item.value" :label="item.label" :value="item.value" / > < / el-select > < / label >
< el-button v-if = "canEdit && canViewFeeItems && accountId" type="primary" @click="openCreate"><Plus :size="16" / > 新增费用 < / el-button >
@@ -396,72 +402,50 @@ onMounted(() => void load())
< div v-if = "accountId && fees.length" class="allocation-section"><header><div><h3>财务体积分摊</h3><p>{{ selectedCustomer?.label }} · 仅展示 Finance 已持久化结果</p></div><el-button :loading="financeLoading" @click="loadFinanceDetails">{{ financeLoaded ? '刷新财务状态' : '加载财务状态' }}</el-button></header><LoadErrorState v-if="financeError" compact title="财务状态加载失败" :message="financeError.message" @retry="loadFinanceDetails"><template #details><ApiErrorMeta :details="financeError" /></template></LoadErrorState><el-empty v-else-if="!financeLoaded" description="点击加载财务状态后查看结算与成本分摊" :image-size="64" /><el-empty v-else-if="!financeLoading && costs.length === 0" description="尚无与该柜次关联的财务分摊结果" :image-size="64" /><article v-for="cost in costs" :key="cost.id" class="cost-block"><div class="cost-summary"><strong>{{ cost.feeItemName || '柜次成本' }}</strong><span>供应商:{{ cost.supplierName || '服务端未返回' }}</span><span>金额:¥{{ money(cost.amount) }}</span></div><DataTable :data="cost.allocations" :columns="allocationColumns" :preference-key="`container-cost-${cost.id}`" row-key="id" empty-text="服务端未返回分摊明细"><template #orderNo="{ row }">{{ orderNumbers.get(row.orderId) || '订单编码待补充' }}</template><template #inboundCode="{ row }">{{ row.inboundId ? (inboundCodes.get(row.inboundId) || '入仓码待补充') : '—' }}</template><template #volume="{ row }">{{ row.volumeCbm.toFixed(3) }}</template><template #rate="{ row }">{{ (row.allocationRate * 100).toFixed(2) }}%</template><template #allocated="{ row }" > {{ money ( row.allocatedAmount ) }} < / template > < / DataTable > < / article > < / div >
< / template >
< AppDialog class = "admin-density-dialog" v-model = "editorOpen" :title="target ? '调整已审核费用' : '新增柜次费用'" confirm-text="保存" :confirm-loading="saving" @confirm="save" >
< div v-if = "target" class="adjust-snapsh ot" >
< p > 调整仅允许修改业务日期和金额 ; 如需变更方向 、 费用项目 、 供应商或其他信息 , 请先作废后新增 。 < / p >
< el-descriptions :column = "3" border size = "small" >
< el-descriptions-item label = "方向" > { { target . direction === 'RECEIVABLE' ? '应收' : '应付' } } < / el-descriptions-item >
< el-descriptions-item label = "费用项目" > { { target . feeItemName } } < / el-descriptions-item >
< el-descriptions-item label = "供应商" > { { target . supplierName || '—' } } < / el-descriptions-item >
< el-descriptions-item label = "结算方式" > { { settlementLabel ( target ) } } < / el-descriptions-item >
< el-descriptions-item label = "已付摘要" > { { paidSummary ( target ) } } < / el-descriptions-item >
< el-descriptions-item label = "币种" > { { target . currency } } < / el-descriptions-item >
< el-descriptions-item label = "备注" > { { target . remark || '—' } } < / el-descriptions-item >
< el-descriptions-item label = "费用归属" > { { target . allocationOrderNo || '—' } } / { { target . allocationInboundCode || '无入仓码' } } < / el-descriptions-item >
< / el-descriptions >
< / div >
< template v-else >
< AppDialog class = "admin-density-dialog" v-model = "editorOpen" :title="feeDialogTitle( target ? '调整已审核费用' : '新增柜次费用')" width="min(1080px, calc(100vw - 28px))" fullscreenable confirm-text="保存" :confirm-loading="saving" @confirm="save" >
< p v-if = "target" class="density-dialog-n ote " > 调整仅允许修改业务日期和金额 ; 如需变更方向 、 费用项目 、 供应商或其他信息 , 请先作废后新增 。 < / p >
< template v-if = "!target" >
< el -alert v-if = "!canViewSuppliers" type="warning" :closable="false" show-icon title="当前账号缺少供应商查看权限,仅可维护应收费用" / >
< el-alert v-else-if = "suppliersError" type="warning" :closable="false" show-icon :title="suppliersError.message" / >
< el-alert v-if = "feeItemsError" type="warning" :closable="false" show-icon :title="feeItemsError.message" / >
< / template >
< el-form ref = "formRef" :model = "form" :rules = "rules " label -position = " top " class = "fee-form density-form" >
< template v-if = "!target ">
< el -form -item label = "方向" prop = "direction" > < el-segmented v-model = "form.direction" :options="[{ label: '应收', value: 'RECEIVABLE' }, { label: '应付', value: 'PAYABLE', dis abled: !canViewSuppliers }]" / > < / el-form-item >
< el-form-item label = "费用项目" prop = "feeItemId "> < el-select v-model = "form.feeItemId" filterable :loading="feeItemsLoading" :disabled="!canViewFeeItems" placeholder="请选择启用且适用的费用项目" @change="applyFeeItemDefaultPrice"><el-option v-for="item in applicableItems" :key="item.id" :label="item.name" :value="item.id" / > < / el-select > < / el-form-item >
< el-form-item v-if = "form.direction === 'PAYABLE'" label="供应商" required><el-select v-model="form.supplierId" filterable :loading="suppliersLoading" :disabled="!canViewSuppliers || !selectedFeeItem || !!suppliersError" placeholder="请先选择费用项目"><el-option v-for="supplier in suppliers" :key="supplier.id" :label="supplier.supplierName" :value="supplier.id" / > < / el-select > < / el-form-item >
< el-form-item v-if = "form.direction === 'PAYABLE'" label="结算方式" required ><el-radio-group v-model="settlementModeModel"><el-radio-button value="ON_ACCOUNT">账期应付</el-radio-button><el-radio-button value="DIRECT_PAID" > 已付成本 < / el -radio -button > < / el-radio-group > < / el-form-item >
< template v-if = "form.direction === 'PAYABLE' && form.settlementMode === 'DIRECT_PAID'" >
< el -form -item label = "已付时间" required > < el-date-picker v-model = "form.paidAt" type="datetime" value-format="YYYY-MM-DDTHH:mm:ss " placeholder="请选择实际付款时间 " / > < / el-form-item >
< el-form-item label = "付款方式" required > < el-select v-model = "form.paymentMethod" placeholder="请选择付款方式"><el-option label="线上支付" value="ONLINE" /><el-option label="银行转账" value="BANK_TRANSFER " /><el-option label="现金" value="CASH" /><el-option label="其他" value="OTHER" / > < / el-select > < / el-form-item >
< el-form-item label = "付款流水号 "> < el-input v-model = "form.paymentReferenceNo" maxlength="128 " placeholder="流水号与付款凭证至少填写一项 " / > < / el-form-item >
< el-form-item label = "付款凭证" class = "voucher-field" > < div class = "voucher-control" > < label class = "voucher-picker" : class = "{ 'is-disabled': voucherUploading }" > < FileUp :size = "15" / > < span > { { voucherUploading ? '上传并校验中' : '选择凭证' } } < / span > < input type = "file" accept = ".pdf,.jpg,.jpeg,.png,application/pdf,image/jpeg,image/png" :disabled = "voucherUploading" @change ="selectVoucher" / > < / label > < span class = "voucher-hint" > FINANCE _VOUCHER · 最多 20 个 < / span > < / div > < el-alert v-if = "voucherError" type="error" :closable="true" show-icon @close="voucherError = null"><template #title>{{ voucherError.message }}</template><ApiErrorMeta :details="voucherError" /></el-alert><div v-if="voucherFiles.length" class="voucher-list"><span v-for="file in voucherFiles" :key="file.fileId"><span :title="file.fileName">{{ file.fileName }}</span><button type="button" :aria-label="`移除${file.fileName}`" @click="removeVoucher(file.fileId)"><X :size="14" / > < / button > < / span > < / div > < / el-form-item >
< / template >
< / template >
< el-form-item label = "业务日期" prop = "businessDate" > < el-date-picker v-model = "form.businessDate" type="date" value-format="YYYY-MM-DD" / > < / el-form-item >
< el-form-item label = "金额(CNY)" prop = "amount" > < el-input-number v-model = "form.amount" :min="0" :precision="2" controls-position="right" placeholder="请输入金额" / > < / el-form-item >
< el-form-item v-if = "allocationMode" label="业务归属分摊" class="allocation-editor" required >
< section class = "density-dialog-section " data -tone = " work " >
< el-form ref = "formRef" :model = "form" :rules = "rules" label -position = " left " class = "density-form density-form--flush-end ">
< table class = "density-table density-table--e dit able fee-editor-table" aria -label = " 柜次费用填写 " > < tbody >
< tr > < td > < el-form-item label -position = " left " label -width = " 110px " label = "方向" : prop = "target ? undefined : 'direction' "> < span v-if = "target">{{ target.direction === 'RECEIVABLE' ? '应收' : '应付' }}</span><el-segmented v-else v-model="form.direction" :options="[{ label: '应收', value: 'RECEIVABLE' }, { label: '应付', value: 'PAYABLE', disabled: !canViewSuppliers }]" /></el-form-item></td><td><el-form-item label-position="left" label-width="110px" label="费用项目" :prop="target ? undefined : 'feeItemId'"><span v-if="target">{{ target.feeItemName }}</span><el-select v-else v-model=" form.feeItemId" filterable :loading="feeItemsLoading" :disabled="!canViewFeeItems" placeholder="请选择启用且适用的费用项目" @change="applyFeeItemDefaultPrice"><el-option v-for="item in applicableItems" :key="item.id" :label="item.name" :value="item.id" / > < / el-select > < / el-form-item > < / td > < / tr >
< tr v-if = "target || form.direction === 'PAYABLE'"><td><el-form-item label-position="left" label-width="110px" label="供应商" : required="!target"><span v-if="target">{{ target.supplierName || '—' }}</span ><el-select v-else v-model="form.supplierId" filterable :loading="suppliersLoading" :disabled="!canViewSuppliers || !selectedFeeItem || !!suppliersError" placeholder="请先选择费用项目"><el-option v-for="supplier in suppliers" :key="supplier.id" :label="supplier.supplierName" :value="supplier.id" /></el-select></el-form-item></td><td><el-form-item label-position="left" label-width="110px" label="结算方式" :required="!target"><span v-if="target">{{ settlementLabel(target) }}</span><el-radio-group v-else v-model="settlementModeModel"><el-radio-button value="ON_ACCOUNT">账期应付</el-radio-button><el-radio-button value="DIRECT_PAID" > 已付成本 < / el -radio -button > < / el-radio-group > < / el-form-item > < / td > < / tr >
< tr v-if = "target"><td><el-form-item label="已付摘要" label-position="left" label-width="110px"><span>{{ paidSummary(target) }}</span ></ el-form-item></td><td><el-form-item label="币种" label-position="left" label-width="110px" > < span > { { target . currency } } < / span > < / el-form-item > < / td > < / tr >
< tr v-if = "!target && form.direction === 'PAYABLE' && form.settlementMode === 'DIRECT_PAID'"><td><el-form-item label-position="left" label-width="110px" label="已付时间" required><el-date-picker v-model="form.paidAt" type="datetime" value-format="YYYY-MM-DDTHH:mm:ss" placeholder="请选择实际付款时间" /></el-form-item></td><td><el-form-item label-position="left" label-width="110px" label="付款方式" required><el-select v-model="form.paymentMethod" placeholder="请选择付款方式"><el-option label="线上支付" value="ONLINE" /><el-option label="银行转账" value="BANK_TRANSFER" /><el-option label="现金" value="CASH" /><el-option label="其他" value="OTHER" / > < / el-select > < / el-form-item > < / td > < / tr >
< tr v-if = "!target && form.direction === 'PAYABLE' && form.settlementMode === 'DIRECT_PAID'"><td colspan="2"><el-form-item label-position="left" label-width="110px" label="付款流水号"><el-input v-model="form.paymentReferenceNo" maxlength="128 " placeholder="流水号与付款凭证至少填写一项 " / > < / el-form-item > < / td > < / tr >
< tr v-if = "!target && form.direction === 'PAYABLE' && form.settlementMode === 'DIRECT_PAID'"><td colspan="2"><el-form-item label-position="left" label-width="110px" label="付款凭证" class="voucher-field"><div class="voucher-control"><label class="voucher-picker" :class="{ 'is-disabled': voucherUploading }"><FileUp :size="15" /><span>{{ voucherUploading ? '上传并校验中' : '选择凭证' }}</span><input type="file" accept=".pdf,.jpg,.jpeg,.png,application/pdf,image/jpeg,image/png" :disabled="voucherUploading" @change="selectVoucher" /></label><span class="voucher-hint">支持 PDF、JPG、PNG,最多 20 个</span></div><el-alert v-if="voucherError" type="error" :closable="true" show-icon @close="voucherError = null"><template #title>{{ voucherError.message }}</template><ApiErrorMeta :details="voucherError " /></ el-alert><div v-if="voucherFiles.length" class="voucher-list"><span v-for="file in voucherFiles" :key="file.fileId"><span :title="file.fileName">{{ file.fileName }}</span><button type="button" :aria-label="`移除${file.fileName}`" @click="removeVoucher(file.fileId)"><X :size="14" / > < / button > < / span > < / div > < / el-form-item > < / td > < / tr >
< tr > < td > < el-form-item label -position = " left " label -width = " 110px " label = "业务日期" prop = "businessDate "> < el-date-picker v-model = "form.businessDate" type="date" value-format="YYYY-MM-DD" /></el-form-item></td><td><el-form-item label-position="left" label-width="110px" label="金额(CNY)" prop="amount"><el-input-number v-model="form.amount" :min="0" :precision="2" controls-position="right " placeholder="请输入金额 " / > < / el-form-item > < / td > < / tr >
< tr v-if = "target"><td><el-form-item label="备注" label-position="left" label-width="110px"><span>{{ target.remark || '—' }}</span></el-form-item></td><td><el-form-item label="费用归属" label-position="left" label-width="110px" > < span > { { ( target . allocationOrderNo || '—' ) + ' / ' + ( target . allocationInboundCode || '无入仓码' ) } } < / span > < / el-form-item > < / td > < / tr >
< tr v-if = "!target"><td colspan="2"><el-form-item label-position="left" label-width="110px" label="备注"><el-input v-model="form.remark" type="textarea" :rows="3" maxlength="500" show-word-limit placeholder="请输入备注(选填)" / > < / el-form-item > < / td > < / tr >
< / tbody > < / table >
< el-form-item label -position = " top " v-if = "allocationMode" label="业务归属分摊" class="allocation-editor" required >
< el-alert type = "info" :closable = "false" show -icon title = "客户必须明确;入仓码没有时按订单归属,分摊合计必须等于费用总额。" / >
< div class = "allocation-editor__rows" >
< div v-for = "(row, index) in allocationDraft" :key="`${row.customerId}-${row.orderId}-${row.inboundId || 'none'}`" class="allocation-editor__row" >
< span > < strong > { { customerLabel ( row . customerId || targetGroupRows [ index ] ? . customerId || '' ) } } < / strong > < small > { { row . orderNo } } · { { row . inboundCode || '无入仓码' } } < / small > < / span >
< el-input-number v-model = "row.amount" :min="0" :precision="2" controls-position="right" placeholder="请输入分摊金额" / >
< / div >
< / div >
< p class = "allocation-editor__sum" : class = "{ 'is-error': Math.abs(allocationSum - form.amount) > 0.001 }" > 已分摊 ¥ { { money ( allocationSum ) } } / 总额 ¥ { { money ( form . amount ) } } < / p >
< table class = "density-table density-table--editable allocation-editor-table" aria -label = " 业务归属分摊 " > < thead > < tr > < th > 客户 < / th > < th > 订单号 < / th > < th > 入仓码 < / th > < th class = "allocation-amount" > 分摊金额 ( CNY ) < / th > < / tr > < / thead > < tbody >
< tr v-for = "(row, index) in allocationDraft" :key="`${row.customerId}-${row.orderId}-${row.inboundId || 'none'}`"><td>{{ customerLabel(row.customerId || targetGroupRows[index]?.customerId || '') }}</td><td>{{ row.orderNo }}</td><td>{{ row.inboundCode || '无入仓码' }}</td><td><el-input-number v-model="row.amount" :min="0" :precision="2" controls-position="right" placeholder="请输入分摊金额" / > < / td > < / tr >
< / tbody > < tfoot > < tr > < td colspan = "4" > < span class = "allocation-editor__sum" : class = "{ 'is-error': Math.abs(allocationSum - form.amount) > 0.001 }" > 已分摊 ¥ { { money ( allocationSum ) } } / 总额 ¥ { { money ( form . amount ) } } < / span > < / td > < / tr > < / tfoot > < / table >
< / el-form-item >
< template v-if = "!target" >
< el -form -item label = "备注" > < el-input v-model = "form.remark" type="textarea" :rows="3" maxlength="500" show-word-limit placeholder="请输入备注(选填)" / > < / el-form-item >
< / template >
< / el-form >
< / el-form >
< / section >
< LoadErrorState v-if = "editorError" compact title="费用保存失败" :message="editorError.message" :show-retry="false"><template #details><ApiErrorMeta :details="editorError" / > < / template > < / LoadErrorState >
< / AppDialog >
< AppDialog class = "admin-density-dialog" v-model = "rejectOpen" title="驳回柜次费用" confirm-text="确认驳回" :confirm-loading="saving" @confirm="reject"><el-input v-model="rejection" type="textarea" :rows="4" maxlength="500" show-word-limit placeholder="请输入驳回原因" / > < / AppDialog >
< AppDialog class = "admin-density-dialog" v-model = "rejectOpen" : title="feeDialogTitle(' 驳回柜次费用') " confirm-text="确认驳回" :confirm-loading="saving" @confirm="reject"><el-input v-model="rejection" type="textarea" :rows="4" maxlength="500" show-word-limit placeholder="请输入驳回原因" / > < / AppDialog >
< / section >
< / template >
< style scoped >
. fees - panel { min - width : 0 ; overflow : hidden ; padding - top : 0 ; border - top : 0 ; }
. fees - header , . allocation - section > header { display : flex ; align - items : center ; justify - content : space - between ; gap : var ( -- admin - space - 5 ) ; padding : 0 0 var ( -- admin - space - 5 ) ; }
. fees - header h2 , . allocation - section h3 { margin : 0 ; font - size : var ( -- admin - font - section ) ; } . fees - header p , . allocation - section p { margin : var ( -- admin - space - 1 ) 0 0 ; color : var ( -- cc - muted ) ; font - size : var ( -- admin - font - caption ) ; }
. fees - header h2 , . allocation - section h3 { margin : 0 ; font - size : var ( -- admin - font - section ) ; } . allocation - section p { margin : var ( -- admin - space - 1 ) 0 0 ; color : var ( -- cc - muted ) ; font - size : var ( -- admin - font - caption ) ; }
. fees - header _ _actions , . customer - context { display : flex ; align - items : center ; gap : var ( -- admin - space - 4 ) ; }
. customer - context > span { color : var ( -- cc - muted ) ; font - size : var ( -- admin - font - body ) ; white - space : nowrap ; } . customer - context : deep ( . el - select ) { width : 260 px ; }
. fees - table - title { display : flex ; align - items : baseline ; gap : var ( -- admin - space - 3 ) ; } . fees - table - title strong { font - size : var ( -- admin - font - section ) ; } . fees - table - title span { color : var ( -- cc - muted ) ; font - size : var ( -- admin - font - caption ) ; }
. row - actions { flex - wrap : wrap ; } . allocation - section { padding - top : var ( -- admin - space - 5 ) ; border - top : 1 px solid var ( -- cc - border ) ; } . cost - block { border - top : 1 px solid var ( -- cc - border ) ; } . cost - summary { display : flex ; flex - wrap : wrap ; gap : var ( -- admin - space - 4 ) var ( -- admin - space - 6 ) ; padding : var ( -- admin - space - 4 ) var ( -- admin - space - 5 ) ; background : # f8fafc ; font - size : var ( -- admin - font - body ) ; } . cost - summary span { color : var ( -- cc - muted ) ; } . fee - form { display : grid ; grid - template - columns : repeat ( 2 , minmax ( 0 , 1 fr ) ) ; gap : 0 var ( -- admin - space - 5 ) ; margin - top : var ( -- admin - space - 5 ) ; } . fee - form : deep ( . el - form - item : last - child ) { grid - column : 1 / - 1 ; }
. voucher - field { grid - column : 1 / - 1 ; } . voucher - control { display : flex ; align - items : center ; flex - wrap : wrap ; gap : var ( -- admin - space - 4 ) ; width : 100 % ; } . voucher - picker { display : inline - flex ; align - items : center ; gap : var ( -- admin - space - 2 ) ; padding : 7 px var ( -- admin - space - 5 ) ; border : 1 px solid var ( -- cc - border ) ; border - radius : var ( -- admin - radius ) ; color : var ( -- el - color - primary ) ; cursor : pointer ; } . voucher - picker . is - disabled { cursor : not - allowed ; opacity : .6 ; } . voucher - picker input { position : absolute ; width : 1 px ; height : 1 px ; opacity : 0 ; } . voucher - hint { color : var ( -- cc - muted ) ; font - size : var ( -- admin - font - caption ) ; } . voucher - list { display : grid ; width : 100 % ; gap : var ( -- admin - space - 2 ) ; margin - top : var ( -- admin - space - 3 ) ; } . voucher - list > span { display : flex ; align - items : center ; justify - content : space - between ; gap : var ( -- admin - space - 3 ) ; padding : var ( -- admin - space - 2 ) 9 px ; border - radius : 5 px ; background : var ( -- el - fill - color - light ) ; } . voucher - list > span > span { overflow : hidden ; text - overflow : ellipsis ; white - space : nowrap ; } . voucher - list button { display : inline - flex ; padding : 2 px ; border : 0 ; background : transparent ; color : var ( -- el - color - danger ) ; cursor : pointer ; }
. adjust - snapshot p { margin : 0 0 var ( -- admin - space - 5 ) ; color : var ( -- cc - muted ) ; font - size : var ( -- admin - font - body ) ; line - height : 1.5 ; }
. row - actions { flex - wrap : wrap ; } . allocation - section { padding - top : var ( -- admin - space - 5 ) ; border - top : 1 px solid var ( -- cc - border ) ; } . cost - block { border - top : 1 px solid var ( -- cc - border ) ; } . cost - summary { display : flex ; flex - wrap : wrap ; gap : var ( -- admin - space - 4 ) var ( -- admin - space - 6 ) ; padding : var ( -- admin - space - 4 ) var ( -- admin - space - 5 ) ; background : # f8fafc ; font - size : var ( -- admin - font - body ) ; } . cost - summary span { color : var ( -- cc - muted ) ; } . fee - editor - table { table - layout : fixed ; }
. voucher - control { display : flex ; align - items : center ; flex - wrap : wrap ; gap : var ( -- admin - space - 4 ) ; width : 100 % ; } . voucher - picker { display : inline - flex ; align - items : center ; gap : var ( -- admin - space - 2 ) ; padding : 7 px var ( -- admin - space - 5 ) ; border : 1 px solid var ( -- cc - border ) ; border - radius : var ( -- admin - radius ) ; color : var ( -- el - color - primary ) ; cursor : pointer ; } . voucher - picker . is - disabled { cursor : not - allowed ; opacity : .6 ; } . voucher - picker input { position : absolute ; width : 1 px ; height : 1 px ; opacity : 0 ; } . voucher - hint { color : var ( -- cc - muted ) ; font - size : var ( -- admin - font - caption ) ; } . voucher - list { display : grid ; width : 100 % ; gap : var ( -- admin - space - 2 ) ; margin - top : var ( -- admin - space - 3 ) ; } . voucher - list > span { display : flex ; align - items : center ; justify - content : space - between ; gap : var ( -- admin - space - 3 ) ; padding : var ( -- admin - space - 2 ) 9 px ; border - radius : 5 px ; background : var ( -- el - fill - color - light ) ; } . voucher - list > span > span { overflow : hidden ; text - overflow : ellipsis ; white - space : nowrap ; } . voucher - list button { display : inline - flex ; padding : 2 px ; border : 0 ; background : transparent ; color : var ( -- el - color - danger ) ; cursor : pointer ; }
. business - reference { display : grid ; gap : 2 px ; } . business - reference small { color : var ( -- cc - muted ) ; }
. allocation - editor { grid - column : 1 / - 1 ; } . allocation - editor : deep ( . el - form - item _ _content ) { display : block ; }
. allocation - editor _ _rows { display : grid ; gap : var ( -- admin - space - 3 ) ; margin - top : var ( -- admin - space - 4 ) ; } . allocation - editor _ _row { display : grid ; grid - template - columns : minmax ( 0 , 1 fr ) 160 px ; align - items : center ; gap : var ( -- admin - space - 5 ) ; padding : var ( -- admin - space - 3 ) var ( -- admin - space - 4 ) ; border : 1 px solid var ( -- cc - border ) ; border - radius : var ( -- admin - radius ) ; } . allocation - editor _ _row > span { display : grid ; min - width : 0 ; } . allocation - editor _ _row small { overflow : hidden ; color : var ( -- cc - muted ) ; text - overflow : ellipsis ; white - space : nowrap ; } . allocation - editor _ _sum { margin : var ( -- admin - space - 3 ) 0 0 ; text - align : right ; color : var ( -- el - color - success ) ; } . allocation - editor _ _sum . is - error { color : var ( -- el - color - danger ) ; }
@ media ( max - width : 640 px ) { . fees - header { align - items : stretch ; flex - direction : column ; } . fees - header . el - button { width : 100 % ; } . fee - form { grid - template - columns : 1 fr ; } . fee - form : deep ( . el - form - item : last - child ) { grid - column : auto ; } . customer - context { align - items : stretch ; flex - direction : column ; } }
. allocation - editor { margin - top : var ( -- admin - space - 5 ) ; } . allocation - editor : deep ( . el - form - item _ _content ) { display : block ; } . allocation - editor - table { margin - top : var ( -- admin - space - 3 ) ; } . allocation - amount { width : 180 px ; } . allocation - editor _ _sum { color : var ( -- el - color - success ) ; } . allocation - editor _ _sum . is - error { color : var ( -- el - color - danger ) ; }
@ media ( max - width : 640 px ) { . fees - header { align - items : stretch ; flex - direction : column ; } . fees - header . el - button { width : 100 % ; } . fee - editor - table , . fee - editor - table tbody , . fee - editor - table tr , . fee - editor - table td { display : block ; width : 100 % ; } . customer - context { align - items : stretch ; flex - direction : column ; } }
< / style >