notifyLog.vue 4.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. <template>
  2. <el-dialog :close-on-click-modal="false" title="回调日志" draggable v-model="visible" width="1000px">
  3. <div v-loading="loading">
  4. <!-- 回调信息概览 -->
  5. <el-descriptions :column="2" border class="mb20" v-if="notifyData.id">
  6. <el-descriptions-item label="订单ID">{{ notifyData.orderId }}</el-descriptions-item>
  7. <el-descriptions-item label="通知状态">
  8. <el-tag v-if="notifyData.status === 0" type="warning">待通知</el-tag>
  9. <el-tag v-else-if="notifyData.status === 1" type="success">通知成功</el-tag>
  10. <el-tag v-else-if="notifyData.status === 2" type="danger">通知失败</el-tag>
  11. <el-tag v-else>{{ notifyData.status }}</el-tag>
  12. </el-descriptions-item>
  13. <el-descriptions-item label="当前通知次数">{{ notifyData.notifyTimes }}</el-descriptions-item>
  14. <el-descriptions-item label="最大通知次数">{{ notifyData.maxNotifyTimes }}</el-descriptions-item>
  15. <el-descriptions-item label="通知地址" :span="2">{{ notifyData.notifyUrl }}</el-descriptions-item>
  16. <el-descriptions-item label="最后执行时间" :span="2">{{ notifyData.lastExecuteTime || '-' }}</el-descriptions-item>
  17. <el-descriptions-item label="下次通知时间" :span="2">{{ notifyData.nextNotifyTime || '-' }}</el-descriptions-item>
  18. <el-descriptions-item label="失败原因" :span="2">
  19. <span style="color: #f56c6c">{{ notifyData.errorMsg || '-' }}</span>
  20. </el-descriptions-item>
  21. </el-descriptions>
  22. <!-- 通知日志列表 -->
  23. <el-divider content-position="left">通知日志</el-divider>
  24. <el-timeline v-if="notifyData.payNotifyLogs && notifyData.payNotifyLogs.length > 0">
  25. <el-timeline-item
  26. v-for="(log, index) in notifyData.payNotifyLogs"
  27. :key="index"
  28. :timestamp="log.createTime"
  29. placement="top"
  30. :type="log.status === 1 ? 'success' : 'danger'"
  31. >
  32. <el-card shadow="hover">
  33. <div class="log-item">
  34. <div class="log-header">
  35. <span class="log-title">第 {{ log.notifyTimes }} 次通知</span>
  36. <el-tag v-if="log.status === 0" type="warning" size="small">待通知</el-tag>
  37. <el-tag v-else-if="log.status === 1" type="success" size="small">通知成功</el-tag>
  38. <el-tag v-else-if="log.status === 2" type="danger" size="small">通知失败</el-tag>
  39. </div>
  40. <div class="log-content">
  41. <div class="log-label">响应结果:</div>
  42. <pre class="log-response">{{ log.response || '无响应' }}</pre>
  43. </div>
  44. </div>
  45. </el-card>
  46. </el-timeline-item>
  47. </el-timeline>
  48. <el-empty v-else description="暂无通知日志" />
  49. </div>
  50. <template #footer>
  51. <span class="dialog-footer">
  52. <el-button @click="visible = false">关闭</el-button>
  53. </span>
  54. </template>
  55. </el-dialog>
  56. </template>
  57. <script lang="ts" name="NotifyLogDialog" setup>
  58. import { fetchPayNotifyLog } from '/@/api/order';
  59. import { useMessage } from '/@/hooks/message';
  60. // 定义变量
  61. const visible = ref(false);
  62. const loading = ref(false);
  63. const notifyData = reactive<any>({});
  64. // 打开弹窗
  65. const openDialog = async (appId: string, orderId: string) => {
  66. visible.value = true;
  67. loading.value = true;
  68. // 清空数据
  69. Object.keys(notifyData).forEach(key => delete notifyData[key]);
  70. try {
  71. const res = await fetchPayNotifyLog(appId, orderId);
  72. Object.assign(notifyData, res.data);
  73. } catch (err: any) {
  74. useMessage().error(err.msg || '获取回调日志失败');
  75. } finally {
  76. loading.value = false;
  77. }
  78. };
  79. // 暴露方法
  80. defineExpose({
  81. openDialog,
  82. });
  83. </script>
  84. <style scoped>
  85. .log-item {
  86. padding: 10px 0;
  87. }
  88. .log-header {
  89. display: flex;
  90. justify-content: space-between;
  91. align-items: center;
  92. margin-bottom: 10px;
  93. }
  94. .log-title {
  95. font-size: 16px;
  96. font-weight: bold;
  97. color: #303133;
  98. }
  99. .log-content {
  100. margin-top: 10px;
  101. }
  102. .log-label {
  103. font-size: 14px;
  104. color: #606266;
  105. margin-bottom: 5px;
  106. }
  107. .log-response {
  108. background: #f5f7fa;
  109. padding: 10px;
  110. border-radius: 4px;
  111. font-size: 13px;
  112. color: #303133;
  113. white-space: pre-wrap;
  114. word-wrap: break-word;
  115. max-height: 200px;
  116. overflow-y: auto;
  117. margin: 0;
  118. }
  119. </style>