hurx 6 днів тому
батько
коміт
f4540ce46e
1 змінених файлів з 116 додано та 4 видалено
  1. 116 4
      src/views/order/saleOrder/OrderTreeNode.vue

+ 116 - 4
src/views/order/saleOrder/OrderTreeNode.vue

@@ -24,10 +24,15 @@
           <dict-tag :options="orderStatusDict" :value="orderData.orderStatus" />
         </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.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>
 
@@ -50,6 +55,38 @@
         </el-table>
       </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">
         <h4 class="section-title">子订单({{ orderData.childOrders.length }}个)</h4>
@@ -70,22 +107,65 @@
 </template>
 
 <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 { listOrderDeliver } from '@/api/order/orderDeliver';
+import { listDeliverProduct } from '@/api/order/deliverProduct';
+import type { OrderDeliverVO } from '@/api/order/orderDeliver/types';
 
 defineOptions({ name: 'OrderTreeNode' });
 
-defineProps<{
+const props = defineProps<{
   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_TYPES = ['primary', 'success', 'warning', 'info', 'danger'] as const;
 
 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 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) {
   return lv <= 5 ? LEVEL_LABELS[lv] : `${lv}级订单`;
 }
@@ -160,6 +240,38 @@ function levelTagType(lv: number) {
     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 {
     display: flex;
     align-items: center;