|
@@ -1,52 +1,67 @@
|
|
|
<!-- 配送管理页面 -->
|
|
<!-- 配送管理页面 -->
|
|
|
<template>
|
|
<template>
|
|
|
<div class="page-container">
|
|
<div class="page-container">
|
|
|
- <!-- 搜索栏 -->
|
|
|
|
|
- <div class="search-bar">
|
|
|
|
|
- <el-form :inline="true" :model="searchForm">
|
|
|
|
|
- <el-form-item label="关键词">
|
|
|
|
|
- <el-input v-model="searchForm.keyword" placeholder="配送单号/订单编号" clearable />
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="状态">
|
|
|
|
|
- <el-select v-model="searchForm.status" placeholder="请选择状态" clearable>
|
|
|
|
|
- <el-option label="全部" value="" />
|
|
|
|
|
- <el-option label="待取货" value="pending" />
|
|
|
|
|
- <el-option label="已分配" value="assigned" />
|
|
|
|
|
- <el-option label="供应商备货中" value="supplier_stocking" />
|
|
|
|
|
- <el-option label="备货完成(待取货)" value="supplier_ready" />
|
|
|
|
|
- <el-option label="取货中" value="picking" />
|
|
|
|
|
- <el-option label="配送中" value="delivering" />
|
|
|
|
|
- <el-option label="已完成" value="completed" />
|
|
|
|
|
- <el-option label="已取消" value="cancelled" />
|
|
|
|
|
- </el-select>
|
|
|
|
|
- </el-form-item>
|
|
|
|
|
- <el-form-item label="区域">
|
|
|
|
|
- <el-select
|
|
|
|
|
- v-model="searchForm.regionId"
|
|
|
|
|
- placeholder="请选择区域"
|
|
|
|
|
- clearable
|
|
|
|
|
- @visible-change="(open) => open && loadRegions()"
|
|
|
|
|
- >
|
|
|
|
|
- <el-option label="全部" value="" />
|
|
|
|
|
- <el-option v-for="r in regionList" :key="r.id" :label="r.name" :value="r.id" />
|
|
|
|
|
- </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 class="page-head">
|
|
|
|
|
+ <h1>配送列表</h1>
|
|
|
|
|
+ <p class="page-desc">按区域查看配送任务状态,支持筛选、展开商品明细与详情查看。</p>
|
|
|
</div>
|
|
</div>
|
|
|
-
|
|
|
|
|
- <!-- 数据表格 -->
|
|
|
|
|
- <el-table
|
|
|
|
|
- ref="deliveryListTableRef"
|
|
|
|
|
- class="delivery-list-table"
|
|
|
|
|
- :data="tableData"
|
|
|
|
|
- v-loading="loading"
|
|
|
|
|
- stripe
|
|
|
|
|
- @expand-change="handleDeliveryRowExpand"
|
|
|
|
|
- >
|
|
|
|
|
|
|
+ <section class="panel">
|
|
|
|
|
+ <div class="panel-top">
|
|
|
|
|
+ <h2>
|
|
|
|
|
+ <el-icon class="title-ic"><Setting /></el-icon>
|
|
|
|
|
+ <span>配送任务列表</span>
|
|
|
|
|
+ </h2>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="filter-block">
|
|
|
|
|
+ <el-form :model="searchForm" class="filter-form" label-position="top">
|
|
|
|
|
+ <div class="filter-grid">
|
|
|
|
|
+ <el-form-item label="关键词">
|
|
|
|
|
+ <el-input v-model="searchForm.keyword" placeholder="配送单号/订单编号" clearable />
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="状态">
|
|
|
|
|
+ <el-select v-model="searchForm.status" placeholder="全部" clearable>
|
|
|
|
|
+ <el-option label="全部" value="" />
|
|
|
|
|
+ <el-option label="待取货" value="pending" />
|
|
|
|
|
+ <el-option label="已分配" value="assigned" />
|
|
|
|
|
+ <el-option label="供应商备货中" value="supplier_stocking" />
|
|
|
|
|
+ <el-option label="备货完成(待取货)" value="supplier_ready" />
|
|
|
|
|
+ <el-option label="取货中" value="picking" />
|
|
|
|
|
+ <el-option label="配送中" value="delivering" />
|
|
|
|
|
+ <el-option label="已完成" value="completed" />
|
|
|
|
|
+ <el-option label="已取消" value="cancelled" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ <el-form-item label="区域">
|
|
|
|
|
+ <el-select
|
|
|
|
|
+ v-model="searchForm.regionId"
|
|
|
|
|
+ placeholder="全部"
|
|
|
|
|
+ clearable
|
|
|
|
|
+ @visible-change="(open) => open && loadRegions()"
|
|
|
|
|
+ >
|
|
|
|
|
+ <el-option label="全部" value="" />
|
|
|
|
|
+ <el-option v-for="r in regionList" :key="r.id" :label="r.name" :value="r.id" />
|
|
|
|
|
+ </el-select>
|
|
|
|
|
+ </el-form-item>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="filter-actions-row">
|
|
|
|
|
+ <div class="filter-actions-end">
|
|
|
|
|
+ <el-button class="btn-ghost" @click="handleReset">重置</el-button>
|
|
|
|
|
+ <el-button class="btn-main" type="primary" @click="handleSearch">搜索</el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </el-form>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="list-body list-wrap">
|
|
|
|
|
+ <el-table
|
|
|
|
|
+ ref="deliveryListTableRef"
|
|
|
|
|
+ class="delivery-list-table list-table"
|
|
|
|
|
+ :data="tableData"
|
|
|
|
|
+ v-loading="loading"
|
|
|
|
|
+ stripe
|
|
|
|
|
+ @expand-change="handleDeliveryRowExpand"
|
|
|
|
|
+ >
|
|
|
<el-table-column type="expand" width="48">
|
|
<el-table-column type="expand" width="48">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
<div class="delivery-row-expand-wrap" v-loading="!!expandedRowLoadingMap[row.id]">
|
|
<div class="delivery-row-expand-wrap" v-loading="!!expandedRowLoadingMap[row.id]">
|
|
@@ -111,9 +126,7 @@
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
</el-table>
|
|
</el-table>
|
|
|
</div>
|
|
</div>
|
|
|
- <div class="delivery-row-expand-summary sqxp-subtable-summary">
|
|
|
|
|
- <span>商品行数:{{ getExpandedItems(row.id).length }}</span>
|
|
|
|
|
- </div>
|
|
|
|
|
|
|
+ <div class="delivery-row-expand-summary sqxp-subtable-summary"></div>
|
|
|
</div>
|
|
</div>
|
|
|
<el-empty v-else-if="!expandedRowLoadingMap[row.id]" description="暂无商品明细" :image-size="72" />
|
|
<el-empty v-else-if="!expandedRowLoadingMap[row.id]" description="暂无商品明细" :image-size="72" />
|
|
|
</div>
|
|
</div>
|
|
@@ -157,9 +170,6 @@
|
|
|
<span v-else>¥{{ formatMoney(row.totalAmount) }}</span>
|
|
<span v-else>¥{{ formatMoney(row.totalAmount) }}</span>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column prop="itemCount" label="商品行数" min-width="90" align="center">
|
|
|
|
|
- <template #default="{ row }">{{ row.itemCount ?? '-' }}</template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
<el-table-column prop="expireTime" label="时效截止" min-width="180">
|
|
<el-table-column prop="expireTime" label="时效截止" min-width="180">
|
|
|
<template #default="{ row }">{{ formatDetailTime(row.expireTime) || '-' }}</template>
|
|
<template #default="{ row }">{{ formatDetailTime(row.expireTime) || '-' }}</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
@@ -175,41 +185,72 @@
|
|
|
<el-table-column prop="createAt" label="创建时间" min-width="180">
|
|
<el-table-column prop="createAt" label="创建时间" min-width="180">
|
|
|
<template #default="{ row }">{{ formatDetailTime(row.createAt) || '-' }}</template>
|
|
<template #default="{ row }">{{ formatDetailTime(row.createAt) || '-' }}</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column label="操作" min-width="120" fixed="right">
|
|
|
|
|
|
|
+ <el-table-column label="操作" min-width="160" fixed="right" align="center" header-align="center">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
- <el-button type="primary" link @click="handleView(row)">查看</el-button>
|
|
|
|
|
|
|
+ <el-button class="btn-op-item primary" @click="handleView(row)">查看</el-button>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</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, 100]"
|
|
|
|
|
- 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-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, 100]"
|
|
|
|
|
+ layout="total, sizes, prev, pager, next, jumper"
|
|
|
|
|
+ @update:current-page="
|
|
|
|
|
+ (p) => {
|
|
|
|
|
+ pagination.page = p
|
|
|
|
|
+ loadData()
|
|
|
|
|
+ }
|
|
|
|
|
+ "
|
|
|
|
|
+ @update:page-size="
|
|
|
|
|
+ (s) => {
|
|
|
|
|
+ pagination.pageSize = s
|
|
|
|
|
+ pagination.page = 1
|
|
|
|
|
+ loadData()
|
|
|
|
|
+ }
|
|
|
|
|
+ "
|
|
|
|
|
+ />
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </section>
|
|
|
|
|
|
|
|
<!-- 查看详情弹窗 -->
|
|
<!-- 查看详情弹窗 -->
|
|
|
- <el-dialog v-model="viewVisible" title="配送详情" width="1100px" destroy-on-close @closed="onViewDialogClosed">
|
|
|
|
|
|
|
+ <el-dialog
|
|
|
|
|
+ v-model="viewVisible"
|
|
|
|
|
+ title="配送详情"
|
|
|
|
|
+ width="1100px"
|
|
|
|
|
+ destroy-on-close
|
|
|
|
|
+ class="order-module-dialog delivery-detail-dialog"
|
|
|
|
|
+ modal-class="order-module-dialog-mask"
|
|
|
|
|
+ @closed="onViewDialogClosed"
|
|
|
|
|
+ >
|
|
|
|
|
+ <div class="dialog-scroll delivery-detail-dialog-scroll">
|
|
|
|
|
+ <div class="view-hero delivery-view-hero">
|
|
|
|
|
+ <div class="delivery-view-hero-icon">
|
|
|
|
|
+ <el-icon><Setting /></el-icon>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="view-hero-main">
|
|
|
|
|
+ <h2>{{ viewData.taskNo || '-' }}</h2>
|
|
|
|
|
+ <div class="view-hero-tags">
|
|
|
|
|
+ <el-tag :type="getStatusType(viewData.status)" size="small">{{ getStatusText(viewData.status) }}</el-tag>
|
|
|
|
|
+ <el-tag type="primary" size="small">订单 {{ viewData.orderNo || '-' }}</el-tag>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <p class="view-hero-meta">
|
|
|
|
|
+ 配送员:{{ viewData.deliverName || '-' }}
|
|
|
|
|
+ <span class="dot">·</span>
|
|
|
|
|
+ 区域:{{ viewData.regionName || '-' }}
|
|
|
|
|
+ <span class="dot">·</span>
|
|
|
|
|
+ 时效截止:{{ formatDetailTime(viewData.expireTime) || '-' }}
|
|
|
|
|
+ </p>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
<el-tabs v-model="viewDetailTab" class="delivery-detail-tabs">
|
|
<el-tabs v-model="viewDetailTab" class="delivery-detail-tabs">
|
|
|
<el-tab-pane label="配送信息" name="detail">
|
|
<el-tab-pane label="配送信息" name="detail">
|
|
|
|
|
+ <div class="view-section">
|
|
|
<el-descriptions :column="2" border class="mb-4">
|
|
<el-descriptions :column="2" border class="mb-4">
|
|
|
<el-descriptions-item label="配送单号">{{ viewData.taskNo }}</el-descriptions-item>
|
|
<el-descriptions-item label="配送单号">{{ viewData.taskNo }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="订单编号">{{ viewData.orderNo }}</el-descriptions-item>
|
|
<el-descriptions-item label="订单编号">{{ viewData.orderNo }}</el-descriptions-item>
|
|
@@ -223,7 +264,9 @@
|
|
|
{{ viewData.dispatchRemark }}
|
|
{{ viewData.dispatchRemark }}
|
|
|
</el-descriptions-item>
|
|
</el-descriptions-item>
|
|
|
</el-descriptions>
|
|
</el-descriptions>
|
|
|
|
|
+ </div>
|
|
|
|
|
|
|
|
|
|
+ <div class="view-section">
|
|
|
<div class="address-blocks">
|
|
<div class="address-blocks">
|
|
|
<el-card shadow="never" class="address-card address-card--supplier">
|
|
<el-card shadow="never" class="address-card address-card--supplier">
|
|
|
<template #header>
|
|
<template #header>
|
|
@@ -307,7 +350,9 @@
|
|
|
</div>
|
|
</div>
|
|
|
</el-card>
|
|
</el-card>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
+ </div>
|
|
|
|
|
|
|
|
|
|
+ <div class="view-section">
|
|
|
<h4 class="section-title">配送明细</h4>
|
|
<h4 class="section-title">配送明细</h4>
|
|
|
<p class="detail-hint">提示:双击商品行可查看商品详情(与订单明细一致)。</p>
|
|
<p class="detail-hint">提示:双击商品行可查看商品详情(与订单明细一致)。</p>
|
|
|
<el-table
|
|
<el-table
|
|
@@ -349,6 +394,20 @@
|
|
|
<template #default="{ row }">{{ formatMeasureCell(row.measureValue) }}</template>
|
|
<template #default="{ row }">{{ formatMeasureCell(row.measureValue) }}</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
<el-table-column prop="unitName" label="单位" min-width="72" align="center" />
|
|
<el-table-column prop="unitName" label="单位" min-width="72" align="center" />
|
|
|
|
|
+ <el-table-column prop="supplierUnitPrice" label="供货单价(元)" min-width="110" align="center">
|
|
|
|
|
+ <template #default="{ row }">
|
|
|
|
|
+ {{
|
|
|
|
|
+ row.supplierUnitPrice != null && row.supplierUnitPrice !== ''
|
|
|
|
|
+ ? `¥${formatMoney(row.supplierUnitPrice)}`
|
|
|
|
|
+ : '-'
|
|
|
|
|
+ }}
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
|
|
+ <el-table-column prop="supplierAmount" label="供货金额(元)" min-width="110" align="center">
|
|
|
|
|
+ <template #default="{ row }">
|
|
|
|
|
+ {{ row.supplierAmount != null && row.supplierAmount !== '' ? `¥${formatMoney(row.supplierAmount)}` : '-' }}
|
|
|
|
|
+ </template>
|
|
|
|
|
+ </el-table-column>
|
|
|
<el-table-column prop="unitPrice" label="单价(元)" min-width="100" align="center">
|
|
<el-table-column prop="unitPrice" label="单价(元)" min-width="100" align="center">
|
|
|
<template #default="{ row }">
|
|
<template #default="{ row }">
|
|
|
{{ row.unitPrice != null && row.unitPrice !== '' ? `¥${formatMoney(row.unitPrice)}` : '-' }}
|
|
{{ row.unitPrice != null && row.unitPrice !== '' ? `¥${formatMoney(row.unitPrice)}` : '-' }}
|
|
@@ -366,9 +425,11 @@
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
</el-table>
|
|
</el-table>
|
|
|
|
|
+ </div>
|
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
|
|
|
|
|
|
<el-tab-pane label="配送轨迹" name="timeline">
|
|
<el-tab-pane label="配送轨迹" name="timeline">
|
|
|
|
|
+ <div class="view-section">
|
|
|
<div v-if="viewData.timeline && viewData.timeline.length > 0" class="timeline">
|
|
<div v-if="viewData.timeline && viewData.timeline.length > 0" class="timeline">
|
|
|
<el-timeline>
|
|
<el-timeline>
|
|
|
<el-timeline-item
|
|
<el-timeline-item
|
|
@@ -386,8 +447,10 @@
|
|
|
</el-timeline>
|
|
</el-timeline>
|
|
|
</div>
|
|
</div>
|
|
|
<el-empty v-else description="暂无配送轨迹" />
|
|
<el-empty v-else description="暂无配送轨迹" />
|
|
|
|
|
+ </div>
|
|
|
</el-tab-pane>
|
|
</el-tab-pane>
|
|
|
</el-tabs>
|
|
</el-tabs>
|
|
|
|
|
+ </div>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
|
|
|
|
|
<ProductViewDialog v-model="productViewDialogVisible" :product-id="productViewTargetId" />
|
|
<ProductViewDialog v-model="productViewDialogVisible" :product-id="productViewTargetId" />
|
|
@@ -397,6 +460,7 @@
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
import { ref, reactive, onMounted, computed } from 'vue'
|
|
import { ref, reactive, onMounted, computed } from 'vue'
|
|
|
import { ElMessage } from 'element-plus'
|
|
import { ElMessage } from 'element-plus'
|
|
|
|
|
+ import { Setting } from '@element-plus/icons-vue'
|
|
|
import { fetchDeliveryList, fetchDeliveryDetail } from '@/api/business'
|
|
import { fetchDeliveryList, fetchDeliveryDetail } from '@/api/business'
|
|
|
import { fetchActiveRegions } from '@/api/admin'
|
|
import { fetchActiveRegions } from '@/api/admin'
|
|
|
import ProductViewDialog from '@/components/business/product-view-dialog/index.vue'
|
|
import ProductViewDialog from '@/components/business/product-view-dialog/index.vue'
|
|
@@ -721,7 +785,9 @@
|
|
|
|
|
|
|
|
<style lang="scss" scoped>
|
|
<style lang="scss" scoped>
|
|
|
.page-container {
|
|
.page-container {
|
|
|
- padding: 20px;
|
|
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ gap: 16px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.delivery-list-table :deep(th.el-table__cell > .cell),
|
|
.delivery-list-table :deep(th.el-table__cell > .cell),
|
|
@@ -731,6 +797,51 @@
|
|
|
justify-content: center;
|
|
justify-content: center;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/* 展开列单元格兜底:避免出现意外的“..”文本占位 */
|
|
|
|
|
+.delivery-list-table :deep(td.el-table__cell.el-table__expand-column > .cell) {
|
|
|
|
|
+ font-size: 0;
|
|
|
|
|
+ line-height: 0;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* 展开按钮:对齐商家结算管理-待结算订单树形样式 */
|
|
|
|
|
+.delivery-list-table :deep(.el-table__expand-icon) {
|
|
|
|
|
+ width: 28px;
|
|
|
|
|
+ height: 28px;
|
|
|
|
|
+ border-radius: 6px;
|
|
|
|
|
+ border: 1px solid var(--mint-border, #d9e8e2);
|
|
|
|
|
+ display: inline-flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ transition: background 0.15s ease, border-color 0.15s ease, transform 0.15s ease;
|
|
|
|
|
+ color: var(--mint-text-muted, #64748b);
|
|
|
|
|
+ background: var(--mint-surface, #fff);
|
|
|
|
|
+ font-size: 0;
|
|
|
|
|
+ line-height: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-list-table :deep(.el-table__expand-icon:hover) {
|
|
|
|
|
+ background: var(--mint-primary-bg, #ecfdf5);
|
|
|
|
|
+ border-color: #10b981;
|
|
|
|
|
+ color: var(--mint-primary-dark, #059669);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-list-table :deep(.el-table__expand-icon--expanded) {
|
|
|
|
|
+ background: var(--mint-primary-bg, #ecfdf5);
|
|
|
|
|
+ border-color: #10b981;
|
|
|
|
|
+ color: var(--mint-primary-dark, #059669);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-list-table :deep(.el-table__expand-icon svg) {
|
|
|
|
|
+ width: 14px;
|
|
|
|
|
+ height: 14px;
|
|
|
|
|
+ transition: transform 0.15s ease;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-list-table :deep(.el-table__expand-icon--expanded svg) {
|
|
|
|
|
+ transform: rotate(180deg);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/* 展开行内容左对齐(不影响其它列居中策略) */
|
|
/* 展开行内容左对齐(不影响其它列居中策略) */
|
|
|
.delivery-list-table :deep(td.el-table__expanded-cell) {
|
|
.delivery-list-table :deep(td.el-table__expanded-cell) {
|
|
|
/* Element Plus 默认会给 expanded-cell 加 padding,配合我们全局居中样式会出现“整体偏右/居中”的观感 */
|
|
/* Element Plus 默认会给 expanded-cell 加 padding,配合我们全局居中样式会出现“整体偏右/居中”的观感 */
|
|
@@ -744,53 +855,97 @@
|
|
|
text-align: left !important;
|
|
text-align: left !important;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.search-bar {
|
|
|
|
|
|
|
+.filter-block {
|
|
|
|
|
+ padding: 12px 16px 10px;
|
|
|
|
|
+ border-bottom: 1px solid #eef4f0;
|
|
|
background: #fff;
|
|
background: #fff;
|
|
|
- padding: 20px;
|
|
|
|
|
- border-radius: 8px;
|
|
|
|
|
- margin-bottom: 16px;
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.pagination {
|
|
|
|
|
|
|
+.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;
|
|
display: flex;
|
|
|
justify-content: flex-end;
|
|
justify-content: flex-end;
|
|
|
- margin-top: 20px;
|
|
|
|
|
|
|
+ margin-top: 10px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.delivery-row-expand-wrap {
|
|
|
|
|
- /* 左侧预留 expand 箭头列(48px),让子表从“配送单号”列下方开始 */
|
|
|
|
|
- padding: 8px 12px 8px calc(12px + 48px);
|
|
|
|
|
- background: #fafbfc;
|
|
|
|
|
- border-radius: 8px;
|
|
|
|
|
- width: 100%;
|
|
|
|
|
|
|
+.filter-actions-end {
|
|
|
|
|
+ display: inline-flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 8px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.delivery-row-expand-table {
|
|
|
|
|
- width: max-content;
|
|
|
|
|
- max-width: 100%;
|
|
|
|
|
|
|
+.pagination {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: flex-end;
|
|
|
|
|
+ margin-top: 0;
|
|
|
|
|
+ padding: 10px 16px 12px;
|
|
|
|
|
+ border-top: 1px solid var(--mint-border, #d9e8e2);
|
|
|
|
|
+ background: #fff;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.delivery-row-expand-table-wrap {
|
|
.delivery-row-expand-table-wrap {
|
|
|
- display: inline-block;
|
|
|
|
|
- width: fit-content;
|
|
|
|
|
|
|
+ display: block;
|
|
|
|
|
+ width: 100%;
|
|
|
max-width: 100%;
|
|
max-width: 100%;
|
|
|
- overflow-x: auto;
|
|
|
|
|
- overflow-y: hidden;
|
|
|
|
|
- border-radius: 8px;
|
|
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ border-radius: 0;
|
|
|
text-align: left;
|
|
text-align: left;
|
|
|
|
|
+ position: relative;
|
|
|
|
|
+ background: #f8fafc;
|
|
|
|
|
+ padding: 12px 300px 14px 16px;
|
|
|
|
|
+}
|
|
|
|
|
|
|
|
- /* 让横向滚动条在容器上出现,而不是把表格撑满整行 */
|
|
|
|
|
- :deep(.el-table__inner-wrapper),
|
|
|
|
|
- :deep(.el-table__header-wrapper),
|
|
|
|
|
- :deep(.el-table__body-wrapper) {
|
|
|
|
|
- width: max-content;
|
|
|
|
|
- }
|
|
|
|
|
|
|
+.delivery-row-expand-table-wrap::before {
|
|
|
|
|
+ content: '';
|
|
|
|
|
+ position: absolute;
|
|
|
|
|
+ left: 0;
|
|
|
|
|
+ top: 0;
|
|
|
|
|
+ bottom: 0;
|
|
|
|
|
+ width: 3px;
|
|
|
|
|
+ background: #10b981;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.delivery-row-expand-block {
|
|
|
|
|
- display: inline-block;
|
|
|
|
|
- width: fit-content;
|
|
|
|
|
|
|
+.delivery-row-expand-wrap {
|
|
|
|
|
+ padding: 0;
|
|
|
|
|
+ background: #f8fafc;
|
|
|
|
|
+ border-radius: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-row-expand-table {
|
|
|
|
|
+ width: 100%;
|
|
|
max-width: 100%;
|
|
max-width: 100%;
|
|
|
|
|
+ border: 1px solid var(--mint-border, #d9e8e2);
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-row-expand-table :deep(th.el-table__cell) {
|
|
|
|
|
+ background: #e2e8f0 !important;
|
|
|
|
|
+ color: var(--mint-text-muted, #64748b);
|
|
|
|
|
+ font-size: 11px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-row-expand-table :deep(.el-table__cell) {
|
|
|
|
|
+ padding: 8px 10px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.delivery-row-expand-summary {
|
|
.delivery-row-expand-summary {
|
|
@@ -845,8 +1000,81 @@
|
|
|
margin-bottom: 20px;
|
|
margin-bottom: 20px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+.delivery-view-hero {
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ border-bottom: 1px solid #d9e8e2;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-view-hero-icon {
|
|
|
|
|
+ width: 72px;
|
|
|
|
|
+ height: 72px;
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ border: 1px solid rgba(16, 185, 129, 0.2);
|
|
|
|
|
+ background: rgba(16, 185, 129, 0.08);
|
|
|
|
|
+ color: #059669;
|
|
|
|
|
+ display: inline-flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ font-size: 28px;
|
|
|
|
|
+ flex: 0 0 auto;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-detail-dialog-scroll .view-hero {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ gap: 16px;
|
|
|
|
|
+ padding: 20px 22px;
|
|
|
|
|
+ background: linear-gradient(135deg, #ecfdf5 0%, #ffffff 55%);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-detail-dialog-scroll .view-hero-main h2 {
|
|
|
|
|
+ margin: 0 0 8px;
|
|
|
|
|
+ font-size: 18px;
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ color: #1e293b;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-detail-dialog-scroll .view-hero-tags {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 8px;
|
|
|
|
|
+ margin-bottom: 8px;
|
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-detail-dialog-scroll .view-hero-meta {
|
|
|
|
|
+ margin: 0;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ color: #64748b;
|
|
|
|
|
+ line-height: 1.5;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-detail-dialog-scroll .view-hero-meta .dot {
|
|
|
|
|
+ margin: 0 6px;
|
|
|
|
|
+ opacity: 0.7;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
.delivery-detail-tabs :deep(.el-tabs__content) {
|
|
.delivery-detail-tabs :deep(.el-tabs__content) {
|
|
|
- padding-top: 8px;
|
|
|
|
|
|
|
+ padding-top: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-detail-tabs :deep(.el-tabs__header) {
|
|
|
|
|
+ margin: 0;
|
|
|
|
|
+ padding: 0 22px;
|
|
|
|
|
+ border-bottom: 1px solid #d9e8e2;
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.delivery-detail-tabs :deep(.el-tabs__nav-wrap::after) {
|
|
|
|
|
+ background-color: transparent;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.view-section {
|
|
|
|
|
+ padding: 18px 22px;
|
|
|
|
|
+ border-bottom: 1px solid #d9e8e2;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.view-section:last-child {
|
|
|
|
|
+ border-bottom: 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
.section-title {
|
|
.section-title {
|
|
@@ -1020,3 +1248,48 @@
|
|
|
}
|
|
}
|
|
|
}
|
|
}
|
|
|
</style>
|
|
</style>
|
|
|
|
|
+
|
|
|
|
|
+<style lang="scss">
|
|
|
|
|
+ .order-module-dialog.el-dialog {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ max-height: calc(100vh - 64px);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .order-module-dialog .el-dialog__header {
|
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
|
+ background: linear-gradient(135deg, #ecfdf5 0%, #ffffff 70%);
|
|
|
|
|
+ border-bottom: 1px solid var(--mint-border, #d9e8e2);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .order-module-dialog .el-dialog__body {
|
|
|
|
|
+ flex: 1 1 auto;
|
|
|
|
|
+ min-height: 0;
|
|
|
|
|
+ padding: 0 !important;
|
|
|
|
|
+ overflow: hidden;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .order-module-dialog .dialog-scroll {
|
|
|
|
|
+ height: min(720px, calc(100vh - 180px));
|
|
|
|
|
+ max-height: min(720px, calc(100vh - 180px));
|
|
|
|
|
+ overflow-y: auto;
|
|
|
|
|
+ overflow-x: hidden;
|
|
|
|
|
+ padding: 0;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .order-module-dialog .el-dialog__footer {
|
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
|
+ background: #f8fafc;
|
|
|
|
|
+ border-top: 1px solid var(--mint-border, #d9e8e2);
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .order-module-dialog .el-dialog__footer .el-button {
|
|
|
|
|
+ height: 36px;
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .order-module-dialog-mask {
|
|
|
|
|
+ backdrop-filter: none !important;
|
|
|
|
|
+ }
|
|
|
|
|
+</style>
|