|
@@ -24,10 +24,15 @@
|
|
|
<dict-tag :options="orderStatusDict" :value="orderData.orderStatus" />
|
|
<dict-tag :options="orderStatusDict" :value="orderData.orderStatus" />
|
|
|
</el-descriptions-item>
|
|
</el-descriptions-item>
|
|
|
<el-descriptions-item label="订单金额">¥{{ orderData.totalAmount || '--' }}</el-descriptions-item>
|
|
<el-descriptions-item label="订单金额">¥{{ orderData.totalAmount || '--' }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="运费">¥{{ (Number(orderData.shippingFee) || 0).toFixed(2) }}</el-descriptions-item>
|
|
|
|
|
|
|
+ <el-descriptions-item v-if="orderData.currentLevel >= 2 && orderData.currentLevel <= 3" label="分配人">
|
|
|
|
|
+ {{ orderData.assigneeName || '--' }}
|
|
|
|
|
+ </el-descriptions-item>
|
|
|
|
|
+ <el-descriptions-item v-if="orderData.currentLevel < 2 || orderData.currentLevel > 3" label="运费">
|
|
|
|
|
+ ¥{{ (Number(orderData.shippingFee) || 0).toFixed(2) }}
|
|
|
|
|
+ </el-descriptions-item>
|
|
|
<el-descriptions-item label="下单时间">{{ orderData.orderTime || '--' }}</el-descriptions-item>
|
|
<el-descriptions-item label="下单时间">{{ orderData.orderTime || '--' }}</el-descriptions-item>
|
|
|
<el-descriptions-item label="确认时间">{{ orderData.confirmTime || '--' }}</el-descriptions-item>
|
|
<el-descriptions-item label="确认时间">{{ orderData.confirmTime || '--' }}</el-descriptions-item>
|
|
|
- <el-descriptions-item label="签收时间">{{ orderData.receivingTime || '--' }}</el-descriptions-item>
|
|
|
|
|
|
|
+ <!-- <el-descriptions-item label="签收时间">{{ orderData.receivingTime || '--' }}</el-descriptions-item> -->
|
|
|
<el-descriptions-item v-if="orderData.remark" label="备注">{{ orderData.remark }}</el-descriptions-item>
|
|
<el-descriptions-item v-if="orderData.remark" label="备注">{{ orderData.remark }}</el-descriptions-item>
|
|
|
</el-descriptions>
|
|
</el-descriptions>
|
|
|
|
|
|
|
@@ -50,6 +55,38 @@
|
|
|
</el-table>
|
|
</el-table>
|
|
|
</div>
|
|
</div>
|
|
|
|
|
|
|
|
|
|
+ <!-- 包裹列表(二级及以上订单) -->
|
|
|
|
|
+ <div v-if="orderData.currentLevel >= 2" class="section">
|
|
|
|
|
+ <div class="section-title deliver-title">
|
|
|
|
|
+ <span>包裹信息</span>
|
|
|
|
|
+ <el-button link type="primary" @click="toggleDeliverList">
|
|
|
|
|
+ {{ deliverExpanded ? '收起' : '展开' }}
|
|
|
|
|
+ </el-button>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <div v-show="deliverExpanded" v-loading="deliverLoading">
|
|
|
|
|
+ <el-empty v-if="!deliverList.length && !deliverLoading" description="暂无包裹信息" />
|
|
|
|
|
+ <el-card v-for="deliver in deliverList" :key="deliver.id" class="deliver-card">
|
|
|
|
|
+ <div class="deliver-info-bar">
|
|
|
|
|
+ <div class="deliver-info-fields">
|
|
|
|
|
+ <span>发货单号:{{ (deliver as any).deliverCode || '--' }}</span>
|
|
|
|
|
+ <span>发货时间:{{ (deliver as any).createTime || '--' }}</span>
|
|
|
|
|
+ <span>发货方式:{{ getDictLabel(deliverMethodDict, deliver.deliverMethod || '') }}</span>
|
|
|
|
|
+ <span v-if="deliver.deliverMethod == '0'">收货人:{{ deliver.deliverMan || '--' }}</span>
|
|
|
|
|
+ <span>手机:{{ deliver.phone || deliver.consigneePhone || '--' }}</span>
|
|
|
|
|
+ <span v-if="deliver.deliverMethod == '1'" class="field-indent">物流单号:{{ deliver.logisticNo || '--' }}</span>
|
|
|
|
|
+ <span class="field-indent">发货备注:{{ deliver.deliverRemark || '--' }}</span>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ <el-table :data="deliver.deliverProductList" border style="width: 100%">
|
|
|
|
|
+ <el-table-column label="产品编号" prop="productNo" align="center" />
|
|
|
|
|
+ <el-table-column label="商品名称" prop="productName" align="center" />
|
|
|
|
|
+ <el-table-column label="单位" prop="productUnit" align="center" />
|
|
|
|
|
+ <el-table-column label="发货数量" prop="deliverNum" align="center" />
|
|
|
|
|
+ </el-table>
|
|
|
|
|
+ </el-card>
|
|
|
|
|
+ </div>
|
|
|
|
|
+ </div>
|
|
|
|
|
+
|
|
|
<!-- 子订单 -->
|
|
<!-- 子订单 -->
|
|
|
<div v-if="orderData.childOrders && orderData.childOrders.length" class="section child-orders-section">
|
|
<div v-if="orderData.childOrders && orderData.childOrders.length" class="section child-orders-section">
|
|
|
<h4 class="section-title">子订单({{ orderData.childOrders.length }}个)</h4>
|
|
<h4 class="section-title">子订单({{ orderData.childOrders.length }}个)</h4>
|
|
@@ -70,22 +107,65 @@
|
|
|
</template>
|
|
</template>
|
|
|
|
|
|
|
|
<script setup lang="ts">
|
|
<script setup lang="ts">
|
|
|
-import { ref, inject } from 'vue';
|
|
|
|
|
|
|
+import { ref, inject, getCurrentInstance } from 'vue';
|
|
|
|
|
+import type { ComponentInternalInstance } from 'vue';
|
|
|
import type { OrderTreeVo } from '@/api/order/orderMain/types';
|
|
import type { OrderTreeVo } from '@/api/order/orderMain/types';
|
|
|
|
|
+import { listOrderDeliver } from '@/api/order/orderDeliver';
|
|
|
|
|
+import { listDeliverProduct } from '@/api/order/deliverProduct';
|
|
|
|
|
+import type { OrderDeliverVO } from '@/api/order/orderDeliver/types';
|
|
|
|
|
|
|
|
defineOptions({ name: 'OrderTreeNode' });
|
|
defineOptions({ name: 'OrderTreeNode' });
|
|
|
|
|
|
|
|
-defineProps<{
|
|
|
|
|
|
|
+const props = defineProps<{
|
|
|
orderData: OrderTreeVo;
|
|
orderData: OrderTreeVo;
|
|
|
}>();
|
|
}>();
|
|
|
|
|
|
|
|
|
|
+const { proxy } = getCurrentInstance() as ComponentInternalInstance;
|
|
|
|
|
+const deliverMethodDict = inject<any[]>('deliverMethodDict', (proxy?.useDict('deliver_method') as any)?.deliver_method || []);
|
|
|
|
|
+
|
|
|
const LEVEL_LABELS = ['', '一级订单', '二级订单', '三级订单', '四级订单', '五级订单'];
|
|
const LEVEL_LABELS = ['', '一级订单', '二级订单', '三级订单', '四级订单', '五级订单'];
|
|
|
const LEVEL_TYPES = ['primary', 'success', 'warning', 'info', 'danger'] as const;
|
|
const LEVEL_TYPES = ['primary', 'success', 'warning', 'info', 'danger'] as const;
|
|
|
|
|
|
|
|
const orderStatusDict = inject<any[]>('orderStatusDict', []);
|
|
const orderStatusDict = inject<any[]>('orderStatusDict', []);
|
|
|
|
|
|
|
|
|
|
+// 字典标签转换
|
|
|
|
|
+const getDictLabel = (dictList: any[], value: string) => {
|
|
|
|
|
+ if (!dictList || !value) return '--';
|
|
|
|
|
+ const item = dictList.find((d) => d.value === value);
|
|
|
|
|
+ return item ? item.label : value;
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
const activeChildNames = ref<string[]>([]);
|
|
const activeChildNames = ref<string[]>([]);
|
|
|
|
|
|
|
|
|
|
+// 包裹列表
|
|
|
|
|
+const deliverExpanded = ref(false);
|
|
|
|
|
+const deliverLoading = ref(false);
|
|
|
|
|
+const deliverList = ref<OrderDeliverVO[]>([]);
|
|
|
|
|
+
|
|
|
|
|
+const toggleDeliverList = async () => {
|
|
|
|
|
+ deliverExpanded.value = !deliverExpanded.value;
|
|
|
|
|
+ if (deliverExpanded.value && !deliverList.value.length) {
|
|
|
|
|
+ deliverLoading.value = true;
|
|
|
|
|
+ try {
|
|
|
|
|
+ const res = await listOrderDeliver({ orderId: props.orderData.id, pageNum: 1, pageSize: 100 });
|
|
|
|
|
+ const list = (res as any).rows || res.data || [];
|
|
|
|
|
+ for (const deliver of list) {
|
|
|
|
|
+ try {
|
|
|
|
|
+ const productRes = await listDeliverProduct({ deliverId: deliver.id, pageNum: 1, pageSize: 100 });
|
|
|
|
|
+ deliver.deliverProductList = (productRes as any).rows || productRes.data || [];
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ deliver.deliverProductList = [];
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ deliverList.value = list;
|
|
|
|
|
+ } catch (e) {
|
|
|
|
|
+ console.error('获取包裹列表失败:', e);
|
|
|
|
|
+ } finally {
|
|
|
|
|
+ deliverLoading.value = false;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+};
|
|
|
|
|
+
|
|
|
function levelLabel(lv: number) {
|
|
function levelLabel(lv: number) {
|
|
|
return lv <= 5 ? LEVEL_LABELS[lv] : `${lv}级订单`;
|
|
return lv <= 5 ? LEVEL_LABELS[lv] : `${lv}级订单`;
|
|
|
}
|
|
}
|
|
@@ -160,6 +240,38 @@ function levelTagType(lv: number) {
|
|
|
margin-top: 16px;
|
|
margin-top: 16px;
|
|
|
}
|
|
}
|
|
|
|
|
|
|
|
|
|
+ .deliver-title {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ justify-content: space-between;
|
|
|
|
|
+ align-items: center;
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ .deliver-card {
|
|
|
|
|
+ margin-bottom: 12px;
|
|
|
|
|
+
|
|
|
|
|
+ .deliver-info-bar {
|
|
|
|
|
+ background: #f3f3f3;
|
|
|
|
|
+ padding: 10px;
|
|
|
|
|
+ margin-bottom: 12px;
|
|
|
|
|
+ border-radius: 4px;
|
|
|
|
|
+
|
|
|
|
|
+ .deliver-info-fields {
|
|
|
|
|
+ display: flex;
|
|
|
|
|
+ flex-wrap: wrap;
|
|
|
|
|
+ gap: 16px;
|
|
|
|
|
+ font-size: 13px;
|
|
|
|
|
+
|
|
|
|
|
+ .field-indent {
|
|
|
|
|
+ margin-left: 20px;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ :deep(.el-card__body) {
|
|
|
|
|
+ padding: 16px;
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
.collapse-title {
|
|
.collapse-title {
|
|
|
display: flex;
|
|
display: flex;
|
|
|
align-items: center;
|
|
align-items: center;
|