order-base-info.vue 7.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179
  1. <template>
  2. <div class="order-base-info">
  3. <ele-card header="订单基本信息">
  4. <div class="info-layout">
  5. <!-- Left Column: Order Info -->
  6. <div class="info-column">
  7. <div class="info-item">
  8. <span class="label">订单编号:</span>
  9. <span class="value">{{ detail.orderId }}</span>
  10. </div>
  11. <div class="info-item">
  12. <span class="label">订单来源:</span>
  13. <span class="value">
  14. <span v-if="detail.orderFrom == 1">微信小程序</span>
  15. <span v-else-if="detail.orderFrom == 2">支付宝小程序</span>
  16. <span v-else>商城小程序</span>
  17. <el-image v-if="[1, 2].includes(detail.orderFrom)"
  18. :src="detail.orderFrom == 2 ? alipayIcon : wxIcon"
  19. style="width: 16px; height: 16px; margin-left: 4px; vertical-align: text-bottom;" />
  20. </span>
  21. </div>
  22. <div class="info-item">
  23. <span class="label">支付渠道:</span>
  24. <span class="value">
  25. <dict-data v-if="detail.payType" code="shop_order_pay_type" type="text"
  26. :model-value="detail.payType" />
  27. <span v-else>-</span>
  28. </span>
  29. </div>
  30. <div class="info-item">
  31. <span class="label">交易状态:</span>
  32. <span class="value">
  33. <dict-data v-if="detail.status" code="shop_order_status" type="tag"
  34. :model-value="detail.status" />
  35. <span v-else>-</span>
  36. </span>
  37. </div>
  38. <div class="info-item">
  39. <span class="label">平台备注:</span>
  40. <span class="value">{{ detail.remark || '正常发货' }}</span>
  41. </div>
  42. </div>
  43. <!-- Center Column: User/Receiver Info -->
  44. <div class="info-column">
  45. <div class="info-item">
  46. <span class="label">用户名:</span>
  47. <span class="value">{{ detail.userNick }}</span>
  48. </div>
  49. <div class="info-item">
  50. <span class="label">收 件 人:</span>
  51. <span class="value">{{ detail.receiverName }}</span>
  52. <el-button link type="success" class="ml-2" @click="$emit('edit-receiver')">修改</el-button>
  53. </div>
  54. <div class="info-item">
  55. <span class="label">电 话:</span>
  56. <span class="value">{{ formatPhone(detail.receiverMobile) }}</span>
  57. </div>
  58. <div class="info-item">
  59. <span class="label">地 址:</span>
  60. <span class="value">{{ detail.receiverAddress }}</span>
  61. </div>
  62. <div class="info-item">
  63. <span class="label">用户备注:</span>
  64. <span class="value" :style="{ color: detail.remark ? '#f56c6c' : '' }">{{ detail.remark || '无' }}</span>
  65. </div>
  66. <div class="info-item warning-text" v-if="detail.shortageNote">
  67. <span class="label" style="color: #f56c6c;">如遇缺货:</span>
  68. <span class="value" style="color: #f56c6c;">{{ detail.shortageNote }}</span>
  69. </div>
  70. </div>
  71. <!-- Right Column: Logistics Info -->
  72. <div class="info-column">
  73. <div class="info-item">
  74. <span class="label">发货物流:</span>
  75. <span class="value">{{ detail.expressName || '-' }}</span>
  76. </div>
  77. <div class="info-item">
  78. <span class="label">发货单号:</span>
  79. <span class="value">{{ detail.waybillCode || '-' }}</span>
  80. <el-popover placement="bottom" title="物流动态" :width="300" trigger="hover">
  81. <template #reference>
  82. <el-button link type="success" class="ml-2" v-if="detail.waybillCode"
  83. @click="viewLogistics">查看</el-button>
  84. </template>
  85. <el-timeline>
  86. <el-timeline-item v-for="(activity, index) in activities" :key="index"
  87. :timestamp="activity.timestamp">
  88. {{ activity.content }}
  89. </el-timeline-item>
  90. </el-timeline>
  91. </el-popover>
  92. </div>
  93. <div class="action-area mt-2">
  94. <el-button type="success" @click="$emit('add-package')">新增额外包裹 <el-icon class="el-icon--right">
  95. <Lightning />
  96. </el-icon></el-button>
  97. </div>
  98. <div class="status-tags mt-2">
  99. <el-tag :type="detail.status >= 3 ? 'success' : 'warning'" effect="dark" class="mr-2">
  100. {{ detail.status >= 3 ? '已发货' : '未发货' }}
  101. </el-tag>
  102. <el-tag :type="detail.status == 4 ? 'success' : 'warning'" effect="dark">
  103. {{ detail.status == 4 ? '已完成' : '未完成' }}
  104. </el-tag>
  105. </div>
  106. </div>
  107. </div>
  108. </ele-card>
  109. </div>
  110. </template>
  111. <script setup>
  112. import { Lightning } from '@element-plus/icons-vue';
  113. import { EleMessage } from 'ele-admin-plus/es';
  114. import { ref } from 'vue';
  115. import wxIcon from '@/assets/wx.png';
  116. import alipayIcon from '@/assets/alipay.png';
  117. import { formatPhone } from '@/utils/common';
  118. const props = defineProps({
  119. detail: {
  120. type: Object,
  121. required: true,
  122. default: () => ({})
  123. }
  124. });
  125. defineEmits(['add-package', 'edit-receiver']);
  126. const activities = ref([]);
  127. const viewLogistics = () => {
  128. EleMessage.info('物流详情功能开发中');
  129. };
  130. </script>
  131. <style scoped>
  132. .order-base-info {
  133. font-size: 13px;
  134. }
  135. .info-layout {
  136. display: flex;
  137. gap: 20px;
  138. }
  139. .info-column {
  140. flex: 1;
  141. display: flex;
  142. flex-direction: column;
  143. gap: 12px;
  144. }
  145. .info-item {
  146. display: flex;
  147. align-items: flex-start;
  148. line-height: 1.4;
  149. }
  150. .label {
  151. color: #909399;
  152. width: 70px;
  153. flex-shrink: 0;
  154. }
  155. .value {
  156. color: #303133;
  157. word-break: break-all;
  158. }
  159. .action-area {
  160. margin-top: auto;
  161. }
  162. </style>