|
|
@@ -1,170 +1,216 @@
|
|
|
<!-- 配送时效预警页面 -->
|
|
|
<template>
|
|
|
<div class="page-container">
|
|
|
- <div class="search-bar">
|
|
|
- <el-form :inline="true" :model="searchForm">
|
|
|
- <el-form-item label="预警类型">
|
|
|
- <el-select v-model="searchForm.warningType" placeholder="请选择类型" clearable>
|
|
|
- <el-option label="全部" value="" />
|
|
|
- <el-option label="超时" value="timeout" />
|
|
|
- <el-option label="时效预警" value="advance_deadline" />
|
|
|
- <el-option label="紧急" value="urgent" />
|
|
|
- <el-option label="危急" value="critical" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item label="处理状态">
|
|
|
- <el-select v-model="searchForm.isResolved" placeholder="请选择状态" clearable>
|
|
|
- <el-option label="全部" value="" />
|
|
|
- <el-option label="未解决" :value="false" />
|
|
|
- <el-option label="已解决" :value="true" />
|
|
|
- </el-select>
|
|
|
- </el-form-item>
|
|
|
- <el-form-item>
|
|
|
- <el-button type="primary" @click="handleSearch">搜索</el-button>
|
|
|
- <el-button @click="handleReset">重置</el-button>
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- </div>
|
|
|
- <el-table
|
|
|
- ref="warningTableRef"
|
|
|
- class="delivery-warning-table"
|
|
|
- :data="tableData"
|
|
|
- v-loading="loading"
|
|
|
- stripe
|
|
|
- @expand-change="handleRowExpand"
|
|
|
- >
|
|
|
- <el-table-column type="expand" width="48">
|
|
|
- <template #default="{ row }">
|
|
|
- <div class="delivery-row-expand-wrap" v-loading="!!expandedRowLoadingMap[row.id]">
|
|
|
- <div v-if="getExpandedItems(row.id).length" class="delivery-row-expand-block">
|
|
|
- <div class="sqxp-subtable-wrap">
|
|
|
- <el-table :data="getExpandedItems(row.id)" stripe size="small" class="delivery-row-expand-table sqxp-subtable">
|
|
|
- <el-table-column prop="productName" label="商品" min-width="220">
|
|
|
- <template #default="{ row: line }">
|
|
|
- <div class="expand-product-cell">
|
|
|
- <div class="expand-product-thumb-wrap">
|
|
|
- <el-image v-if="line.imageUrl" :src="line.imageUrl" fit="cover" class="expand-product-thumb" />
|
|
|
- <span v-else class="expand-product-thumb placeholder">无图</span>
|
|
|
- </div>
|
|
|
- <span class="expand-product-name">{{ line.productName || '-' }}</span>
|
|
|
- </div>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="categoryName" label="分类" min-width="120" show-overflow-tooltip>
|
|
|
- <template #default="{ row: line }">
|
|
|
- {{ formatCategoryPathLabel(line.categoryId ?? line.category_id, line.categoryName) }}
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="计量" width="88" align="center">
|
|
|
- <template #default="{ row: line }">{{ formatMeasureCell(line.measureValue) }}</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="unitName" label="单位" width="70" align="center" />
|
|
|
- <el-table-column prop="quantity" label="数量" width="80" align="right" />
|
|
|
- <el-table-column label="单价(元)" min-width="110" align="right">
|
|
|
- <template #default="{ row: line }">
|
|
|
- <span v-if="line.unitPrice == null || line.unitPrice === ''">-</span>
|
|
|
- <span v-else>¥{{ formatMoney(line.unitPrice) }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="金额(元)" min-width="110" align="right">
|
|
|
- <template #default="{ row: line }">
|
|
|
- <span v-if="line.amount == null || line.amount === ''">-</span>
|
|
|
- <span v-else>¥{{ formatMoney(line.amount) }}</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="status" label="状态" min-width="100" align="center">
|
|
|
- <template #default="{ row: line }">
|
|
|
- <el-tag :type="getDeliveryStatusType(line.status)" size="small">{{ getDeliveryStatusText(line.status) }}</el-tag>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- </div>
|
|
|
- <div class="delivery-row-expand-summary sqxp-subtable-summary">
|
|
|
- <span>商品行数:{{ getExpandedItems(row.id).length }}</span>
|
|
|
- </div>
|
|
|
+ <header class="page-head">
|
|
|
+ <h1>时效预警</h1>
|
|
|
+ <p class="page-desc">集中查看即将超时与已超时任务,支持快速处理与查看配送明细。</p>
|
|
|
+ </header>
|
|
|
+
|
|
|
+ <section class="panel">
|
|
|
+ <div class="panel-top">
|
|
|
+ <h2>
|
|
|
+ <span class="title-ic" aria-hidden="true">
|
|
|
+ <el-icon><Bell /></el-icon>
|
|
|
+ </span>
|
|
|
+ 预警列表
|
|
|
+ </h2>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="filter-block">
|
|
|
+ <el-form :model="searchForm" class="filter-form" label-position="top" @submit.prevent>
|
|
|
+ <div class="filter-grid">
|
|
|
+ <el-form-item label="预警类型">
|
|
|
+ <el-select v-model="searchForm.warningType" placeholder="全部" clearable @keyup.enter="handleSearch">
|
|
|
+ <el-option label="全部" value="" />
|
|
|
+ <el-option label="超时" value="timeout" />
|
|
|
+ <el-option label="时效预警" value="advance_deadline" />
|
|
|
+ <el-option label="紧急" value="urgent" />
|
|
|
+ <el-option label="危急" value="critical" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ <el-form-item label="处理状态">
|
|
|
+ <el-select v-model="searchForm.isResolved" placeholder="全部" clearable @keyup.enter="handleSearch">
|
|
|
+ <el-option label="全部" value="" />
|
|
|
+ <el-option label="未解决" :value="false" />
|
|
|
+ <el-option label="已解决" :value="true" />
|
|
|
+ </el-select>
|
|
|
+ </el-form-item>
|
|
|
+ </div>
|
|
|
+ <div class="filter-actions-row">
|
|
|
+ <div class="filter-actions-end">
|
|
|
+ <el-button class="btn-ghost auto-icon-refresh" @click="handleReset">重置</el-button>
|
|
|
+ <el-button class="btn-main auto-icon-search" type="primary" @click="handleSearch">搜索</el-button>
|
|
|
</div>
|
|
|
- <el-empty v-else-if="!expandedRowLoadingMap[row.id]" description="暂无商品明细" :image-size="72" />
|
|
|
</div>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <div class="list-body list-wrap">
|
|
|
+ <el-table
|
|
|
+ ref="warningTableRef"
|
|
|
+ class="delivery-warning-table list-table"
|
|
|
+ :data="tableData"
|
|
|
+ v-loading="loading"
|
|
|
+ stripe
|
|
|
+ @expand-change="handleRowExpand"
|
|
|
+ >
|
|
|
+ <el-table-column type="expand" width="48">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <div class="delivery-row-expand-wrap" v-loading="!!expandedRowLoadingMap[row.id]">
|
|
|
+ <div v-if="getExpandedItems(row.id).length" class="delivery-row-expand-block">
|
|
|
+ <div class="sqxp-subtable-wrap">
|
|
|
+ <el-table
|
|
|
+ :data="getExpandedItems(row.id)"
|
|
|
+ stripe
|
|
|
+ size="small"
|
|
|
+ class="delivery-row-expand-table sqxp-subtable"
|
|
|
+ >
|
|
|
+ <el-table-column prop="productName" label="商品" min-width="220">
|
|
|
+ <template #default="{ row: line }">
|
|
|
+ <div class="expand-product-cell">
|
|
|
+ <div class="expand-product-thumb-wrap">
|
|
|
+ <el-image v-if="line.imageUrl" :src="line.imageUrl" fit="cover" class="expand-product-thumb" />
|
|
|
+ <span v-else class="expand-product-thumb placeholder">无图</span>
|
|
|
+ </div>
|
|
|
+ <span class="expand-product-name">{{ line.productName || '-' }}</span>
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="categoryName" label="分类" min-width="120" show-overflow-tooltip>
|
|
|
+ <template #default="{ row: line }">
|
|
|
+ {{ formatCategoryPathLabel(line.categoryId ?? line.category_id, line.categoryName) }}
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="计量" width="88" align="center">
|
|
|
+ <template #default="{ row: line }">{{ formatMeasureCell(line.measureValue) }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="unitName" label="单位" width="70" align="center" />
|
|
|
+ <el-table-column prop="quantity" label="数量" width="80" align="right" />
|
|
|
+ <el-table-column label="单价(元)" min-width="110" align="right">
|
|
|
+ <template #default="{ row: line }">
|
|
|
+ <span v-if="line.unitPrice == null || line.unitPrice === ''">-</span>
|
|
|
+ <span v-else>¥{{ formatMoney(line.unitPrice) }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="金额(元)" min-width="110" align="right">
|
|
|
+ <template #default="{ row: line }">
|
|
|
+ <span v-if="line.amount == null || line.amount === ''">-</span>
|
|
|
+ <span v-else>¥{{ formatMoney(line.amount) }}</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="status" label="状态" min-width="100" align="center">
|
|
|
+ <template #default="{ row: line }">
|
|
|
+ <el-tag :type="getDeliveryStatusType(line.status)" size="small">{{ getDeliveryStatusText(line.status) }}</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+ </div>
|
|
|
+ <div class="delivery-row-expand-summary sqxp-subtable-summary"></div>
|
|
|
+ </div>
|
|
|
+ <el-empty v-else-if="!expandedRowLoadingMap[row.id]" description="暂无商品明细" :image-size="72" />
|
|
|
+ </div>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="taskNo" label="配送单号" min-width="180">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-button link type="primary" @click="toggleRowExpand(row)">{{ row.taskNo }}</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="orderNo" label="订单编号" min-width="180" />
|
|
|
+ <el-table-column prop="deliverName" label="配送员" min-width="110" />
|
|
|
+ <el-table-column prop="deliverPhone" label="电话" min-width="120" />
|
|
|
+ <el-table-column prop="clientName" label="客户" min-width="140" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="contactPerson" label="联系人" min-width="110" />
|
|
|
+ <el-table-column prop="contactPhone" label="联系电话" min-width="120" />
|
|
|
+ <el-table-column prop="deliveryAddress" label="收货地址" min-width="220" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="deliveryDeadlineAt" label="时效截止" min-width="180">
|
|
|
+ <template #default="{ row }">{{ formatDetailTime(row.deliveryDeadlineAt) || '-' }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="urgencyLevel" label="紧急程度" min-width="100">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-tag :type="getUrgencyType(row.urgencyLevel)" size="small">{{ getUrgencyText(row.urgencyLevel) }}</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="remainingMinutes" label="剩余时间" min-width="100">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <span :class="getUrgencyClass(row.urgencyLevel)">{{ row.remainingMinutes }}分钟</span>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="message" label="预警消息" min-width="200" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="isResolved" label="状态" min-width="80">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-tag :type="row.isResolved ? 'success' : 'danger'" size="small">{{ row.isResolved ? '已解决' : '未解决' }}</el-tag>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column prop="dispatchRemark" label="分配备注" min-width="180" show-overflow-tooltip />
|
|
|
+ <el-table-column prop="createAt" label="预警时间" min-width="180">
|
|
|
+ <template #default="{ row }">{{ formatDetailTime(row.createAt) || '-' }}</template>
|
|
|
+ </el-table-column>
|
|
|
+ <el-table-column label="操作" min-width="200" fixed="right" align="center" header-align="center">
|
|
|
+ <template #default="{ row }">
|
|
|
+ <el-button v-if="!row.isResolved" class="btn-op-item op-warn auto-icon-check" @click="handleResolve(row)"
|
|
|
+ >处理</el-button
|
|
|
+ >
|
|
|
+ <el-button class="btn-op-item primary auto-icon-view" @click="handleView(row)">查看</el-button>
|
|
|
+ </template>
|
|
|
+ </el-table-column>
|
|
|
+ </el-table>
|
|
|
+
|
|
|
+ <div class="pagination list-pager-bar">
|
|
|
+ <el-pagination
|
|
|
+ :current-page="pagination.page"
|
|
|
+ :page-size="pagination.pageSize"
|
|
|
+ :total="pagination.total"
|
|
|
+ :page-sizes="[10, 20, 50]"
|
|
|
+ layout="total, sizes, prev, pager, next"
|
|
|
+ @update:current-page="
|
|
|
+ (p) => {
|
|
|
+ pagination.page = p
|
|
|
+ loadData()
|
|
|
+ }
|
|
|
+ "
|
|
|
+ @update:page-size="
|
|
|
+ (s) => {
|
|
|
+ pagination.pageSize = s
|
|
|
+ pagination.page = 1
|
|
|
+ loadData()
|
|
|
+ }
|
|
|
+ "
|
|
|
+ />
|
|
|
+ </div>
|
|
|
+ </div>
|
|
|
+
|
|
|
+ <el-dialog
|
|
|
+ v-model="resolveVisible"
|
|
|
+ title="处理预警"
|
|
|
+ width="500px"
|
|
|
+ class="order-module-dialog delivery-warning-dialog"
|
|
|
+ modal-class="order-module-dialog-mask"
|
|
|
+ >
|
|
|
+ <div class="dialog-scroll">
|
|
|
+ <el-form :model="resolveForm" label-position="top">
|
|
|
+ <el-form-item label="处理备注">
|
|
|
+ <el-input v-model="resolveForm.note" type="textarea" placeholder="请输入处理备注" :rows="3" />
|
|
|
+ </el-form-item>
|
|
|
+ </el-form>
|
|
|
+ </div>
|
|
|
+ <template #footer>
|
|
|
+ <el-button class="btn-ghost" @click="resolveVisible = false"><el-icon><Close /></el-icon>取消</el-button>
|
|
|
+ <el-button class="btn-main" type="primary" @click="confirmResolve" :loading="submitLoading"
|
|
|
+ ><el-icon><Check /></el-icon>确定</el-button
|
|
|
+ >
|
|
|
</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="taskNo" label="配送单号" min-width="180">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-button link type="primary" @click="toggleRowExpand(row)">{{ row.taskNo }}</el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="orderNo" label="订单编号" min-width="180" />
|
|
|
- <el-table-column prop="deliverName" label="配送员" min-width="110" />
|
|
|
- <el-table-column prop="deliverPhone" label="电话" min-width="120" />
|
|
|
- <el-table-column prop="clientName" label="客户" min-width="140" show-overflow-tooltip />
|
|
|
- <el-table-column prop="contactPerson" label="联系人" min-width="110" />
|
|
|
- <el-table-column prop="contactPhone" label="联系电话" min-width="120" />
|
|
|
- <el-table-column prop="deliveryAddress" label="收货地址" min-width="220" show-overflow-tooltip />
|
|
|
- <el-table-column prop="deliveryDeadlineAt" label="时效截止" min-width="180">
|
|
|
- <template #default="{ row }">{{ formatDetailTime(row.deliveryDeadlineAt) || '-' }}</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="urgencyLevel" label="紧急程度" min-width="100">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-tag :type="getUrgencyType(row.urgencyLevel)" size="small">{{ getUrgencyText(row.urgencyLevel) }}</el-tag>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="remainingMinutes" label="剩余时间" min-width="100">
|
|
|
- <template #default="{ row }">
|
|
|
- <span :class="getUrgencyClass(row.urgencyLevel)">{{ row.remainingMinutes }}分钟</span>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="message" label="预警消息" min-width="200" show-overflow-tooltip />
|
|
|
- <el-table-column prop="isResolved" label="状态" min-width="80">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-tag :type="row.isResolved ? 'success' : 'danger'" size="small">{{ row.isResolved ? '已解决' : '未解决' }}</el-tag>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column prop="dispatchRemark" label="分配备注" min-width="180" show-overflow-tooltip />
|
|
|
- <el-table-column prop="createAt" label="预警时间" min-width="180">
|
|
|
- <template #default="{ row }">{{ formatDetailTime(row.createAt) || '-' }}</template>
|
|
|
- </el-table-column>
|
|
|
- <el-table-column label="操作" min-width="120" fixed="right">
|
|
|
- <template #default="{ row }">
|
|
|
- <el-button v-if="!row.isResolved" type="primary" link @click="handleResolve(row)">处理</el-button>
|
|
|
- <el-button type="primary" link @click="handleView(row)">查看</el-button>
|
|
|
- </template>
|
|
|
- </el-table-column>
|
|
|
- </el-table>
|
|
|
- <div class="pagination">
|
|
|
- <el-pagination
|
|
|
- :current-page="pagination.page"
|
|
|
- :page-size="pagination.pageSize"
|
|
|
- :total="pagination.total"
|
|
|
- :page-sizes="[10, 20, 50]"
|
|
|
- layout="total, sizes, prev, pager, next"
|
|
|
- @update:current-page="
|
|
|
- (p) => {
|
|
|
- pagination.page = p
|
|
|
- loadData()
|
|
|
- }
|
|
|
- "
|
|
|
- @update:page-size="
|
|
|
- (s) => {
|
|
|
- pagination.pageSize = s
|
|
|
- pagination.page = 1
|
|
|
- loadData()
|
|
|
- }
|
|
|
- "
|
|
|
- />
|
|
|
- </div>
|
|
|
- <el-dialog v-model="resolveVisible" title="处理预警" width="500px">
|
|
|
- <el-form :model="resolveForm" label-width="100px">
|
|
|
- <el-form-item label="处理备注">
|
|
|
- <el-input v-model="resolveForm.note" type="textarea" placeholder="请输入处理备注" :rows="3" />
|
|
|
- </el-form-item>
|
|
|
- </el-form>
|
|
|
- <template #footer>
|
|
|
- <el-button @click="resolveVisible = false">取消</el-button>
|
|
|
- <el-button type="primary" @click="confirmResolve" :loading="submitLoading">确定</el-button>
|
|
|
- </template>
|
|
|
- </el-dialog>
|
|
|
+ </el-dialog>
|
|
|
|
|
|
<!-- 预警详情弹窗 -->
|
|
|
- <el-dialog v-model="detailVisible" title="预警详情" width="1000px">
|
|
|
+ <el-dialog
|
|
|
+ v-model="detailVisible"
|
|
|
+ title="预警详情"
|
|
|
+ width="1100px"
|
|
|
+ class="order-module-dialog delivery-warning-dialog"
|
|
|
+ modal-class="order-module-dialog-mask"
|
|
|
+ >
|
|
|
+ <div class="dialog-scroll">
|
|
|
<el-descriptions :column="2" border class="mb-4">
|
|
|
<el-descriptions-item label="配送单号">{{ detailData.taskNo || detailData.deliveryNo }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="订单编号">{{ detailData.orderNo }}</el-descriptions-item>
|
|
|
@@ -297,16 +343,26 @@
|
|
|
</div>
|
|
|
</div>
|
|
|
|
|
|
+ </div>
|
|
|
<template #footer>
|
|
|
- <el-button @click="detailVisible = false">关闭</el-button>
|
|
|
- <el-button v-if="!detailData.isResolved" type="primary" @click="handleResolve(detailData)">处理预警</el-button>
|
|
|
+ <el-button class="btn-ghost" @click="detailVisible = false"><el-icon><Close /></el-icon>关闭</el-button>
|
|
|
+ <el-button
|
|
|
+ v-if="!detailData.isResolved"
|
|
|
+ class="btn-main"
|
|
|
+ type="primary"
|
|
|
+ @click="handleResolve(detailData)"
|
|
|
+ >
|
|
|
+ <el-icon><Check /></el-icon>处理预警
|
|
|
+ </el-button>
|
|
|
</template>
|
|
|
</el-dialog>
|
|
|
+ </section>
|
|
|
</div>
|
|
|
</template>
|
|
|
<script setup lang="ts">
|
|
|
import { ref, reactive, onMounted } from 'vue'
|
|
|
import { ElMessage } from 'element-plus'
|
|
|
+ import { Bell, Check, Close } from '@element-plus/icons-vue'
|
|
|
import { fetchDeliveryWarningList, fetchResolveWarning, fetchDeliveryWarningDetail, fetchDeliveryDetail } from '@/api/business'
|
|
|
import { ensureCategoryPathDataLoaded, formatCategoryPathLabel } from '@/utils/category-path-display'
|
|
|
defineOptions({ name: 'DeliveryWarning' })
|
|
|
@@ -480,15 +536,48 @@
|
|
|
})
|
|
|
</script>
|
|
|
<style lang="scss" scoped>
|
|
|
-.page-container { padding: 20px; }
|
|
|
+.filter-block {
|
|
|
+ padding: 12px 16px 10px;
|
|
|
+ border-bottom: 1px solid #eef4f0;
|
|
|
+ background: #fff;
|
|
|
+}
|
|
|
+
|
|
|
+.filter-form :deep(.el-form-item) {
|
|
|
+ margin-bottom: 0;
|
|
|
+}
|
|
|
+
|
|
|
+.filter-form :deep(.el-form-item__label) {
|
|
|
+ font-size: 13px;
|
|
|
+ font-weight: 500;
|
|
|
+ color: var(--mint-text-muted, #64748b);
|
|
|
+ padding-bottom: 4px;
|
|
|
+ line-height: 1.2;
|
|
|
+}
|
|
|
+
|
|
|
+.filter-grid {
|
|
|
+ display: grid;
|
|
|
+ grid-template-columns: repeat(3, minmax(0, 1fr));
|
|
|
+ gap: 10px 14px;
|
|
|
+}
|
|
|
+
|
|
|
+.filter-actions-row {
|
|
|
+ display: flex;
|
|
|
+ justify-content: flex-end;
|
|
|
+ margin-top: 10px;
|
|
|
+}
|
|
|
+
|
|
|
+.filter-actions-end {
|
|
|
+ display: inline-flex;
|
|
|
+ align-items: center;
|
|
|
+ gap: 8px;
|
|
|
+}
|
|
|
+
|
|
|
.delivery-warning-table :deep(th.el-table__cell > .cell),
|
|
|
.delivery-warning-table :deep(td.el-table__cell > .cell) {
|
|
|
display: flex;
|
|
|
align-items: center;
|
|
|
justify-content: center;
|
|
|
}
|
|
|
-.search-bar { background: #fff; padding: 20px; border-radius: 8px; margin-bottom: 16px; }
|
|
|
-.pagination { display: flex; justify-content: flex-end; margin-top: 20px; }
|
|
|
.text-danger { color: #dc2626; font-weight: 600; }
|
|
|
.text-warning { color: #d97706; font-weight: 600; }
|
|
|
.text-success { color: #059669; }
|