OrderDetail.vue 10 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217
  1. <template>
  2. <el-drawer v-model="drawer" :title="dialogTitle" size="30%">
  3. <div>
  4. <el-descriptions :title="t('mall.receivingInfoOne')" :column="2" v-if="DetailData.orderType == 'takeout'">
  5. <el-descriptions-item :label="t('mall.userNickname')">{{ nickname }}</el-descriptions-item>
  6. <el-descriptions-item :label="t('mall.consignee')">{{ DetailData.realName }}</el-descriptions-item>
  7. <el-descriptions-item :label="t('mall.contactPhone')">{{ DetailData.userPhone }}</el-descriptions-item>
  8. <el-descriptions-item :label="t('mall.receivingAddress')">{{ DetailData.userAddress }}</el-descriptions-item>
  9. </el-descriptions>
  10. <el-descriptions title="" :column="1" v-if="DetailData.orderType != 'due'">
  11. <el-descriptions-item>
  12. <template #label>
  13. <div class="mylabel">
  14. {{ t('mall.dishDetails') }}
  15. </div>
  16. </template>
  17. <div
  18. style="background: linear-gradient(to bottom, #e9f1ee, #fcfcf4); padding: 20px 30px; margin: 10px 0; border-radius: 20px"
  19. v-for="(item, index) in DetailData.appDeskOrderVo"
  20. :key="index"
  21. >
  22. <div class="flex align-center">
  23. <div><el-avatar :size="50" :src="item.uavatar" /></div>
  24. <div class="flex flex-1 justify-between font-size-sm text-color-assist">
  25. <div class="flex flex-column ml-2">
  26. <span>{{ item.unickname }}</span>
  27. <span>{{ formatDate(item.addTime) }}</span>
  28. </div>
  29. <div style="">
  30. <span style="color: #9acafc; font-weight: bold">{{
  31. item.uidType == 'user' ? t('mall.userOrdering') : t('mall.staffOrderingOnBehalf')
  32. }}</span>
  33. <span style="color: #5ac725">({{ item.isOrder == 0 ? t('mall.mealNotServed') : t('mall.mealServed') }})</span>
  34. </div>
  35. </div>
  36. </div>
  37. <el-divider />
  38. <div class="flex align-center" v-for="(good, index2) in item.appDeskOrderGoodsVos" :key="index2">
  39. <div><el-image :src="getImageUrl(good.image)" style="width: 70px; height: 70px" /></div>
  40. <div class="flex flex-1 flex-column ml-2 font-size-sm">
  41. <div class="flex justify-between"
  42. ><span class="font-weight-bolder">{{ good.title }}</span
  43. ><span style="color: #f56c6c">{{ good.spec }}</span></div
  44. >
  45. <div class="flex justify-between mt-1"
  46. ><span>¥{{ good.price }}</span
  47. ><span>x{{ good.number }}</span></div
  48. >
  49. </div>
  50. </div>
  51. </div>
  52. </el-descriptions-item>
  53. </el-descriptions>
  54. <el-descriptions :title="t('mall.productDetails')" :column="1" v-else>
  55. <el-descriptions-item :label="t('mall.reserveTable')">
  56. <table width="100%">
  57. <tr style="font-weight: bold; height: 50px">
  58. <td>{{ t('mall.picture') }}</td>
  59. <td>{{ t('mall.name') }}</td>
  60. <td>{{ t('mall.price') }}</td>
  61. <td>{{ t('mall.quantity') }}</td>
  62. </tr>
  63. <tr>
  64. <td><el-image style="width: 40px; height: 40px" :src="getImageUrl(DetailData.shopDeskDO.image)" :fit="fit" /></td>
  65. <td>{{ DetailData.shopDeskDO.title }}</td>
  66. <td>¥0.00</td>
  67. <td>x 1</td>
  68. </tr>
  69. </table>
  70. </el-descriptions-item>
  71. </el-descriptions>
  72. <el-descriptions :title="t('mall.orderInfo')" :column="2">
  73. <template #title>
  74. {{ t('mall.orderInfo') }}
  75. <el-tag type="danger" v-if="DetailData.orderType == 'desk'">{{ t('mall.dineIn') }}</el-tag>
  76. <el-tag type="danger" v-if="DetailData.orderType == 'takeout'">{{ t('mall.takeOut') }}</el-tag>
  77. <el-tag type="danger" v-if="DetailData.orderType == 'takein'">{{ t('mall.pickup') }}</el-tag>
  78. <el-tag type="danger" v-if="DetailData.orderType == 'due'">{{ t('mall.reservation') }}</el-tag>
  79. </template>
  80. <el-descriptions-item :label="t('mall.store')">{{ DetailData.shopName }}</el-descriptions-item>
  81. <el-descriptions-item :label="t('mall.pickupNumber')" v-if="DetailData.orderType != 'due'">{{
  82. DetailData.numberId
  83. }}</el-descriptions-item>
  84. <el-descriptions-item :label="t('mall.tableNumber')">{{
  85. DetailData.deskNumber ? DetailData.deskNumber : t('public.none')
  86. }}</el-descriptions-item>
  87. <el-descriptions-item :label="t('mall.diningPersonCount')" v-if="DetailData.orderType != 'due'">{{
  88. DetailData.deskPeople ? DetailData.deskPeople : t('public.none')
  89. }}</el-descriptions-item>
  90. <el-descriptions-item :label="t('mall.orderNumber1')">{{ DetailData.orderId }}</el-descriptions-item>
  91. <el-descriptions-item :label="t('mall.reservationTime')" v-if="DetailData.orderType == 'due'">{{
  92. formatDate(DetailData.dueTime)
  93. }}</el-descriptions-item>
  94. <el-descriptions-item :label="t('mall.arrivalTime')" v-if="DetailData.orderType == 'due'">{{
  95. DetailData.reachTime
  96. }}</el-descriptions-item>
  97. <el-descriptions-item :label="t('mall.reservationPerson')" v-if="DetailData.orderType == 'due'">{{
  98. DetailData.realName
  99. }}</el-descriptions-item>
  100. <el-descriptions-item :label="t('mall.reservationPhone')" v-if="DetailData.orderType == 'due'">{{
  101. DetailData.userPhone
  102. }}</el-descriptions-item>
  103. <el-descriptions-item :label="t('mall.orderStatus')" v-if="DetailData.orderType != 'due'">{{
  104. DetailData.statusStr
  105. }}</el-descriptions-item>
  106. <el-descriptions-item :label="t('mall.reservationStatus')" v-if="DetailData.orderType == 'due'">
  107. <span v-if="DetailData.dueStatus == 1">{{ t('mall.reserving') }}</span>
  108. <span v-else-if="DetailData.dueStatus == 2">{{ t('mall.cancelled') }}</span>
  109. <span v-else>{{ t('mall.completed') }}</span>
  110. </el-descriptions-item>
  111. <el-descriptions-item :label="t('mall.totalProductQuantity')">{{ DetailData.totalNum }}</el-descriptions-item>
  112. <el-descriptions-item :label="t('mall.totalProductPrice')">{{ DetailData.totalPrice }}</el-descriptions-item>
  113. <el-descriptions-item :label="t('mall.shippingFee')">{{ DetailData.payPostage }}</el-descriptions-item>
  114. <el-descriptions-item :label="t('mall.couponAmount')">{{ DetailData.couponPrice }}</el-descriptions-item>
  115. <el-descriptions-item :label="t('mall.pointsDeduction')">{{ DetailData.useIntegral }}</el-descriptions-item>
  116. <el-descriptions-item :label="t('mall.actualPayment')">{{ DetailData.payPrice }}</el-descriptions-item>
  117. <el-descriptions-item :label="t('mall.bonusPoints')">{{ DetailData.gainIntegral }}</el-descriptions-item>
  118. <el-descriptions-item :label="t('public.createTime')">{{ formatDate(DetailData.createTime) }}</el-descriptions-item>
  119. <el-descriptions-item :label="t('mall.paymentTime')">{{ formatDate(DetailData.payTime) }}</el-descriptions-item>
  120. <el-descriptions-item :label="t('mall.paymentMethod')">{{ DetailData.payType }}</el-descriptions-item>
  121. </el-descriptions>
  122. <!-- <el-descriptions title="物流信息" :column="2">
  123. <el-descriptions-item label="快递公司">{{ DetailData.deliveryName }}</el-descriptions-item>
  124. <el-descriptions-item label="快递单号">{{ DetailData.deliveryId }} <el-button type="primary" @click="getLogistic(DetailData.deliverySn,DetailData.deliveryId)">物流追踪</el-button></el-descriptions-item>
  125. </el-descriptions> -->
  126. <el-timeline>
  127. <el-timeline-item v-for="(activity, index) in logisticResult" :key="index" :timestamp="activity.acceptTime">
  128. {{ activity.acceptStation }}
  129. </el-timeline-item>
  130. </el-timeline>
  131. <!-- <el-button @click="innerDrawer = true">Click me!</el-button>
  132. <el-drawer
  133. v-model="innerDrawer"
  134. title="I'm inner Drawer"
  135. :append-to-body="true"
  136. :before-close="handleClose"
  137. >
  138. <p>_(:зゝ∠)_</p>
  139. </el-drawer> -->
  140. </div>
  141. </el-drawer>
  142. </template>
  143. <script setup lang="ts">
  144. import * as StoreOrderApi from '@/api/mall/order/storeOrder'
  145. import { formatDate } from '@/utils/formatTime'
  146. import { convertImageUrl } from '@/utils/image-helper' // 导入图片URL处理工具
  147. //const message = useMessage() // 消息弹窗
  148. const { t } = useI18n() // 国际化
  149. // const message = useMessage() // 消息弹窗
  150. const dialogTitle = ref('') // 弹窗的标题
  151. const drawer = ref(false)
  152. const DetailData = ref({})
  153. const nickname = ref('')
  154. const logisticResult = ref({})
  155. const product = ref([])
  156. const addProductMark = ref(0)
  157. /** 打开弹窗 */
  158. const open = async (type: string, id?: number) => {
  159. drawer.value = true
  160. dialogTitle.value = t('action.' + type)
  161. DetailData.value = await StoreOrderApi.getStoreOrder(id)
  162. nickname.value = DetailData.value.userRespVO ? DetailData.value.userRespVO.nickname : '--'
  163. product.value = DetailData.value.storeOrderCartInfoDOList
  164. //获取加餐数量
  165. if (DetailData.value.storeOrderCartInfoDOList.length > 0) {
  166. addProductMark.value = DetailData.value.storeOrderCartInfoDOList[DetailData.value.storeOrderCartInfoDOList.length - 1].addProductMark
  167. }
  168. console.log('addProductMark.value:', addProductMark.value)
  169. }
  170. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  171. //const getLogistic = async(deliverySn,deliveryId) => {
  172. // const res = await StoreOrderApi.getLogistic(deliverySn, deliveryId)
  173. // if (res.success == "false") {
  174. // message.error(res.reason)
  175. // }
  176. // logisticResult.value = res.traces
  177. // }
  178. // 添加图片URL转换方法
  179. const getImageUrl = (url) => {
  180. return convertImageUrl(url)
  181. }
  182. </script>
  183. <style scoped>
  184. .flex {
  185. /* #ifndef APP-PLUS-NVUE */
  186. display: flex;
  187. /* #endif */
  188. flex-direction: row;
  189. }
  190. .justify-between {
  191. justify-content: space-between;
  192. }
  193. .justify-center {
  194. justify-content: center;
  195. }
  196. .align-center {
  197. align-items: center;
  198. }
  199. .flex-1 {
  200. flex: 1;
  201. }
  202. .flex-column {
  203. flex-direction: column !important;
  204. }
  205. .ml-2 {
  206. margin-left: 20px;
  207. }
  208. .mylabel {
  209. font-weight: bolder;
  210. text-align: center;
  211. font-size: 18px;
  212. }
  213. </style>