QuantityDiscountDataDialog.vue 6.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162
  1. <template>
  2. <ele-modal v-model="visible" title="活动详情" width="1000px" :footer="null"
  3. custom-class="quantity-discount-data-dialog">
  4. <div class="">
  5. <!-- Header Info -->
  6. <div class="bg-gray-50 p-4 rounded mb-4 text-sm text-gray-600 flex justify-between items-center">
  7. <div class="space-x-8">
  8. <span>满元/满件</span>
  9. <el-tag size="small">进行中</el-tag>
  10. <span>活动ID:6903135127</span>
  11. <span>活动范围:全店</span>
  12. <span>优惠方式:满元(减钱)</span>
  13. <span>有效时间:2024-10-01 00:00:00 至 2024-11-20 00:00:00</span>
  14. </div>
  15. <div>数据更新时间:2024-10-05</div>
  16. </div>
  17. <!-- Stats Grid -->
  18. <div class="mb-4">
  19. <h3 class="text-base font-medium mb-3">活动累计效果</h3>
  20. <div class="grid grid-cols-4 gap-4 text-center">
  21. <div class="flex flex-col">
  22. <span class="text-gray-500 text-xs mb-1">累计支付订单数</span>
  23. <span class="text-lg font-bold">658</span>
  24. </div>
  25. <div class="flex flex-col">
  26. <span class="text-gray-500 text-xs mb-1">累计支付金额</span>
  27. <span class="text-lg font-bold">658</span>
  28. </div>
  29. <div class="flex flex-col">
  30. <span class="text-gray-500 text-xs mb-1">累计支付件数</span>
  31. <span class="text-lg font-bold">658</span>
  32. </div>
  33. <div class="flex flex-col">
  34. <span class="text-gray-500 text-xs mb-1">累计优惠金额</span>
  35. <span class="text-lg font-bold">658</span>
  36. </div>
  37. </div>
  38. </div>
  39. <!-- Chart Section -->
  40. <div class="border-t pt-4">
  41. <div class="flex justify-between items-center mb-4">
  42. <div class="flex items-center space-x-2">
  43. <el-radio-group v-model="dateRangeType" size="small">
  44. <el-radio-button label="day">日</el-radio-button>
  45. <el-radio-button label="7days">7日</el-radio-button>
  46. <el-radio-button label="30days">30日</el-radio-button>
  47. </el-radio-group>
  48. <el-date-picker v-model="dateRange" type="daterange" range-separator="至"
  49. start-placeholder="开始日期" end-placeholder="结束日期" size="small" style="width: 240px" />
  50. <el-button type="primary" size="small" plain>查询</el-button>
  51. <el-button size="small">重置</el-button>
  52. </div>
  53. <div class="text-xs text-gray-500">统计时间:2024-06-28</div>
  54. </div>
  55. <!-- Metric Tabs -->
  56. <div class="grid grid-cols-6 gap-0 border mb-4">
  57. <div v-for="(metric, index) in metrics" :key="index"
  58. class="p-3 border-r last:border-r-0 cursor-pointer hover:bg-gray-50 transition-colors"
  59. :class="{ 'bg-blue-50 border-b-2 border-b-blue-500': activeMetric === metric.key }"
  60. @click="activeMetric = metric.key">
  61. <div class="text-xs text-gray-500 mb-1">{{ metric.label }}</div>
  62. <div class="text-lg font-bold mb-1">{{ metric.value }}</div>
  63. <div class="text-xs flex items-center">
  64. <span class="text-gray-400 mr-1">较前1日</span>
  65. <span :class="metric.trend > 0 ? 'text-green-500' : 'text-red-500'">
  66. {{ metric.trend > 0 ? '↑' : '↓' }} {{ Math.abs(metric.trend) }}%
  67. </span>
  68. </div>
  69. </div>
  70. </div>
  71. <!-- Chart -->
  72. <div class="h-[300px]">
  73. <BaseChart :option="chartOption" />
  74. </div>
  75. </div>
  76. </div>
  77. </ele-modal>
  78. </template>
  79. <script setup>
  80. import { ref, computed } from 'vue';
  81. import BaseChart from '@/components/Chart/BaseChart.vue';
  82. const props = defineProps({
  83. modelValue: Boolean
  84. });
  85. const emit = defineEmits(['update:modelValue']);
  86. const visible = computed({
  87. get: () => props.modelValue,
  88. set: (val) => emit('update:modelValue', val)
  89. });
  90. const dateRangeType = ref('day');
  91. const dateRange = ref([]);
  92. const activeMetric = ref('orders');
  93. const metrics = ref([
  94. { key: 'orders', label: '支付订单数', value: '658', trend: -48.65 },
  95. { key: 'buyers', label: '支付买家数', value: '658', trend: -48.65 },
  96. { key: 'amount', label: '支付金额', value: '658.68', trend: -48.65 },
  97. { key: 'avgItems', label: '人均支付件数', value: '658', trend: 48.65 },
  98. { key: 'discount', label: '优惠金额', value: '658', trend: 48.65 },
  99. { key: 'price', label: '客单价', value: '658', trend: 48.65 },
  100. ]);
  101. const chartOption = computed(() => {
  102. return {
  103. tooltip: {
  104. trigger: 'axis'
  105. },
  106. grid: {
  107. left: '3%',
  108. right: '4%',
  109. bottom: '3%',
  110. containLabel: true
  111. },
  112. xAxis: {
  113. type: 'category',
  114. boundaryGap: false,
  115. data: ['1月', '2月', '3月', '4月', '5月']
  116. },
  117. yAxis: {
  118. type: 'value'
  119. },
  120. series: [
  121. {
  122. name: metrics.value.find(m => m.key === activeMetric.value)?.label,
  123. type: 'line',
  124. smooth: true,
  125. itemStyle: { color: '#5b8ff9' },
  126. areaStyle: {
  127. color: {
  128. type: 'linear',
  129. x: 0,
  130. y: 0,
  131. x2: 0,
  132. y2: 1,
  133. colorStops: [{
  134. offset: 0, color: 'rgba(91, 143, 249, 0.5)'
  135. }, {
  136. offset: 1, color: 'rgba(91, 143, 249, 0)'
  137. }],
  138. }
  139. },
  140. data: [100, 140, 220, 100, 130] // Mock data
  141. }
  142. ]
  143. };
  144. });
  145. </script>
  146. <style scoped>
  147. :deep(.quantity-discount-data-dialog .el-dialog__header) {
  148. display: none;
  149. }
  150. </style>