order-timeline.vue 2.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081
  1. <template>
  2. <div class="demo-timeline">
  3. <div v-if="loading" v-loading="loading" style="height: 180px"></div>
  4. <template v-else>
  5. <div v-if="records.length" style="margin-bottom: 10px">{{ title }}</div>
  6. <el-timeline v-if="records.length">
  7. <el-timeline-item
  8. v-for="(item, index) in records"
  9. :key="index"
  10. :timestamp="item.createTime"
  11. :color="item.label"
  12. >
  13. <div style="display: flex; align-items: center; flex-wrap: wrap">
  14. <el-icon :size="14" :color="item.label">
  15. <Flag />
  16. </el-icon>
  17. <span>{{ item.createName }}:</span>
  18. <span>{{ item.remark }}</span>
  19. </div>
  20. </el-timeline-item>
  21. </el-timeline>
  22. <el-empty v-else description="暂无数据" :image-size="80"></el-empty>
  23. </template>
  24. </div>
  25. </template>
  26. <script setup>
  27. import { watch, ref, onMounted } from 'vue';
  28. import request from '@/utils/request';
  29. import { Flag } from '@element-plus/icons-vue';
  30. const props = defineProps({
  31. orderId: {
  32. type: [String, Number],
  33. default: ''
  34. },
  35. title: {
  36. type: String,
  37. default: ''
  38. }
  39. });
  40. const records = ref([]);
  41. const loading = ref(false);
  42. // 添加缓存来存储已获取的数据
  43. const dataCache = ref(new Map());
  44. // 跟踪上一次请求的订单ID,防止重复请求
  45. const lastRequestedOrderId = ref('');
  46. //获取备注
  47. const getRemarks = async (orderId, isRefund = false) => {
  48. if (!orderId || loading.value) return;
  49. // 如果缓存中已有该数据,直接使用缓存
  50. if (dataCache.value.has(orderId)) {
  51. records.value = dataCache.value.get(orderId);
  52. return;
  53. }
  54. // 防止对同一订单ID重复请求
  55. if (lastRequestedOrderId.value === orderId) return;
  56. lastRequestedOrderId.value = orderId;
  57. loading.value = true;
  58. try {
  59. let url = isRefund ? '/order/refund/remark/list' : '/order/remark/list';
  60. const res = await request.get(url, { params: { orderId } });
  61. records.value = res.data.data;
  62. // 缓存结果
  63. dataCache.value.set(orderId, res.data.data);
  64. } catch (error) {
  65. console.error('Failed to fetch remarks:', error);
  66. } finally {
  67. loading.value = false;
  68. }
  69. };
  70. defineExpose({
  71. getRemarks
  72. });
  73. </script>