OrderDetail.vue 4.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117
  1. <template>
  2. <Dialog v-model="dialogVisible" title="详情" width="50%">
  3. <el-descriptions :column="2">
  4. <el-descriptions-item label="商户名称">{{ detailData.merchantName }}</el-descriptions-item>
  5. <el-descriptions-item label="应用名称">{{ detailData.appName }}</el-descriptions-item>
  6. <el-descriptions-item label="商品名称">{{ detailData.subject }}</el-descriptions-item>
  7. </el-descriptions>
  8. <el-divider />
  9. <el-descriptions :column="2">
  10. <el-descriptions-item label="商户订单号">
  11. <el-tag>{{ detailData.merchantOrderId }}</el-tag>
  12. </el-descriptions-item>
  13. <el-descriptions-item label="渠道订单号">
  14. <el-tag class="tag-purple">{{ detailData.channelOrderNo }}</el-tag>
  15. </el-descriptions-item>
  16. <el-descriptions-item label="支付订单号">
  17. <el-tag v-if="detailData.payOrderExtension" class="tag-pink">
  18. {{ detailData.payOrderExtension.no }}
  19. </el-tag>
  20. </el-descriptions-item>
  21. <el-descriptions-item label="金额">
  22. <el-tag type="success">¥{{ parseFloat(detailData.price / 100, 2).toFixed(2) }}</el-tag>
  23. </el-descriptions-item>
  24. <el-descriptions-item label="手续费">
  25. <el-tag type="warning">
  26. ¥{{ parseFloat(detailData.channelFeePrice / 100, 2).toFixed(2) }}
  27. </el-tag>
  28. </el-descriptions-item>
  29. <el-descriptions-item label="手续费比例">
  30. {{ parseFloat(detailData.channelFeeRate / 100, 2) }}%
  31. </el-descriptions-item>
  32. <el-descriptions-item label="支付状态">
  33. <dict-tag :type="DICT_TYPE.PAY_ORDER_STATUS" :value="detailData.status" />
  34. </el-descriptions-item>
  35. <el-descriptions-item label="回调状态">
  36. <dict-tag :type="DICT_TYPE.PAY_ORDER_NOTIFY_STATUS" :value="detailData.notifyStatus" />
  37. </el-descriptions-item>
  38. <el-descriptions-item label="回调地址">{{ detailData.notifyUrl }}</el-descriptions-item>
  39. <el-descriptions-item label="创建时间">
  40. {{ formatDate(detailData.createTime) }}
  41. </el-descriptions-item>
  42. <el-descriptions-item label="支付时间">
  43. {{ formatDate(detailData.successTime) }}
  44. </el-descriptions-item>
  45. <el-descriptions-item label="失效时间">
  46. {{ formatDate(detailData.expireTime) }}
  47. </el-descriptions-item>
  48. <el-descriptions-item label="通知时间">
  49. {{ formatDate(detailData.notifyTime) }}
  50. </el-descriptions-item>
  51. </el-descriptions>
  52. <el-divider />
  53. <el-descriptions :column="2">
  54. <el-descriptions-item label="支付渠道"
  55. >{{ detailData.channelCodeName }}
  56. </el-descriptions-item>
  57. <el-descriptions-item label="支付IP">{{ detailData.userIp }}</el-descriptions-item>
  58. <el-descriptions-item label="退款状态">
  59. <dict-tag :type="DICT_TYPE.PAY_ORDER_REFUND_STATUS" :value="detailData.refundStatus" />
  60. </el-descriptions-item>
  61. <el-descriptions-item label="退款次数">{{ detailData.refundTimes }}</el-descriptions-item>
  62. <el-descriptions-item label="退款金额">
  63. <el-tag type="warning">
  64. {{ parseFloat(detailData.refundPrice / 100, 2) }}
  65. </el-tag>
  66. </el-descriptions-item>
  67. </el-descriptions>
  68. <el-divider />
  69. <el-descriptions :column="1" border direction="vertical">
  70. <el-descriptions-item label="商品描述">
  71. {{ detailData.body }}
  72. </el-descriptions-item>
  73. <el-descriptions-item label="支付通道异步回调内容">
  74. <div style="width: 700px; overflow: auto">
  75. {{ detailData.payOrderExtension?.channelNotifyData }}
  76. </div>
  77. </el-descriptions-item>
  78. </el-descriptions>
  79. </Dialog>
  80. </template>
  81. <script lang="ts" setup>
  82. import { DICT_TYPE } from '@/utils/dict'
  83. import * as OrderApi from '@/api/pay/order'
  84. import { formatDate } from '@/utils/formatTime'
  85. defineOptions({ name: 'PayOrderDetail' })
  86. const dialogVisible = ref(false) // 弹窗的是否展示
  87. const detailLoading = ref(false) // 表单的加载中
  88. const detailData = ref({})
  89. /** 打开弹窗 */
  90. const open = async (id: number) => {
  91. dialogVisible.value = true
  92. // 设置数据
  93. detailLoading.value = true
  94. try {
  95. detailData.value = await OrderApi.getOrderDetail(id)
  96. } finally {
  97. detailLoading.value = false
  98. }
  99. }
  100. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  101. </script>
  102. <style>
  103. .tag-purple {
  104. color: #722ed1;
  105. background: #f9f0ff;
  106. border-color: #d3adf7;
  107. }
  108. .tag-pink {
  109. color: #eb2f96;
  110. background: #fff0f6;
  111. border-color: #ffadd2;
  112. }
  113. </style>