@@ -1,6 +1,10 @@
< script setup lang = "ts" >
import { computed , onMounted , reactive , ref } from 'vue'
import { computed , onMounted , reactive , ref , watch } from 'vue'
import { useRoute , useRouter } from 'vue-router'
import { ElMessage , type FormInstance , type FormRules } from 'element-plus'
import DataTable , { type DataTableColumn } from '@/components/common/DataTable.vue'
import QueryToolbar , { type QueryField , type QueryModel } from '@/components/common/QueryToolbar.vue'
import type { TableAction } from '@/components/common/tableActions'
import { useAuthStore } from '@/modules/auth/public'
import {
createProcurement ,
@@ -15,8 +19,11 @@ import {
} from '../api/businessOrders'
import { CONTAINER _SPECIFICATIONS , DEFAULT _CONTAINER _TYPE } from '../containerSpecifications'
const props = defineProps < { kind : CrossBorderBusinessKind } > ( )
const props = withDefaults ( defineProps < { kind : CrossBorderBusinessKind ; createPage ? : boolean ; detailPage ? : boolean } > ( ) , { createPage : false , detailPage : false } )
const auth = useAuthStore ( )
const router = useRouter ( )
const route = useRoute ( )
const detailOrderNo = computed ( ( ) => String ( route . params . orderNo || '' ) )
const canCreate = computed ( ( ) => auth . hasPermission ( ( {
procurement : 'merchant:cross-border:procurement:create' ,
trucking : 'merchant:cross-border:domestic-trucking:create' ,
@@ -101,7 +108,7 @@ function transportColumns(looseboard: boolean): ColumnDefinition[] {
]
}
const mode = ref < PageMode > ( 'list' )
const mode = ref < PageMode > ( props . detailPage ? 'detail' : props . createPage ? 'create' : 'list' )
const loading = ref ( false )
const submitting = ref ( false )
const submitKey = ref ( '' )
@@ -112,6 +119,52 @@ const formRef = ref<FormInstance>()
const query = reactive ( { page : 1 , size : 20 , orderNo : '' , routeKeyword : '' , status : '' , productName : '' , purchaseCategory : '' } )
const total = ref ( 0 )
const queryModel = computed < QueryModel > ( {
get : ( ) => ( {
orderNo : query . orderNo ,
purchaseCategory : query . purchaseCategory ,
productName : query . productName ,
routeKeyword : query . routeKeyword ,
status : query . status ,
} ) ,
set : ( value ) => {
query . orderNo = String ( value . orderNo || '' )
query . purchaseCategory = String ( value . purchaseCategory || '' )
query . productName = String ( value . productName || '' )
query . routeKeyword = String ( value . routeKeyword || '' )
query . status = String ( value . status || '' )
} ,
} )
const queryFields = computed < QueryField [ ] > ( ( ) => [
{ key : 'orderNo' , label : '订单号' , type : 'input' , placeholder : '请输入订单号' } ,
... ( props . kind === 'procurement'
? [
{ key : 'purchaseCategory' , label : '采购品类' , type : 'input' , placeholder : '请输入采购品类' } as QueryField ,
{ key : 'productName' , label : '商品名称' , type : 'input' , placeholder : '请输入商品名称' } as QueryField ,
]
: [ { key : 'routeKeyword' , label : '运输路线' , type : 'input' , placeholder : '请输入起运地或目的地' } as QueryField ] ) ,
{
key : 'status' ,
label : '状态' ,
type : 'select' ,
placeholder : '全部' ,
options : [
{ label : '待审核' , value : 'PENDING_REVIEW' } ,
{ label : '已通过' , value : 'APPROVED' } ,
{ label : '已拒绝' , value : 'REJECTED' } ,
{ label : '待出库' , value : 'PENDING_OUTBOUND' } ,
{ label : '部分出库' , value : 'PARTIALLY_OUTBOUND' } ,
{ label : '全部出库' , value : 'OUTBOUNDED' } ,
{ label : '待接单' , value : 'PENDING_ACCEPTANCE' } ,
{ label : '处理中' , value : 'PROCESSING' } ,
{ label : '运输中' , value : 'IN_TRANSIT' } ,
{ label : '已完成' , value : 'COMPLETED' } ,
{ label : '已取消' , value : 'CANCELLED' } ,
] ,
} ,
] )
const form = reactive < BusinessForm > ( emptyForm ( ) )
const rules : FormRules < BusinessForm > = {
purchaseCategory : [ { required : true , message : '请输入采购品类' , trigger : 'blur' } ] ,
@@ -131,7 +184,7 @@ const detailFields = computed(() => {
if ( props . kind === 'procurement' ) {
const current = detail . value as ProcurementDetail
return [
[ '订单号' , summary . orderNo ] , [ ' 采购品类', read ( summary , 'purchaseCategory' ) ] ,
[ '采购品类' , read ( summary , 'purchaseCategory' ) ] ,
[ '商品名称' , read ( summary , 'productName' ) ] , [ '商品规格' , read ( summary , 'productSpecification' ) ] ,
[ '采购数量' , read ( summary , 'purchaseQuantity' ) ] , [ '预算单价' , money ( read ( summary , 'budgetUnitPrice' ) , read ( summary , 'currency' ) ) ] ,
[ '入库量' , read ( summary , 'inboundQuantity' ) ] , [ '出库量' , read ( summary , 'outboundQuantity' ) ] ,
@@ -140,12 +193,12 @@ const detailFields = computed(() => {
[ '收货地址' , current . receivingAddress ] , [ '商品链接' , current . productUrl ] ,
[ '国内运单' , joinText ( current . domesticCarrier , current . domesticTrackingNo ) ] ,
[ '海外运单' , joinText ( current . overseasCarrier , current . overseasTrackingNo ) ] ,
[ '状态' , statusLabel ( summary . status ) ] , [ ' 审核备注', current . reviewRemark ] , [ '备注' , current . remark ] ,
[ '审核备注' , current . reviewRemark ] , [ '备注' , current . remark ] ,
]
}
const current = detail . value as TransportDetail
return [
[ '订单编号' , summary . orderNo ] , [ ' 运输方式', read ( summary , 'transportMode' ) ] ,
[ '运输方式' , read ( summary , 'transportMode' ) ] ,
[ '是否打盘' , yesNo ( read ( summary , 'palletRequired' ) ) ] , [ '运输类型' , transportTypeLabel ( read ( summary , 'transportType' ) ) ] ,
[ '起运地' , read ( summary , 'origin' ) ] , [ '起运地址' , current . originAddress ] ,
[ '目的地' , read ( summary , 'destination' ) ] , [ '目的地址' , current . destinationAddress ] ,
@@ -153,10 +206,22 @@ const detailFields = computed(() => {
[ '件数' , read ( summary , 'packageCount' ) ] , [ '总重量(kg)' , read ( summary , 'totalWeightKg' ) ] ,
[ '总体积(m³)' , read ( summary , 'totalVolumeCbm' ) ] , [ '预算总价' , money ( read ( summary , 'budgetAmount' ) , read ( summary , 'currency' ) ) ] ,
[ '联系人' , read ( summary , 'contactName' ) ] , [ '联系方式' , read ( summary , 'contactInfo' ) ] ,
[ '要求时间' , read ( summary , 'requestedDate' ) ] , [ '状态' , statusLabel ( summary . status ) ] , [ ' 备注', current . remark ] ,
[ '要求时间' , read ( summary , 'requestedDate' ) ] , [ '备注' , current . remark ] ,
]
} )
const tableColumns = computed < DataTableColumn [ ] > ( ( ) => [
{ key : 'actions' , label : '操作' , width : 90 , fixed : 'left' , slotName : 'actions' } ,
... configuration . value . columns . map ( ( column ) => ( {
... column ,
prop : column . key ,
slotName : [ 'orderNo' , 'status' ] . includes ( column . key ) ? column . key : undefined ,
formatter : ( row : object ) => displayCell ( row , column . key ) ,
} ) ) ,
] )
const detailStatus = computed ( ( ) => detail . value ? statusLabel ( detail . value . summary . status ) : '—' )
function emptyForm ( ) : BusinessForm {
return {
purchaseCategory : '' , productName : '' , productSpecification : '' , productUrl : '' , purchaseQuantity : 1 ,
@@ -179,6 +244,9 @@ function transportModeLabel(value: unknown) { return ({ SHARED_TRUCK: '拼车',
function statusLabel ( value : unknown ) {
return ( { PENDING _REVIEW : '待审核' , APPROVED : '已通过' , REJECTED : '已拒绝' , PENDING _OUTBOUND : '待出库' , PARTIALLY _OUTBOUND : '部分出库' , OUTBOUNDED : '全部出库' , PENDING _ACCEPTANCE : '待接单' , PROCESSING : '处理中' , IN _TRANSIT : '运输中' , COMPLETED : '已完成' , CANCELLED : '已取消' } as Record < string , string > ) [ String ( value ) ] || text ( value )
}
function statusTone ( value : unknown ) {
return ( { APPROVED : 'success' , COMPLETED : 'success' , OUTBOUNDED : 'success' , REJECTED : 'danger' , CANCELLED : 'info' , PENDING _REVIEW : 'warning' , PENDING _ACCEPTANCE : 'warning' , PROCESSING : 'primary' , IN _TRANSIT : 'primary' } as Record < string , ' success ' | ' warning ' | ' danger ' | ' info ' | ' primary ' > ) [ String ( value ) ] || 'info'
}
function displayCell ( candidate : unknown , key : string ) {
const row = candidate as BusinessRow
const value = read ( row , key )
@@ -219,16 +287,52 @@ function resetQuery() {
void load ( )
}
async function openDetail ( candidate : unknown ) {
function searchOrders ( ) {
query . page = 1
void load ( )
}
function getRowActions ( candidate : object ) : TableAction [ ] {
return [ { key : 'detail' , label : '详情' , run : ( ) => openDetail ( candidate ) } ]
}
function detailFieldClass ( label : unknown ) {
return [ '收货地址' , '商品链接' , '国内运单' , '海外运单' , '审核备注' , '备注' , '起运地址' , '目的地址' ] . includes ( String ( label ) ) ? 'is-wide' : ''
}
const listRouteName = computed ( ( ) => ( {
procurement : 'cross-border-procurement' ,
trucking : 'cross-border-domestic-trucking' ,
looseboard : 'cross-border-pallet-shipping' ,
} as Record < CrossBorderBusinessKind , string > ) [ props . kind ] )
const detailRouteName = computed ( ( ) => ( {
procurement : 'cross-border-procurement-detail' ,
trucking : 'cross-border-domestic-trucking-detail' ,
looseboard : 'cross-border-pallet-shipping-detail' ,
} as Record < CrossBorderBusinessKind , string > ) [ props . kind ] )
function returnToList ( ) {
if ( props . createPage || props . detailPage ) {
void router . push ( { name : listRouteName . value } )
return
}
mode . value = 'list'
}
function openDetail ( candidate : unknown ) {
const row = candidate as BusinessRow
void router . push ( { name : detailRouteName . value , params : { orderNo : row . orderNo } } )
}
async function loadDetail ( ) {
if ( ! detailOrderNo . value ) return
loading . value = true
error . value = ''
try {
detail . value = props . kind === 'procurement'
? await getBusinessOrder < ProcurementDetail > ( 'procurement' , row . orderNo )
: await getBusinessOrder < TransportDetail > ( props . kind , row . orderNo )
? await getBusinessOrder < ProcurementDetail > ( 'procurement' , detailOrderNo . value )
: await getBusinessOrder < TransportDetail > ( props . kind , detailOrderNo . value )
mode . value = 'detail'
} catch ( cause ) { ElMessage . error ( errorMessage ( cause ) ) }
} catch ( cause ) { detail . value = null ; error . value = errorMessage ( cause ) ; ElMessage . error ( error . value ) }
finally { loading . value = false }
}
@@ -264,57 +368,53 @@ async function submit() {
: { ... base , transportMode : form . transportMode , palletRequired : form . palletRequired } )
}
ElMessage . success ( '订单提交成功' )
mode . value = 'list'
resetForm ( )
await load ( )
if ( props . createPage ) await router . push ( { name : listRouteName . value } )
else { mode . value = 'list' ; await load ( ) }
} catch ( cause ) { ElMessage . error ( errorMessage ( cause ) ) }
finally { submitting . value = false }
}
onMounted ( ( ) => void load ( ) )
watch ( ( ) => [ query . page , query . size ] , ( ) => { if ( ! props . createPage && mode . value === 'list' ) void load ( ) } )
onMounted ( ( ) => { if ( props . detailPage ) void loadDetail ( ) ; else if ( ! props . createPage ) void load ( ) } )
< / script >
< template >
< section v-loading = "loading" class="business-orders" :aria-busy="loading" >
< header class = "page-head" >
< section v-loading = "loading" class="business-orders client-ui " :aria-busy="loading" >
< header v-if = "mode === 'create'" class=" page-head" >
< div >
< h2 > { { mode === 'detail' ? ` ${ configuration . title } 订单详情 ` : mode === 'create' ? ` ${ configuration . title } 下单 ` : configuration . title } } < / h2 >
< p > { { mode === 'list' ? configuration . description : mode === 'create' ? '请填写订单信息,带 * 项为必填项' : ` 订单号: ${ detail ? . summary . orderNo || '—' } ` } } < / p >
< h2 > { { configuration . title } } 下单 < / h2 >
< p > 请填写订单信息 , 带 * 项为必填项 < / p >
< / div >
< el-button v-if = "mode !== 'list'" @click="mode = 'l ist' "> 返回列表 < / el -button >
< el-button v-else-if = "canCreate" type="primary" @click="resetForm(); mode = 'create'" > 新增下单 < / el -button >
< el-button @click ="returnToL ist"> 返回列表 < / el -button >
< / header >
< template v-if = "mode === 'list'" >
< el -alert v-if = "error" :title="error" type="error" show-icon :closable="false" >
< template # default > < el-button size = "small" @click ="load" > 重新加载 < / el -button > < / template >
< / el-alert >
< el-card shadow = "never" class = "filter-card" >
< el-form inline @submit.prevent ="query.page = 1; load()" >
< el -form -item label = "订单号" > < el-input v -model .trim = " query.orderNo " clearable placeholder = "请输入订单号" / > < / el-form-item >
< el-form-item v-if = "kind === 'procurement'" label="采购品类"><el-input v-model.trim="query.purchaseCategory" clearable placeholder="请输入采购品类" / > < / el-form-item >
< el-form-item v-if = "kind === 'procurement'" label="商品名称"><el-input v-model.trim="query.productName" clearable placeholder="请输入商品名称" / > < / el-form-item >
< el-form-item v-else label = "运输路线" > < el-input v -model .trim = " query.routeKeyword " clearable placeholder = "起运地或目的地" / > < / el-form-item >
< el-form-item label = "状态" > < el-input v -model .trim = " query.status " clearable placeholder = "请输入状态" / > < / el-form-item >
< el-form-item > < el-button type = "primary" native -type = " submit " > 查询 < / el-button > < el-button @click ="resetQuery" > 重置 < / el -button > < / el-form-item >
< / el-form >
< / el-card >
< el-card shadow = "never" >
< el-table :data = "rows" empty -text = " 暂无订单 " border >
< el-table-column label = "操作" width = "90" fixed = "left" > < template # default = "scope" > < el-button link type = "primary" @click ="openDetail(scope.row)" > 查看 < / el -button > < / template > < / el-table-column >
< el-table-column v-for = "column in configuration.columns" :key="column.key" :label="column.label" :width="column.width" show -overflow -tooltip >
< template # default = "scope" > { { displayCell ( scope . row , column . key ) } } < / template >
< / el-table-column >
< / el-table >
< el-pagination v -model :current-page = "query.page" v -model :page-size = "query.size" class = "pagination" :total = "total" : page -sizes = " [ 10 , 20 , 50 , 100 ] " layout = "total, sizes, prev, pager, next" @change ="load" / >
< / el-card >
< QueryToolbar v-model = "queryModel" layout="grid" ariaLabel="订单查询条件" :fields="queryFields" :search-on-reset="false" @search="searchOrders" @reset="resetQuery" / >
< div class = "business-table-card" >
< DataTable v -model :page = "query.page" v -model :page-size = "query.size" :data = "rows" :columns = "tableColumns" :loading = "loading" :total = "total" : page -sizes = " [ 10 , 20 , 50 , 100 ] " :row-actions = "getRowActions" row -key = " orderNo " empty -text = " 暂无订单 " >
< template # toolbar > < strong > 订单列表 < / strong > < span > 共 { { total } } 条 < / span > < / template >
< template # toolbar -actions > < el-button v-if = "canCreate" type="primary" @click="resetForm(); mode = 'create'" > 新增下单 < / el -button > < / template >
< template v-if = "error" #error><div class="business-load-error" role="alert"><span>{{ error }}</span><el-button size="small" @click="load" > 重新加载 < / el -button > < / div > < / template >
< template # orderNo = "{ row }" > < button class = "business-order-link" type = "button" @click ="openDetail(row)" > {{ ( row as BusinessRow ) .orderNo }} < / button > < / template >
< template # status = "{ row }" > < el-tag : type = "statusTone((row as BusinessRow).status)" effect = "light" size = "small" > { { statusLabel ( ( row as BusinessRow ) . status ) } } < / el-tag > < / template >
< / DataTable >
< / div >
< / template >
< el-card v-else-if = "mode === 'detail'" shadow="never " >
< dl class = "detail-grid " >
< div v-for = "field in detailFields" :key="String(field[0])" > < dt > { { field [ 0 ] } } < / dt > < dd > { { text ( field [ 1 ] ) } } < / dd > < / div >
< / dl >
< / el-card >
< section v-else-if = "mode === 'detail'" class="business-detail-page" aria-label="订单详情 " >
< header class = "business-detail-heading " >
< div class = "business-detail-heading-main" > < el-button link type = "primary" @click ="returnToList" > ← 返回列表 < / el -button > < div > < h2 > { { detail ? . summary . orderNo || '订单详情' } } < / h2 > < p > { { configuration . title } } 订单 < / p > < / div > < / div >
< el-tag :type = "statusTone(detail?.summary.status)" effect = "light" > { { detailStatus } } < / el-tag >
< / header >
< div v-if = "error" class="business-detail-error" role="alert"><strong>{{ error }}</strong><el-button size="small" @click="loadDetail" > 重新加载 < / el -button > < / div >
< section v-else class = "business-detail-section" >
< h3 > 订单信息 < / h3 >
< dl class = "detail-grid" >
< div v-for = "field in detailFields" :key="String(field[0])" :class="detailFieldClass(field[0])" > < dt > { { field [ 0 ] } } < / dt > < dd > { { text ( field [ 1 ] ) } } < / dd > < / div >
< / dl >
< / section >
< / section >
< el-card v-else shadow = "never" class = "form-card" >
< el-form ref = "formRef" :model = "form" :rules = "rules" label -width = " 120px " >
@@ -345,24 +445,35 @@ onMounted(() => void load())
< el-form-item label = "联系人" prop = "contactName" > < el-input v -model .trim = " form.contactName " maxlength = "128" placeholder = "请输入联系人" / > < / el-form-item >
< el-form-item label = "联系方式" prop = "contactInfo" > < el-input v -model .trim = " form.contactInfo " maxlength = "128" placeholder = "请输入电话、微信或邮箱" / > < / el-form-item >
< el-form-item label = "备注" > < el-input v-model = "form.remark" type="textarea" :rows="4" maxlength="1000" show-word-limit placeholder="请输入其他要求" / > < / el-form-item >
< el-form-item > < el-button @click ="mode = 'l ist' " > 取消 < / el -button > < el-button v-if = "canCreate" type="primary" :loading="submitting" @click="submit" > 提交订单 < / el -button > < / el-form-item >
< el-form-item > < el-button @click ="returnToL ist" > 取消 < / el -button > < el-button v-if = "canCreate" type="primary" :loading="submitting" @click="submit" > 提交订单 < / el -button > < / el-form-item >
< / el-form >
< / el-card >
< / section >
< / template >
< style scoped >
. business - orders { display : grid ; gap : 18 px ; }
. business - orders { display : grid ; gap : var ( -- client - section - gap ) ; }
. page - head { display : flex ; align - items : center ; justify - content : space - between ; gap : 24 px ; }
. page - head h2 { margin : 0 ; color : # 111827 ; font - size : 26 px ; }
. page - head p { margin : 7 px 0 0 ; color : # 64748 b ; font - size : 14 px ; }
. filter - card : deep ( . el - form - item ) { margin - bottom : 0 ; }
. filter - card : deep ( . el - input ) { width : 190 px ; }
. pagination { justify - content : flex - end ; margin - top : 18 px ; }
. detail - grid { display : grid ; grid - template - columns : repeat ( 3 , minmax ( 0 , 1 fr ) ) ; margin : 0 ; }
. detail - grid div { min - width : 0 ; padding : 18 px 20 px ; border - right : 1 px solid # ebeef5 ; border - bottom : 1 px solid # ebeef5 ; }
. detail - grid dt { margin - bottom : 7 px ; color : # 8492 a6 ; font - size : 13 px ; }
. detail - grid dd { margin : 0 ; overflow - wrap : anywhere ; color : # 1 f2937 ; line - height : 1.55 ; }
. business - table - card { overflow : hidden ; border : 1 px solid var ( -- client - border ) ; border - radius : var ( -- client - radius ) ; background : # fff ; }
. business - order - link { max - width : 100 % ; overflow : hidden ; padding : 0 ; border : 0 ; background : transparent ; color : var ( -- client - action ) ; cursor : pointer ; font : inherit ; font - weight : 650 ; text - align : left ; text - overflow : ellipsis ; white - space : nowrap ; }
. business - order - link : hover { text - decoration : underline ; text - underline - offset : 3 px ; }
. business - load - error { display : flex ; min - height : 84 px ; align - items : center ; justify - content : center ; gap : 12 px ; padding : 14 px ; color : # b42318 ; }
. business - detail - error { display : flex ; min - height : 180 px ; align - items : center ; justify - content : center ; gap : 12 px ; color : # b42318 ; }
. business - detail - page { min - width : 0 ; padding : 10 px 14 px 20 px ; overflow : hidden ; border : 1 px solid var ( -- client - border ) ; border - radius : var ( -- client - radius ) ; background : # fff ; }
. business - detail - heading { display : flex ; min - height : 50 px ; align - items : center ; justify - content : space - between ; gap : 16 px ; padding : 5 px 0 ; border - bottom : 1 px solid var ( -- border ) ; }
. business - detail - heading - main { display : flex ; min - width : 0 ; align - items : center ; gap : 12 px ; }
. business - detail - heading - main > div { min - width : 0 ; }
. business - detail - heading h2 { margin : 0 ; overflow : hidden ; color : var ( -- navy ) ; font - size : 18 px ; text - overflow : ellipsis ; white - space : nowrap ; }
. business - detail - heading p { margin : 3 px 0 0 ; color : var ( -- muted ) ; font - size : 11 px ; }
. business - detail - section { margin - top : 10 px ; }
. business - detail - section h3 { margin : 0 ; padding : 0 0 5 px ; border - bottom : 1 px solid # eaf0f7 ; color : var ( -- navy ) ; font - size : 13 px ; }
. detail - grid { display : grid ; grid - template - columns : repeat ( 4 , minmax ( 0 , 1 fr ) ) ; margin : 0 ; border - top : 1 px solid var ( -- border ) ; border - left : 1 px solid var ( -- border ) ; }
. detail - grid div { display : grid ; min - width : 0 ; min - height : 34 px ; grid - template - columns : 76 px minmax ( 0 , 1 fr ) ; align - items : center ; gap : 7 px ; padding : 3 px 8 px ; border - right : 1 px solid var ( -- border ) ; border - bottom : 1 px solid var ( -- border ) ; }
. detail - grid div . is - wide { grid - column : span 2 ; }
. detail - grid dt { color : var ( -- muted ) ; font - size : 10 px ; white - space : nowrap ; }
. detail - grid dd { min - width : 0 ; margin : 0 ; overflow - wrap : anywhere ; color : var ( -- navy ) ; font - size : 12 px ; font - weight : 600 ; line - height : 1.4 ; }
. form - card : deep ( . el - form ) { max - width : 860 px ; }
. form - card : deep ( . el - input ) , . form - card : deep ( . el - textarea ) , . form - card : deep ( . el - select ) { width : 100 % ; }
. form - card . currency { width : 110 px ; margin - left : 12 px ; }
@@ -373,15 +484,10 @@ onMounted(() => void load())
. page - head h2 { font - size : 24 px ; }
. page - head > div { min - width : 0 ; }
. filter - card : deep ( . el - form ) { display : grid ; grid - template - columns : 1 fr ; }
. filter - card : deep ( . el - form - item ) { width : 100 % ; margin - right : 0 ; margin - bottom : 12 px ; }
. filter - card : deep ( . el - form - item : last - child ) { margin - bottom : 0 ; }
. filter - card : deep ( . el - form - item _ _content ) ,
. filter - card : deep ( . el - input ) { width : 100 % ; }
. detail - grid { grid - template - columns : 1 fr ; }
. detail - grid div { padding : 14 px 16 px ; border - right : 0 ; }
. detail - grid div , . detail - grid div . is - wide { grid - column : auto ; }
. detail - grid dd { overflow - wrap : break - word ; word - break : normal ; }
. business - detail - heading { align - items : flex - start ; flex - direction : column ; }
. form - card : deep ( . el - form - item ) { display : block ; }
. form - card : deep ( . el - form - item _ _label ) {