orderForm.vue 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  1. <template>
  2. <Dialog :title="dialogTitle" v-model="dialogVisible" width="50%">
  3. <el-descriptions :column="2" label-class-name="desc-label">
  4. <el-descriptions-item label="商户名称">{{ orderDetail.merchantName }}</el-descriptions-item>
  5. <el-descriptions-item label="应用名称">{{ orderDetail.appName }}</el-descriptions-item>
  6. <el-descriptions-item label="商品名称">{{ orderDetail.subject }}</el-descriptions-item>
  7. </el-descriptions>
  8. <el-divider />
  9. <el-descriptions :column="2" label-class-name="desc-label">
  10. <el-descriptions-item label="商户订单号">
  11. <el-tag size="small">{{ orderDetail.merchantOrderId }}</el-tag>
  12. </el-descriptions-item>
  13. <el-descriptions-item label="渠道订单号">
  14. <el-tag class="tag-purple" size="small">{{ orderDetail.channelOrderNo }}</el-tag>
  15. </el-descriptions-item>
  16. <el-descriptions-item label="支付订单号">
  17. <el-tag v-if="orderDetail.payOrderExtension.no !== ''" class="tag-pink" size="small">
  18. {{ orderDetail.payOrderExtension.no }}
  19. </el-tag>
  20. </el-descriptions-item>
  21. <el-descriptions-item label="金额">
  22. <el-tag type="success" size="small">{{ parseFloat(orderDetail.amount / 100, 2) }}</el-tag>
  23. </el-descriptions-item>
  24. <el-descriptions-item label="手续费">
  25. <el-tag type="warning" size="small"
  26. >{{ parseFloat(orderDetail.channelFeeAmount / 100, 2) }}
  27. </el-tag>
  28. </el-descriptions-item>
  29. <el-descriptions-item label="手续费比例">
  30. {{ parseFloat(orderDetail.channelFeeRate / 100, 2) }}%
  31. </el-descriptions-item>
  32. <el-descriptions-item label="支付状态">
  33. <dict-tag :type="DICT_TYPE.PAY_ORDER_STATUS" :value="orderDetail.status" />
  34. </el-descriptions-item>
  35. <el-descriptions-item label="回调状态">
  36. <dict-tag :type="DICT_TYPE.PAY_ORDER_NOTIFY_STATUS" :value="orderDetail.notifyStatus" />
  37. </el-descriptions-item>
  38. <el-descriptions-item label="回调地址">{{ orderDetail.notifyUrl }}</el-descriptions-item>
  39. <el-descriptions-item label="创建时间" :formatter="dateFormatter">
  40. {{ formatDate(orderDetail.createTime) }}
  41. </el-descriptions-item>
  42. <el-descriptions-item label="支付时间" :formatter="dateFormatter">
  43. {{ formatDate(orderDetail.successTime) }}
  44. </el-descriptions-item>
  45. <el-descriptions-item label="失效时间" :formatter="dateFormatter">
  46. {{ formatDate(orderDetail.expireTime) }}
  47. </el-descriptions-item>
  48. <el-descriptions-item label="通知时间" :formatter="dateFormatter">
  49. {{ formatDate(orderDetail.notifyTime) }}
  50. </el-descriptions-item>
  51. </el-descriptions>
  52. <el-divider />
  53. <el-descriptions :column="2" label-class-name="desc-label">
  54. <el-descriptions-item label="支付渠道"
  55. >{{ orderDetail.channelCodeName }}
  56. </el-descriptions-item>
  57. <el-descriptions-item label="支付IP">{{ orderDetail.userIp }}</el-descriptions-item>
  58. <el-descriptions-item label="退款状态">
  59. <dict-tag :type="DICT_TYPE.PAY_ORDER_REFUND_STATUS" :value="orderDetail.refundStatus" />
  60. </el-descriptions-item>
  61. <el-descriptions-item label="退款次数">{{ orderDetail.refundTimes }}</el-descriptions-item>
  62. <el-descriptions-item label="退款金额">
  63. <el-tag type="warning">
  64. {{ parseFloat(orderDetail.refundAmount / 100, 2) }}
  65. </el-tag>
  66. </el-descriptions-item>
  67. </el-descriptions>
  68. <el-divider />
  69. <el-descriptions :column="1" label-class-name="desc-label" direction="vertical" border>
  70. <el-descriptions-item label="商品描述">
  71. {{ orderDetail.body }}
  72. </el-descriptions-item>
  73. <el-descriptions-item label="支付通道异步回调内容">
  74. {{ orderDetail.payOrderExtension.channelNotifyData }}
  75. </el-descriptions-item>
  76. </el-descriptions>
  77. </Dialog>
  78. </template>
  79. <script setup lang="ts" name="orderForm">
  80. import { DICT_TYPE } from '@/utils/dict'
  81. import * as OrderApi from '@/api/pay/order'
  82. import { dateFormatter, formatDate } from '@/utils/formatTime'
  83. const { t } = useI18n() // 国际化
  84. // const message = useMessage() // 消息弹窗
  85. const dialogVisible = ref(false) // 弹窗的是否展示
  86. const dialogTitle = ref('订单详情') // 弹窗的标题
  87. const formLoading = ref(false) // 表单的加载中:1)修改时的数据加载;2)提交的按钮禁用
  88. const defaultOrderDetail = {
  89. merchantName: '',
  90. appName: '',
  91. channelCodeName: '',
  92. subject: '',
  93. merchantOrderId: null,
  94. channelOrderNo: '',
  95. body: '',
  96. amount: null,
  97. channelFeeRate: null,
  98. channelFeeAmount: null,
  99. userIp: '',
  100. status: null,
  101. notifyUrl: '',
  102. notifyStatus: null,
  103. refundStatus: null,
  104. refundTimes: '',
  105. refundAmount: null,
  106. createTime: '',
  107. successTime: '',
  108. notifyTime: '',
  109. expireTime: '',
  110. payOrderExtension: {
  111. channelNotifyData: '',
  112. no: ''
  113. }
  114. }
  115. const orderDetail = ref(JSON.parse(JSON.stringify(defaultOrderDetail)))
  116. /** 打开弹窗 */
  117. const open = async (id?: number) => {
  118. dialogVisible.value = true
  119. dialogTitle.value = t('action.preview')
  120. // 修改时,设置数据
  121. if (id) {
  122. formLoading.value = true
  123. try {
  124. orderDetail.value = await OrderApi.getOrderDetail(id)
  125. if (orderDetail.value.payOrderExtension === null) {
  126. orderDetail.value.payOrderExtension = Object.assign(
  127. defaultOrderDetail.payOrderExtension,
  128. {}
  129. )
  130. }
  131. } finally {
  132. formLoading.value = false
  133. }
  134. }
  135. }
  136. defineExpose({ open }) // 提供 open 方法,用于打开弹窗
  137. </script>
  138. <style>
  139. .tag-purple {
  140. color: #722ed1;
  141. background: #f9f0ff;
  142. border-color: #d3adf7;
  143. }
  144. .tag-pink {
  145. color: #eb2f96;
  146. background: #fff0f6;
  147. border-color: #ffadd2;
  148. }
  149. </style>