|
@@ -1,5 +1,5 @@
|
|
|
<template>
|
|
<template>
|
|
|
- <div class="p-2">
|
|
|
|
|
|
|
+ <div class="order-page">
|
|
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter"
|
|
<transition :enter-active-class="proxy?.animate.searchAnimate.enter"
|
|
|
:leave-active-class="proxy?.animate.searchAnimate.leave">
|
|
:leave-active-class="proxy?.animate.searchAnimate.leave">
|
|
|
<div v-show="showSearch" class="search">
|
|
<div v-show="showSearch" class="search">
|
|
@@ -15,8 +15,8 @@
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
|
|
|
|
|
<el-form-item>
|
|
<el-form-item>
|
|
|
- <el-button type="primary" icon="Search" @click="handleQuery">搜索</el-button>
|
|
|
|
|
- <el-button icon="Refresh" @click="resetQuery">重置</el-button>
|
|
|
|
|
|
|
+ <el-button type="primary" @click="handleQuery">搜索</el-button>
|
|
|
|
|
+ <el-button @click="resetQuery">重置</el-button>
|
|
|
</el-form-item>
|
|
</el-form-item>
|
|
|
</el-form>
|
|
</el-form>
|
|
|
</div>
|
|
</div>
|
|
@@ -36,18 +36,13 @@
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
- <el-table v-loading="loading" :data="orderList" border>
|
|
|
|
|
|
|
+ <el-table v-loading="loading" :data="orderList" :row-class-name="urgentRowClassName">
|
|
|
<el-table-column label="订单单号" align="center" prop="code" />
|
|
<el-table-column label="订单单号" align="center" prop="code" />
|
|
|
<el-table-column label="单据编号" align="center" prop="docCode">
|
|
<el-table-column label="单据编号" align="center" prop="docCode">
|
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
|
<span>{{ scope.row.docCode || '-' }}</span>
|
|
<span>{{ scope.row.docCode || '-' }}</span>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column label="ERP 单号" align="center" prop="erpDocCode">
|
|
|
|
|
- <template #default="scope">
|
|
|
|
|
- <span>{{ scope.row.erpDocCode || '-' }}</span>
|
|
|
|
|
- </template>
|
|
|
|
|
- </el-table-column>
|
|
|
|
|
<el-table-column label="下单人" align="center" prop="placerName" />
|
|
<el-table-column label="下单人" align="center" prop="placerName" />
|
|
|
<el-table-column label="下单时间" align="center" prop="placeTime" width="180">
|
|
<el-table-column label="下单时间" align="center" prop="placeTime" width="180">
|
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
@@ -55,12 +50,13 @@
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
<el-table-column label="总支数" align="center" prop="totalCount" />
|
|
<el-table-column label="总支数" align="center" prop="totalCount" />
|
|
|
- <el-table-column label="订单状态" align="center" prop="status">
|
|
|
|
|
|
|
+ <el-table-column label="订单状态" align="center" prop="status" min-width="110">
|
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
|
- <el-tag :color="orderStatusJson[scope.row.status]?.color"
|
|
|
|
|
- style="color: #fff; border: none; font-weight: bold;">
|
|
|
|
|
|
|
+ <span class="status-pill" :style="statusPillStyle(scope.row.status)">
|
|
|
|
|
+ <span class="status-pill__dot"
|
|
|
|
|
+ :style="{ background: orderStatusJson[scope.row.status]?.color || '#909399' }"></span>
|
|
|
{{ orderStatusJson[scope.row.status]?.text || '待确认' }}
|
|
{{ orderStatusJson[scope.row.status]?.text || '待确认' }}
|
|
|
- </el-tag>
|
|
|
|
|
|
|
+ </span>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
|
|
<el-table-column label="创建时间" align="center" prop="createTime" width="180">
|
|
@@ -68,11 +64,11 @@
|
|
|
<span>{{ parseTime(scope.row.createTime) }}</span>
|
|
<span>{{ parseTime(scope.row.createTime) }}</span>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
|
- <el-table-column label="操作" align="center" width="160" class-name="small-padding fixed-width">
|
|
|
|
|
|
|
+ <el-table-column label="操作" align="center" width="130" class-name="small-padding fixed-width">
|
|
|
<template #default="scope">
|
|
<template #default="scope">
|
|
|
<el-button v-if="scope.row.urgentFlag !== 1 && checkPermi(['order:order:urgent'])" link type="danger"
|
|
<el-button v-if="scope.row.urgentFlag !== 1 && checkPermi(['order:order:urgent'])" link type="danger"
|
|
|
- icon="Warning" @click="handleUrgent(scope.row)">加急</el-button>
|
|
|
|
|
- <el-button v-hasPermi="['order:order:query']" link type="warning" icon="View"
|
|
|
|
|
|
|
+ @click="handleUrgent(scope.row)">加急</el-button>
|
|
|
|
|
+ <el-button v-hasPermi="['order:order:query']" link type="warning"
|
|
|
@click="handleViewOrder(scope.row)">查看</el-button>
|
|
@click="handleViewOrder(scope.row)">查看</el-button>
|
|
|
</template>
|
|
</template>
|
|
|
</el-table-column>
|
|
</el-table-column>
|
|
@@ -83,52 +79,121 @@
|
|
|
</el-card>
|
|
</el-card>
|
|
|
|
|
|
|
|
<!-- 订单详情对话框 -->
|
|
<!-- 订单详情对话框 -->
|
|
|
- <el-dialog title="订单详情" v-model="detailOpen" width="800px" append-to-body>
|
|
|
|
|
|
|
+ <el-dialog v-model="detailOpen" width="820px" append-to-body class="order-detail-dialog">
|
|
|
|
|
+ <template #header>
|
|
|
|
|
+ <div class="detail-dialog-header">
|
|
|
|
|
+ <span class="detail-dialog-title">订单详情</span>
|
|
|
|
|
+ <span v-if="detailOrder" class="detail-code-badge">#{{ detailOrder.code }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </template>
|
|
|
|
|
+
|
|
|
<template v-if="detailOrder">
|
|
<template v-if="detailOrder">
|
|
|
- <div class="section-title">订单信息</div>
|
|
|
|
|
- <el-descriptions :column="2" border size="small">
|
|
|
|
|
- <el-descriptions-item label="订单单号" :span="2">{{ detailOrder.code }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="单据编号" :span="2">{{ detailOrder.docCode || '-' }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="下单人">{{ detailOrder.placerName }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="订单状态">
|
|
|
|
|
- <el-tag :color="orderStatusJson[detailOrder.status]?.color"
|
|
|
|
|
- style="color: #fff; border: none; font-weight: bold;">
|
|
|
|
|
- {{ orderStatusJson[detailOrder.status]?.text || '待确认' }}
|
|
|
|
|
- </el-tag>
|
|
|
|
|
- <el-tag v-if="detailOrder.urgentFlag === 1" type="danger" effect="dark"
|
|
|
|
|
- style="margin-left: 8px; font-weight: bold;">
|
|
|
|
|
- 🔥 加急
|
|
|
|
|
- </el-tag>
|
|
|
|
|
- </el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="下单时间">{{ parseTime(detailOrder.placeTime) }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="创建时间">{{ parseTime(detailOrder.createTime) }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="总支数">{{ detailOrder.totalCount }}</el-descriptions-item>
|
|
|
|
|
- </el-descriptions>
|
|
|
|
|
-
|
|
|
|
|
- <div class="section-title" style="margin-top: 20px">订单明细</div>
|
|
|
|
|
- <div class="detail-scroll" v-if="detailOrder.details && detailOrder.details.length > 0">
|
|
|
|
|
- <div class="detail-card" v-for="(detail, dIdx) in detailOrder.details" :key="dIdx">
|
|
|
|
|
- <div class="detail-card-head">规格清单 #{{ dIdx + 1 }}</div>
|
|
|
|
|
- <el-descriptions :column="2" border size="small">
|
|
|
|
|
- <el-descriptions-item label="产品型号" :span="2">{{ detail.modelNum || '未知型号' }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="型号名称" :span="2">{{ detail.modelName || '铝型材主料' }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="单据编号">{{ detail.docCode || '-' }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="项目号">{{ detail.itemNo || '-' }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="型材材质">{{ detail.material || '6063-T5' }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="需求支数">
|
|
|
|
|
- <span class="count-red">{{ detail.count || 0 }} 支</span>
|
|
|
|
|
- </el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="表面处理">{{ detail.surfaceName || '无' }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="包装方式">{{ detail.packName || '普通包装' }}</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="订单长度">{{ formatNum(detail.length) }} mm</el-descriptions-item>
|
|
|
|
|
- <el-descriptions-item label="型材壁厚">{{ formatNum(detail.wallThickness, '1.2') }} mm</el-descriptions-item>
|
|
|
|
|
- </el-descriptions>
|
|
|
|
|
- <div class="detail-remark" v-if="detail.remark">
|
|
|
|
|
- <span class="remark-label">备注:</span>{{ detail.remark }}
|
|
|
|
|
|
|
+ <div v-if="detailOrder.urgentFlag === 1" class="urgent-banner">
|
|
|
|
|
+ <span class="urgent-banner__icon">🔥</span>
|
|
|
|
|
+ <span class="urgent-banner__text">此订单已标记为加急,请优先处理</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
|
|
+ <div class="detail-info-card" :class="{ 'is-urgent': detailOrder.urgentFlag === 1 }">
|
|
|
|
|
+ <div class="detail-card-title">
|
|
|
|
|
+ <span class="detail-card-title__icon">📋</span>
|
|
|
|
|
+ <span>基本信息</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="detail-info-grid">
|
|
|
|
|
+ <div class="info-item">
|
|
|
|
|
+ <span class="info-label">订单单号</span>
|
|
|
|
|
+ <span class="info-value">{{ detailOrder.code }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="info-item">
|
|
|
|
|
+ <span class="info-label">单据编号</span>
|
|
|
|
|
+ <span class="info-value">{{ detailOrder.docCode || '-' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="info-item">
|
|
|
|
|
+ <span class="info-label">下单人</span>
|
|
|
|
|
+ <span class="info-value">{{ detailOrder.placerName }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="info-item">
|
|
|
|
|
+ <span class="info-label">订单状态</span>
|
|
|
|
|
+ <span class="info-value">
|
|
|
|
|
+ <span class="status-pill" :style="statusPillStyle(detailOrder.status)">
|
|
|
|
|
+ <span class="status-pill__dot"
|
|
|
|
|
+ :style="{ background: orderStatusJson[detailOrder.status]?.color || '#909399' }"></span>
|
|
|
|
|
+ {{ orderStatusJson[detailOrder.status]?.text || '待确认' }}
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="info-item">
|
|
|
|
|
+ <span class="info-label">总支数</span>
|
|
|
|
|
+ <span class="info-value info-value--highlight">{{ detailOrder.totalCount }} 支</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="info-item">
|
|
|
|
|
+ <span class="info-label">下单时间</span>
|
|
|
|
|
+ <span class="info-value">{{ parseTime(detailOrder.placeTime) }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="info-item">
|
|
|
|
|
+ <span class="info-label">创建时间</span>
|
|
|
|
|
+ <span class="info-value">{{ parseTime(detailOrder.createTime) }}</span>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
</div>
|
|
</div>
|
|
|
- <el-empty v-else description="暂无明细" :image-size="60" />
|
|
|
|
|
|
|
+
|
|
|
|
|
+ <div class="detail-info-card">
|
|
|
|
|
+ <div class="detail-card-title">
|
|
|
|
|
+ <span class="detail-card-title__icon">📦</span>
|
|
|
|
|
+ <span>订单明细</span>
|
|
|
|
|
+ <span class="detail-card-title__count">{{ detailOrder.details?.length || 0 }} 项</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="detail-scroll" v-if="detailOrder.details && detailOrder.details.length > 0">
|
|
|
|
|
+ <div class="detail-spec-card" v-for="(detail, dIdx) in detailOrder.details" :key="dIdx">
|
|
|
|
|
+ <div class="spec-card-header">
|
|
|
|
|
+ <span class="spec-no">#{{ dIdx + 1 }}</span>
|
|
|
|
|
+ <span class="spec-model">{{ detail.modelNum || '未知型号' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="spec-info-grid">
|
|
|
|
|
+ <div class="spec-item">
|
|
|
|
|
+ <span class="spec-label">型号名称</span>
|
|
|
|
|
+ <span class="spec-value">{{ detail.modelName || '铝型材主料' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="spec-item">
|
|
|
|
|
+ <span class="spec-label">单据编号</span>
|
|
|
|
|
+ <span class="spec-value">{{ detail.docCode || '-' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="spec-item">
|
|
|
|
|
+ <span class="spec-label">项目号</span>
|
|
|
|
|
+ <span class="spec-value">{{ detail.itemNo || '-' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="spec-item">
|
|
|
|
|
+ <span class="spec-label">型材材质</span>
|
|
|
|
|
+ <span class="spec-value">{{ detail.material || '6063-T5' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="spec-item">
|
|
|
|
|
+ <span class="spec-label">表面处理</span>
|
|
|
|
|
+ <span class="spec-value">{{ detail.surfaceName || '无' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="spec-item">
|
|
|
|
|
+ <span class="spec-label">包装方式</span>
|
|
|
|
|
+ <span class="spec-value">{{ detail.packName || '普通包装' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="spec-item">
|
|
|
|
|
+ <span class="spec-label">订单长度</span>
|
|
|
|
|
+ <span class="spec-value">{{ formatNum(detail.length) }} mm</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="spec-item">
|
|
|
|
|
+ <span class="spec-label">型材壁厚</span>
|
|
|
|
|
+ <span class="spec-value">{{ formatNum(detail.wallThickness, '1.2') }} mm</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="spec-item spec-item--full">
|
|
|
|
|
+ <span class="spec-label">需求支数</span>
|
|
|
|
|
+ <span class="spec-value spec-value--count">{{ detail.count || 0 }} 支</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div class="spec-remark" v-if="detail.remark">
|
|
|
|
|
+ <span class="spec-remark__icon">💬</span>
|
|
|
|
|
+ <span>{{ detail.remark }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <el-empty v-else description="暂无明细数据" :image-size="60" />
|
|
|
|
|
+ </div>
|
|
|
</template>
|
|
</template>
|
|
|
</el-dialog>
|
|
</el-dialog>
|
|
|
</div>
|
|
</div>
|
|
@@ -233,6 +298,21 @@ function handleUrgent(row) {
|
|
|
}).catch(() => { });
|
|
}).catch(() => { });
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+/** 加急订单行高亮 */
|
|
|
|
|
+const urgentRowClassName = ({ row }) => {
|
|
|
|
|
+ if (row.urgentFlag === 1) return 'row-urgent';
|
|
|
|
|
+ return '';
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
|
|
+/** 状态标签 pill 样式 */
|
|
|
|
|
+const statusPillStyle = (status) => {
|
|
|
|
|
+ const color = orderStatusJson[status]?.color || '#909399';
|
|
|
|
|
+ return {
|
|
|
|
|
+ '--status-color': color,
|
|
|
|
|
+ color: color
|
|
|
|
|
+ };
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
/** 格式化数值,匹配小程序端的 toFixed(4) 显示 */
|
|
/** 格式化数值,匹配小程序端的 toFixed(4) 显示 */
|
|
|
function formatNum(val, fallback = '0') {
|
|
function formatNum(val, fallback = '0') {
|
|
|
if (val === null || val === undefined || val === '') return fallback;
|
|
if (val === null || val === undefined || val === '') return fallback;
|
|
@@ -243,7 +323,13 @@ function formatNum(val, fallback = '0') {
|
|
|
getList();
|
|
getList();
|
|
|
</script>
|
|
</script>
|
|
|
|
|
|
|
|
-<style scoped>
|
|
|
|
|
|
|
+<style scoped lang="scss">
|
|
|
|
|
+@use '@/assets/styles/page-common.scss' as *;
|
|
|
|
|
+
|
|
|
|
|
+.order-page {
|
|
|
|
|
+ @include page-common-list;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
/* ========== 状态筛选标签栏 ========== */
|
|
/* ========== 状态筛选标签栏 ========== */
|
|
|
.status-tabs {
|
|
.status-tabs {
|
|
|
display: flex;
|
|
display: flex;
|
|
@@ -288,52 +374,278 @@ getList();
|
|
|
transform: translateX(-50%) scaleX(1);
|
|
transform: translateX(-50%) scaleX(1);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-/* ========== 详情弹框样式 ========== */
|
|
|
|
|
-.section-title {
|
|
|
|
|
- font-size: 14px;
|
|
|
|
|
- font-weight: 600;
|
|
|
|
|
- color: #303133;
|
|
|
|
|
- margin-bottom: 12px;
|
|
|
|
|
- padding-left: 10px;
|
|
|
|
|
- border-left: 3px solid #C1001C;
|
|
|
|
|
|
|
+/* ========== 详情弹窗样式 ========== */
|
|
|
|
|
+.order-detail-dialog :deep(.el-dialog) {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ max-height: 90vh;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.detail-scroll {
|
|
|
|
|
- max-height: 420px;
|
|
|
|
|
|
|
+.order-detail-dialog :deep(.el-dialog__header) {
|
|
|
|
|
+ padding: 20px 24px 16px;
|
|
|
|
|
+ margin-right: 0;
|
|
|
|
|
+ border-bottom: 1px solid #f1f5f9;
|
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.order-detail-dialog :deep(.el-dialog__body) {
|
|
|
|
|
+ padding: 20px 24px;
|
|
|
overflow-y: auto;
|
|
overflow-y: auto;
|
|
|
- padding-right: 2px;
|
|
|
|
|
|
|
+ flex: 1;
|
|
|
|
|
+ min-height: 0;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.detail-card {
|
|
|
|
|
- background: #fff;
|
|
|
|
|
- border: 1px solid #ebeef5;
|
|
|
|
|
|
|
+.detail-dialog-header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 12px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.detail-dialog-title {
|
|
|
|
|
+ font-size: 18px;
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ color: #1a202c;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.detail-code-badge {
|
|
|
|
|
+ padding: 2px 10px;
|
|
|
border-radius: 6px;
|
|
border-radius: 6px;
|
|
|
- padding: 14px;
|
|
|
|
|
- margin-bottom: 12px;
|
|
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+ color: #4f46e5;
|
|
|
|
|
+ background: #eef2ff;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* 加急横幅 */
|
|
|
|
|
+.urgent-banner {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 8px;
|
|
|
|
|
+ padding: 10px 16px;
|
|
|
|
|
+ margin-bottom: 16px;
|
|
|
|
|
+ border-radius: 8px;
|
|
|
|
|
+ background: linear-gradient(135deg, #fff5f5 0%, #fff0f0 100%);
|
|
|
|
|
+ border: 1px solid #fecaca;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.urgent-banner__icon {
|
|
|
|
|
+ font-size: 18px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.detail-card-head {
|
|
|
|
|
|
|
+.urgent-banner__text {
|
|
|
font-size: 13px;
|
|
font-size: 13px;
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
- color: #303133;
|
|
|
|
|
|
|
+ color: #dc2626;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* 信息卡片 */
|
|
|
|
|
+.detail-info-card {
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+ border: 1px solid #edf2f7;
|
|
|
|
|
+ border-radius: 12px;
|
|
|
|
|
+ padding: 20px 24px;
|
|
|
|
|
+ margin-bottom: 16px;
|
|
|
|
|
+ transition: border-color 0.2s;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.detail-info-card.is-urgent {
|
|
|
|
|
+ border-color: #fecaca;
|
|
|
|
|
+ box-shadow: 0 0 0 1px #fecaca;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.detail-card-title {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 8px;
|
|
|
|
|
+ margin-bottom: 16px;
|
|
|
|
|
+ padding-bottom: 12px;
|
|
|
|
|
+ border-bottom: 1px solid #f7f8fc;
|
|
|
|
|
+ font-size: 15px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #1a202c;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.detail-card-title__icon {
|
|
|
|
|
+ font-size: 16px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.detail-card-title__count {
|
|
|
|
|
+ margin-left: auto;
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+ color: #a0aec0;
|
|
|
|
|
+ background: #f7f8fc;
|
|
|
|
|
+ padding: 2px 10px;
|
|
|
|
|
+ border-radius: 10px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* 信息网格 */
|
|
|
|
|
+.detail-info-grid {
|
|
|
|
|
+ display: grid;
|
|
|
|
|
+ grid-template-columns: 1fr 1fr;
|
|
|
|
|
+ gap: 12px 32px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.info-item {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-direction: column;
|
|
|
|
|
+ gap: 2px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.info-label {
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ color: #a0aec0;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+ text-transform: uppercase;
|
|
|
|
|
+ letter-spacing: 0.3px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.info-value {
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ color: #2d3748;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.info-value--highlight {
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ color: #4f46e5;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* 明细滚动区 */
|
|
|
|
|
+.detail-scroll {
|
|
|
|
|
+ padding-right: 4px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* 明细规格卡片 */
|
|
|
|
|
+.detail-spec-card {
|
|
|
|
|
+ background: #fafbfc;
|
|
|
|
|
+ border: 1px solid #edf2f7;
|
|
|
|
|
+ border-radius: 10px;
|
|
|
|
|
+ padding: 16px 20px;
|
|
|
margin-bottom: 10px;
|
|
margin-bottom: 10px;
|
|
|
|
|
+ transition: border-color 0.2s, box-shadow 0.2s;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.count-red {
|
|
|
|
|
- color: #ff3b30;
|
|
|
|
|
|
|
+.detail-spec-card:hover {
|
|
|
|
|
+ border-color: #e2e8f0;
|
|
|
|
|
+ box-shadow: 0 2px 8px rgba(0, 0, 0, 0.04);
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.spec-card-header {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 10px;
|
|
|
|
|
+ margin-bottom: 14px;
|
|
|
|
|
+ padding-bottom: 10px;
|
|
|
|
|
+ border-bottom: 1px dashed #e2e8f0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.spec-no {
|
|
|
|
|
+ display: inline-flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: center;
|
|
|
|
|
+ width: 24px;
|
|
|
|
|
+ height: 24px;
|
|
|
|
|
+ border-radius: 6px;
|
|
|
|
|
+ background: #4f46e5;
|
|
|
|
|
+ color: #fff;
|
|
|
|
|
+ font-size: 12px;
|
|
|
font-weight: 600;
|
|
font-weight: 600;
|
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.spec-model {
|
|
|
|
|
+ font-size: 14px;
|
|
|
|
|
+ font-weight: 600;
|
|
|
|
|
+ color: #1a202c;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.spec-info-grid {
|
|
|
|
|
+ display: grid;
|
|
|
|
|
+ grid-template-columns: 1fr 1fr;
|
|
|
|
|
+ gap: 8px 24px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.detail-remark {
|
|
|
|
|
- margin-top: 8px;
|
|
|
|
|
- padding: 6px 10px;
|
|
|
|
|
- background: #fafafa;
|
|
|
|
|
- border-radius: 4px;
|
|
|
|
|
|
|
+.spec-item {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ padding: 4px 0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.spec-item--full {
|
|
|
|
|
+ grid-column: span 2;
|
|
|
|
|
+ margin-top: 4px;
|
|
|
|
|
+ padding-top: 8px;
|
|
|
|
|
+ border-top: 1px dashed #e2e8f0;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.spec-label {
|
|
|
font-size: 12px;
|
|
font-size: 12px;
|
|
|
- color: #606266;
|
|
|
|
|
|
|
+ color: #8899aa;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.spec-value {
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ color: #2d3748;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.spec-value--count {
|
|
|
|
|
+ font-size: 15px;
|
|
|
|
|
+ font-weight: 700;
|
|
|
|
|
+ color: #ff3b30;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.spec-remark {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ align-items: flex-start;
|
|
|
|
|
+ gap: 6px;
|
|
|
|
|
+ margin-top: 10px;
|
|
|
|
|
+ padding: 8px 12px;
|
|
|
|
|
+ background: #fff;
|
|
|
|
|
+ border-radius: 6px;
|
|
|
|
|
+ font-size: 12px;
|
|
|
|
|
+ color: #718096;
|
|
|
|
|
+ line-height: 1.5;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+.spec-remark__icon {
|
|
|
|
|
+ flex-shrink: 0;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* ========== 加急订单行高亮 ========== */
|
|
|
|
|
+:deep(.row-urgent > td) {
|
|
|
|
|
+ background: #fff5f5 !important;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+:deep(.row-urgent > td:first-child) {
|
|
|
|
|
+ box-shadow: inset 3px 0 0 #ff3b30;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+:deep(.row-urgent:hover > td) {
|
|
|
|
|
+ background: #ffefef !important;
|
|
|
|
|
+}
|
|
|
|
|
+
|
|
|
|
|
+/* ========== 状态标签 pill ========== */
|
|
|
|
|
+.status-pill {
|
|
|
|
|
+ display: inline-flex;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ gap: 6px;
|
|
|
|
|
+ padding: 3px 12px;
|
|
|
|
|
+ border-radius: 20px;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+ font-weight: 500;
|
|
|
|
|
+ background: color-mix(in srgb, var(--status-color) 10%, #fff);
|
|
|
|
|
+ border: 1px solid color-mix(in srgb, var(--status-color) 20%, #fff);
|
|
|
|
|
+ white-space: nowrap;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
-.remark-label {
|
|
|
|
|
- color: #909399;
|
|
|
|
|
|
|
+.status-pill__dot {
|
|
|
|
|
+ width: 6px;
|
|
|
|
|
+ height: 6px;
|
|
|
|
|
+ border-radius: 50%;
|
|
|
|
|
+ flex-shrink: 0;
|
|
|
}
|
|
}
|
|
|
</style>
|
|
</style>
|