瀏覽代碼

feat:update

叶静 4 周之前
父節點
當前提交
61181975fe

+ 119 - 0
src/app/shop/admin/data/adv.json

@@ -0,0 +1,119 @@
+{
+  "code": "200",
+  "data": [
+    {
+      "createName": "admin",
+      "createTime": "2020-01-07 13:30:02",
+      "id": "1",
+      "memo": "商城停留时间统计",
+      "name": "商城停留时间统计",
+      "sections": [],
+      "selected": false,
+      "spectacularsDimensionId": 0,
+      "unitType": 1,
+      "updateName": "",
+      "updateTime": "2020-09-02 10:28:10",
+      "viewType": "line"
+    },
+    {
+      "createName": "admin",
+      "createTime": "2020-01-07 13:30:02",
+      "id": "2",
+      "memo": "种子统计",
+      "name": "种子统计",
+      "sections": [],
+      "selected": false,
+      "spectacularsDimensionId": 0,
+      "unitType": 1,
+      "updateName": "",
+      "updateTime": "2020-09-02 10:28:10",
+      "viewType": "line"
+    },
+    {
+      "createName": "admin",
+      "createTime": "2020-01-07 13:30:02",
+      "id": "3",
+      "memo": "装饰统计",
+      "name": "装饰统计",
+      "sections": [],
+      "selected": false,
+      "spectacularsDimensionId": 0,
+      "unitType": 1,
+      "updateName": "",
+      "updateTime": "2022-08-09 09:15:03",
+      "viewType": "line"
+    },
+    {
+      "createName": "admin",
+      "createTime": "2020-01-07 13:30:02",
+      "id": "4",
+      "memo": "虫子统计",
+      "name": "虫子统计",
+      "sections": [],
+      "selected": false,
+      "spectacularsDimensionId": 0,
+      "unitType": 1,
+      "updateName": "",
+      "updateTime": "2020-09-02 10:28:12",
+      "viewType": "line"
+    },
+    {
+      "createName": "admin",
+      "createTime": "2020-01-07 13:30:02",
+      "id": "17",
+      "memo": "次日留存",
+      "name": "次日留存",
+      "sections": [],
+      "selected": false,
+      "spectacularsDimensionId": 0,
+      "unitType": 2,
+      "updateName": "",
+      "updateTime": "2022-08-09 09:16:40",
+      "viewType": "line"
+    },
+    {
+      "createName": "admin",
+      "createTime": "2020-01-07 13:30:02",
+      "id": "18",
+      "memo": "7日留存",
+      "name": "7日留存",
+      "sections": [],
+      "selected": false,
+      "spectacularsDimensionId": 0,
+      "unitType": 2,
+      "updateName": "",
+      "updateTime": "2022-08-09 09:16:40",
+      "viewType": "line"
+    },
+    {
+      "createName": "admin",
+      "createTime": "2020-01-07 13:30:02",
+      "id": "21",
+      "memo": "入账笔数",
+      "name": "入账笔数",
+      "sections": [],
+      "selected": false,
+      "spectacularsDimensionId": 0,
+      "unitType": 2,
+      "updateName": "",
+      "updateTime": "2022-08-09 09:16:40",
+      "viewType": "line"
+    },
+    {
+      "createName": "admin",
+      "createTime": "2020-01-07 13:30:02",
+      "id": "23",
+      "memo": "出账笔数",
+      "name": "出账笔数",
+      "sections": [],
+      "selected": false,
+      "spectacularsDimensionId": 0,
+      "unitType": 2,
+      "updateName": "",
+      "updateTime": "2022-08-09 09:16:40",
+      "viewType": "line"
+    }
+  ],
+  "message": "SUCCESS",
+  "voice": ""
+}

+ 67 - 21
src/app/shop/admin/data/data.service.js

@@ -1,6 +1,7 @@
 import Content from '@/sheep/layouts/content.vue';
 import { request } from '@/sheep/request';
 import { CRUD } from '@/sheep/request/crud';
+import $storage from '@/sheep/utils/storage';
 
 const route = {
   path: 'data',
@@ -20,6 +21,7 @@ const route = {
     },
   ],
 };
+const userInfo = $storage.get('userInfo');
 
 const api = {
   // 数据报表模块API - 基于OpenAPI定义,添加report前缀
@@ -31,7 +33,7 @@ const api = {
         request({
           url: '/operating/spectaculars/add',
           method: 'POST',
-          data,
+          data: { ...data, userId: userInfo?.id },
         }),
 
       // 删除看板
@@ -43,11 +45,11 @@ const api = {
         }),
 
       // 获取看板列表
-      list: (params) =>
+      list: (data) =>
         request({
           url: '/operating/spectaculars/list',
-          method: 'GET',
-          params,
+          method: 'POST',
+          data: { ...data, userId: userInfo?.id },
         }),
 
       // 更新看板
@@ -55,15 +57,15 @@ const api = {
         request({
           url: '/operating/spectaculars/update',
           method: 'POST',
-          data,
+          data: { ...data, userId: userInfo?.id },
         }),
 
       // 看板详情
-      detail: (id) =>
+      detail: (data) =>
         request({
           url: '/operating/spectaculars/detail',
-          method: 'GET',
-          params: { id },
+          method: 'POST',
+          data: { ...data, userId: userInfo?.id },
         }),
 
       // 获取昨日数据
@@ -71,6 +73,15 @@ const api = {
         request({
           url: '/operating/spectaculars/yesterdayData',
           method: 'GET',
+          params: { userId: userInfo?.id },
+        }),
+
+      // 新增维度视图
+      addView: (spectId) =>
+        request({
+          url: '/operating/spectaculars/addDimensionView',
+          method: 'GET',
+          params: { spectId, userId: userInfo?.id },
         }),
     },
 
@@ -81,7 +92,7 @@ const api = {
         request({
           url: '/operating/spectaculars/addDimension',
           method: 'POST',
-          data,
+          data: { ...data, userId: userInfo?.id },
         }),
 
       // 删除维度
@@ -89,7 +100,7 @@ const api = {
         request({
           url: '/operating/spectaculars/deleteDimension',
           method: 'GET',
-          params: { id },
+          params: { id, userId: userInfo?.id },
         }),
 
       // 更新维度
@@ -97,15 +108,7 @@ const api = {
         request({
           url: '/operating/spectaculars/updateDimension',
           method: 'POST',
-          data,
-        }),
-
-      // 新增维度视图
-      addView: (spectId) =>
-        request({
-          url: '/operating/spectaculars/addDimensionView',
-          method: 'GET',
-          params: { spectId },
+          data: { ...data, userId: userInfo?.id },
         }),
 
       // 获取维度详情
@@ -113,7 +116,7 @@ const api = {
         request({
           url: '/operating/spectaculars/dimensionDetail',
           method: 'GET',
-          params: { id },
+          params: { id, userId: userInfo?.id },
         }),
 
       // 导出维度
@@ -121,7 +124,50 @@ const api = {
         request({
           url: '/operating/spectaculars/exportDimension',
           method: 'GET',
-          params: { id },
+          params: { id, userId: userInfo?.id },
+        }),
+    },
+
+    // 图表管理相关API
+    charts: {
+      // 新增图表
+      add: (data) =>
+        request({
+          url: '/operating/charts/add',
+          method: 'POST',
+          data: { ...data, userId: userInfo?.id },
+        }),
+
+      // 删除图表
+      delete: (id) =>
+        request({
+          url: '/operating/charts/delete',
+          method: 'GET',
+          params: { id, userId: userInfo?.id },
+        }),
+
+      // 获取图表列表
+      list: (data) =>
+        request({
+          url: '/operating/charts/list',
+          method: 'POST',
+          data: { ...data, userId: userInfo?.id },
+        }),
+
+      // 更新图表
+      update: (data) =>
+        request({
+          url: '/operating/charts/update',
+          method: 'POST',
+          data: { ...data, userId: userInfo?.id },
+        }),
+
+      // 图表详情
+      detail: (data) =>
+        request({
+          url: '/operating/charts/detail',
+          method: 'POST',
+          data: { ...data, userId: userInfo?.id },
         }),
     },
   },

+ 0 - 486
src/app/shop/admin/data/report/components/add-chart-modal.vue

@@ -1,486 +0,0 @@
-<template>
-  <el-container>
-    <el-main>
-      <el-form :model="formData" :rules="formRules" ref="formRef" label-width="100px">
-        <!-- 基本信息 -->
-        <div class="section">
-          <h4 class="section-title">基本信息</h4>
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="图表名称" prop="name">
-                <el-input v-model="formData.name" placeholder="请输入图表名称" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="图表类型" prop="type">
-                <el-select v-model="formData.type" placeholder="请选择图表类型" style="width: 100%">
-                  <el-option label="折线图" value="line">
-                    <div class="option-item">
-                      <el-icon><DataLine /></el-icon>
-                      <span>折线图</span>
-                    </div>
-                  </el-option>
-                  <el-option label="柱状图" value="bar">
-                    <div class="option-item">
-                      <el-icon><Histogram /></el-icon>
-                      <span>柱状图</span>
-                    </div>
-                  </el-option>
-                  <el-option label="饼图" value="pie">
-                    <div class="option-item">
-                      <el-icon><PieChart /></el-icon>
-                      <span>饼图</span>
-                    </div>
-                  </el-option>
-                  <el-option label="面积图" value="area">
-                    <div class="option-item">
-                      <el-icon><TrendCharts /></el-icon>
-                      <span>面积图</span>
-                    </div>
-                  </el-option>
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-form-item label="图表描述">
-            <el-input 
-              v-model="formData.description" 
-              type="textarea" 
-              :rows="2"
-              placeholder="请输入图表描述"
-            />
-          </el-form-item>
-        </div>
-
-        <!-- 数据源配置 -->
-        <div class="section">
-          <h4 class="section-title">数据源配置</h4>
-          <el-form-item label="数据源" prop="dataSource">
-            <el-select v-model="formData.dataSource" placeholder="请选择数据源" style="width: 100%">
-              <el-option label="销售数据" value="sales" />
-              <el-option label="订单数据" value="orders" />
-              <el-option label="用户数据" value="users" />
-              <el-option label="商品数据" value="goods" />
-              <el-option label="自定义SQL" value="custom" />
-            </el-select>
-          </el-form-item>
-          
-          <el-form-item label="时间范围" v-if="formData.dataSource">
-            <el-select v-model="formData.timeRange" placeholder="请选择时间范围" style="width: 100%">
-              <el-option label="最近7天" value="7d" />
-              <el-option label="最近30天" value="30d" />
-              <el-option label="最近90天" value="90d" />
-              <el-option label="最近1年" value="1y" />
-              <el-option label="自定义" value="custom" />
-            </el-select>
-          </el-form-item>
-          
-          <el-form-item label="自定义SQL" v-if="formData.dataSource === 'custom'">
-            <el-input 
-              v-model="formData.customSql" 
-              type="textarea" 
-              :rows="4"
-              placeholder="请输入SQL查询语句"
-            />
-          </el-form-item>
-        </div>
-
-        <!-- 图表配置 -->
-        <div class="section">
-          <h4 class="section-title">图表配置</h4>
-          
-          <!-- 折线图/柱状图配置 -->
-          <template v-if="['line', 'bar', 'area'].includes(formData.type)">
-            <el-row :gutter="20">
-              <el-col :span="12">
-                <el-form-item label="X轴字段">
-                  <el-select v-model="formData.config.xAxis" placeholder="请选择X轴字段" style="width: 100%">
-                    <el-option label="日期" value="date" />
-                    <el-option label="月份" value="month" />
-                    <el-option label="分类" value="category" />
-                  </el-select>
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item label="Y轴字段">
-                  <el-select v-model="formData.config.yAxis" placeholder="请选择Y轴字段" style="width: 100%">
-                    <el-option label="销售额" value="amount" />
-                    <el-option label="订单数" value="orders" />
-                    <el-option label="用户数" value="users" />
-                    <el-option label="商品数" value="goods" />
-                  </el-select>
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </template>
-          
-          <!-- 饼图配置 -->
-          <template v-if="formData.type === 'pie'">
-            <el-row :gutter="20">
-              <el-col :span="12">
-                <el-form-item label="分类字段">
-                  <el-select v-model="formData.config.categoryField" placeholder="请选择分类字段" style="width: 100%">
-                    <el-option label="商品分类" value="category" />
-                    <el-option label="用户类型" value="userType" />
-                    <el-option label="订单状态" value="status" />
-                  </el-select>
-                </el-form-item>
-              </el-col>
-              <el-col :span="12">
-                <el-form-item label="数值字段">
-                  <el-select v-model="formData.config.valueField" placeholder="请选择数值字段" style="width: 100%">
-                    <el-option label="销售额" value="amount" />
-                    <el-option label="数量" value="count" />
-                    <el-option label="占比" value="percentage" />
-                  </el-select>
-                </el-form-item>
-              </el-col>
-            </el-row>
-          </template>
-          
-          <!-- 通用配置 -->
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="图表高度">
-                <el-slider 
-                  v-model="formData.config.height" 
-                  :min="200" 
-                  :max="600" 
-                  :step="50"
-                  :marks="{ 200: '200px', 300: '300px', 400: '400px', 500: '500px', 600: '600px' }"
-                  show-input
-                />
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="显示图例">
-                <el-switch v-model="formData.config.showLegend" />
-              </el-form-item>
-            </el-col>
-          </el-row>
-          
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="显示网格">
-                <el-switch v-model="formData.config.showGrid" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="数据标签">
-                <el-switch v-model="formData.config.showDataLabels" />
-              </el-form-item>
-            </el-col>
-          </el-row>
-        </div>
-
-        <!-- 样式配置 -->
-        <div class="section">
-          <h4 class="section-title">样式配置</h4>
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="主题色">
-                <el-color-picker v-model="formData.config.primaryColor" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="背景色">
-                <el-color-picker v-model="formData.config.backgroundColor" />
-              </el-form-item>
-            </el-col>
-          </el-row>
-        </div>
-      </el-form>
-
-      <!-- 预览区域 -->
-      <div class="section">
-        <h4 class="section-title">图表预览</h4>
-        <div class="chart-preview">
-          <div class="preview-container" v-loading="previewLoading">
-            <v-chart :option="previewOption" autoresize :style="{ height: formData.config.height + 'px' }" />
-          </div>
-        </div>
-      </div>
-    </el-main>
-    <el-footer class="sa-footer--submit">
-      <el-button @click="handleCancel">取消</el-button>
-      <el-button @click="handlePreview" :loading="previewLoading">
-        预览图表
-      </el-button>
-      <el-button type="primary" @click="handleConfirm" :loading="saving">
-        保存图表
-      </el-button>
-    </el-footer>
-  </el-container>
-</template>
-
-<script setup>
-import { ref, reactive, computed, watch, onMounted } from 'vue';
-import { ElMessage } from 'element-plus';
-import {
-  DataLine,
-  Histogram,
-  PieChart,
-  TrendCharts
-} from '@element-plus/icons-vue';
-import VChart from 'vue-echarts';
-import { use } from 'echarts/core';
-import {
-  CanvasRenderer
-} from 'echarts/renderers';
-import {
-  LineChart,
-  BarChart,
-  PieChart as EChartsPieChart
-} from 'echarts/charts';
-import {
-  TitleComponent,
-  TooltipComponent,
-  LegendComponent,
-  GridComponent
-} from 'echarts/components';
-
-use([
-  CanvasRenderer,
-  LineChart,
-  BarChart,
-  EChartsPieChart,
-  TitleComponent,
-  TooltipComponent,
-  LegendComponent,
-  GridComponent
-]);
-
-const props = defineProps({
-  chartData: {
-    type: Object,
-    default: () => ({})
-  }
-});
-
-const emit = defineEmits(['confirm', 'cancel']);
-
-// 响应式数据
-const formRef = ref();
-const saving = ref(false);
-const previewLoading = ref(false);
-
-const formData = reactive({
-  name: '',
-  type: 'line',
-  description: '',
-  dataSource: '',
-  timeRange: '30d',
-  customSql: '',
-  config: {
-    xAxis: '',
-    yAxis: '',
-    categoryField: '',
-    valueField: '',
-    height: 300,
-    showLegend: true,
-    showGrid: true,
-    showDataLabels: false,
-    primaryColor: '#409eff',
-    backgroundColor: '#ffffff'
-  }
-});
-
-const formRules = {
-  name: [
-    { required: true, message: '请输入图表名称', trigger: 'blur' },
-    { min: 2, max: 30, message: '长度在 2 到 30 个字符', trigger: 'blur' }
-  ],
-  type: [
-    { required: true, message: '请选择图表类型', trigger: 'change' }
-  ],
-  dataSource: [
-    { required: true, message: '请选择数据源', trigger: 'change' }
-  ]
-};
-
-// 预览图表配置
-const previewOption = ref({});
-
-// 方法
-const handleCancel = () => {
-  emit('cancel');
-};
-
-const handleConfirm = async () => {
-  try {
-    await formRef.value.validate();
-    
-    saving.value = true;
-    
-    // 模拟保存操作
-    await new Promise(resolve => setTimeout(resolve, 500));
-    
-    const chartData = {
-      id: Date.now().toString(),
-      ...formData,
-      createTime: new Date().toISOString()
-    };
-    
-    emit('confirm', chartData);
-    ElMessage.success('图表保存成功');
-    
-  } catch (error) {
-    console.error('表单验证失败:', error);
-  } finally {
-    saving.value = false;
-  }
-};
-
-const handlePreview = async () => {
-  try {
-    previewLoading.value = true;
-    await generatePreview();
-    ElMessage.success('预览生成成功');
-  } catch (error) {
-    ElMessage.error('预览生成失败');
-  } finally {
-    previewLoading.value = false;
-  }
-};
-
-const generatePreview = async () => {
-  // 模拟数据生成
-  const mockData = generateMockData();
-  
-  if (formData.type === 'pie') {
-    previewOption.value = {
-      backgroundColor: formData.config.backgroundColor,
-      tooltip: {
-        trigger: 'item',
-        formatter: '{a} <br/>{b}: {c} ({d}%)'
-      },
-      legend: formData.config.showLegend ? {
-        orient: 'vertical',
-        left: 'left'
-      } : undefined,
-      series: [
-        {
-          name: formData.name || '图表数据',
-          type: 'pie',
-          radius: '50%',
-          data: mockData.pieData,
-          label: {
-            show: formData.config.showDataLabels
-          },
-          itemStyle: {
-            color: formData.config.primaryColor
-          }
-        }
-      ]
-    };
-  } else {
-    previewOption.value = {
-      backgroundColor: formData.config.backgroundColor,
-      tooltip: {
-        trigger: 'axis'
-      },
-      legend: formData.config.showLegend ? {
-        data: [formData.name || '数据']
-      } : undefined,
-      grid: formData.config.showGrid ? {
-        left: '3%',
-        right: '4%',
-        bottom: '3%',
-        containLabel: true
-      } : undefined,
-      xAxis: {
-        type: 'category',
-        data: mockData.xAxisData
-      },
-      yAxis: {
-        type: 'value'
-      },
-      series: [
-        {
-          name: formData.name || '数据',
-          type: formData.type,
-          data: mockData.seriesData,
-          label: {
-            show: formData.config.showDataLabels
-          },
-          itemStyle: {
-            color: formData.config.primaryColor
-          },
-          areaStyle: formData.type === 'area' ? {} : undefined
-        }
-      ]
-    };
-  }
-};
-
-const generateMockData = () => {
-  const days = Array.from({ length: 7 }, (_, i) => `${i + 1}日`);
-  const values = Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000) + 100);
-  
-  return {
-    xAxisData: days,
-    seriesData: values,
-    pieData: [
-      { value: 335, name: '类别1' },
-      { value: 310, name: '类别2' },
-      { value: 234, name: '类别3' },
-      { value: 135, name: '类别4' }
-    ]
-  };
-};
-
-// 监听器
-watch(() => props.chartData, (newVal) => {
-  if (newVal) {
-    Object.assign(formData, newVal);
-  }
-}, { immediate: true });
-
-watch(() => [formData.type, formData.config.primaryColor, formData.config.backgroundColor], () => {
-  if (formData.type) {
-    handlePreview();
-  }
-}, { deep: true });
-
-// 初始化预览
-onMounted(() => {
-  handlePreview();
-});
-</script>
-
-<style scoped>
-.section {
-  margin-bottom: 24px;
-  
-  .section-title {
-    font-size: 16px;
-    font-weight: 600;
-    color: #303133;
-    margin: 0 0 16px 0;
-  }
-}
-
-.option-item {
-  display: flex;
-  align-items: center;
-  gap: 8px;
-}
-
-.chart-preview {
-  .preview-container {
-    border: 1px solid #e4e7ed;
-    border-radius: 8px;
-    padding: 16px;
-    background: #fafafa;
-  }
-}
-
-.sa-footer--submit {
-  display: flex;
-  justify-content: flex-end;
-  gap: 12px;
-  padding: 16px 24px;
-  border-top: 1px solid #e4e7ed;
-  background: #fafafa;
-}
-</style>

+ 0 - 362
src/app/shop/admin/data/report/components/add-dashboard-modal.vue

@@ -1,362 +0,0 @@
-<template>
-  <el-container>
-    <el-main>
-      <!-- 看板基本信息 -->
-      <div class="section">
-        <h4 class="section-title">基本信息</h4>
-        <el-form :model="formData" :rules="formRules" ref="formRef" label-width="100px">
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="看板名称" prop="name">
-                <el-input v-model="formData.name" placeholder="请输入看板名称" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="看板类型" prop="type">
-                <el-select v-model="formData.type" placeholder="请选择看板类型" style="width: 100%">
-                  <el-option label="销售看板" value="sales" />
-                  <el-option label="用户看板" value="user" />
-                  <el-option label="订单看板" value="order" />
-                  <el-option label="商品看板" value="goods" />
-                  <el-option label="自定义看板" value="custom" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-form-item label="看板描述" prop="description">
-            <el-input 
-              v-model="formData.description" 
-              type="textarea" 
-              :rows="3"
-              placeholder="请输入看板描述"
-            />
-          </el-form-item>
-        </el-form>
-      </div>
-
-      <!-- 图表配置 -->
-      <div class="section">
-        <div class="section-header">
-          <h4 class="section-title">图表配置</h4>
-          <el-button type="primary" size="small" @click="addChart">
-            <el-icon><Plus /></el-icon>
-            添加图表
-          </el-button>
-        </div>
-        
-        <div class="charts-list" v-if="formData.charts.length > 0">
-          <div 
-            v-for="(chart, index) in formData.charts" 
-            :key="index"
-            class="chart-item"
-          >
-            <div class="chart-info">
-              <div class="chart-icon">
-                <el-icon v-if="chart.type === 'line'"><DataLine /></el-icon>
-                <el-icon v-else-if="chart.type === 'bar'"><Histogram /></el-icon>
-                <el-icon v-else-if="chart.type === 'pie'"><PieChart /></el-icon>
-                <el-icon v-else><TrendCharts /></el-icon>
-              </div>
-              <div class="chart-details">
-                <div class="chart-name">{{ chart.name || '未命名图表' }}</div>
-                <div class="chart-type">{{ getChartTypeLabel(chart.type) }}</div>
-              </div>
-            </div>
-            <div class="chart-actions">
-              <el-button size="small" @click="editChart(index)">
-                <el-icon><Edit /></el-icon>
-                编辑
-              </el-button>
-              <el-button size="small" type="danger" @click="removeChart(index)">
-                <el-icon><Delete /></el-icon>
-                删除
-              </el-button>
-            </div>
-          </div>
-        </div>
-        
-        <el-empty v-else description="暂无图表,请添加图表" />
-      </div>
-
-      <!-- 布局配置 -->
-      <div class="section">
-        <h4 class="section-title">布局配置</h4>
-        <el-form :model="formData" label-width="100px">
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="列数">
-                <el-select v-model="formData.layout.columns" style="width: 100%">
-                  <el-option label="1列" :value="1" />
-                  <el-option label="2列" :value="2" />
-                  <el-option label="3列" :value="3" />
-                  <el-option label="4列" :value="4" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="间距">
-                <el-slider 
-                  v-model="formData.layout.gap" 
-                  :min="0" 
-                  :max="40" 
-                  :step="4"
-                  show-input
-                />
-              </el-form-item>
-            </el-col>
-          </el-row>
-          <el-row :gutter="20">
-            <el-col :span="12">
-              <el-form-item label="自动刷新">
-                <el-switch v-model="formData.layout.autoRefresh" />
-              </el-form-item>
-            </el-col>
-            <el-col :span="12">
-              <el-form-item label="刷新间隔" v-if="formData.layout.autoRefresh">
-                <el-select v-model="formData.layout.refreshInterval" style="width: 100%">
-                  <el-option label="30秒" :value="30" />
-                  <el-option label="1分钟" :value="60" />
-                  <el-option label="5分钟" :value="300" />
-                  <el-option label="10分钟" :value="600" />
-                </el-select>
-              </el-form-item>
-            </el-col>
-          </el-row>
-        </el-form>
-      </div>
-    </el-main>
-    <el-footer class="sa-footer--submit">
-      <el-button @click="handleCancel">取消</el-button>
-      <el-button type="primary" @click="handleConfirm" :loading="saving">
-        保存看板
-      </el-button>
-    </el-footer>
-  </el-container>
-</template>
-
-<script setup>
-import { ref, reactive } from 'vue';
-import { ElMessage } from 'element-plus';
-import {
-  Plus,
-  Edit,
-  Delete,
-  TrendCharts,
-  PieChart,
-  DataLine,
-  Histogram
-} from '@element-plus/icons-vue';
-import { useModal } from '@/sheep/components/sa-modal/sa-modal.vue';
-import AddChartModal from './add-chart-modal.vue';
-
-const props = defineProps({
-  dashboardData: {
-    type: Object,
-    default: () => ({})
-  }
-});
-
-const emit = defineEmits(['confirm', 'cancel']);
-
-// 响应式数据
-const formRef = ref();
-const saving = ref(false);
-
-const formData = reactive({
-  name: '',
-  type: 'sales',
-  description: '',
-  charts: [],
-  layout: {
-    columns: 2,
-    gap: 16,
-    autoRefresh: false,
-    refreshInterval: 300
-  }
-});
-
-const formRules = {
-  name: [
-    { required: true, message: '请输入看板名称', trigger: 'blur' },
-    { min: 2, max: 30, message: '长度在 2 到 30 个字符', trigger: 'blur' }
-  ],
-  type: [
-    { required: true, message: '请选择看板类型', trigger: 'change' }
-  ],
-  description: [
-    { required: true, message: '请输入看板描述', trigger: 'blur' }
-  ]
-};
-
-// 方法
-const handleCancel = () => {
-  emit('cancel');
-};
-
-const handleConfirm = async () => {
-  try {
-    await formRef.value.validate();
-    
-    if (formData.charts.length === 0) {
-      ElMessage.warning('请至少添加一个图表');
-      return;
-    }
-    
-    saving.value = true;
-    
-    // 模拟保存操作
-    await new Promise(resolve => setTimeout(resolve, 1000));
-    
-    const dashboardData = {
-      id: Date.now().toString(),
-      ...formData,
-      createTime: new Date().toISOString()
-    };
-    
-    emit('confirm', dashboardData);
-    ElMessage.success('看板创建成功');
-    
-  } catch (error) {
-    console.error('表单验证失败:', error);
-  } finally {
-    saving.value = false;
-  }
-};
-
-const addChart = () => {
-  useModal(() => import('./add-chart-modal.vue'), {
-    title: '添加图表',
-    width: '80%',
-    height: '80vh',
-    componentProps: {
-      chartData: {}
-    },
-    confirm: (modalRef) => {
-      formData.charts.push({ ...modalRef.chartData });
-      ElMessage.success('图表添加成功');
-      return true;
-    }
-  });
-};
-
-const editChart = (index) => {
-  useModal(() => import('./add-chart-modal.vue'), {
-    title: '编辑图表',
-    width: '80%',
-    height: '80vh',
-    componentProps: {
-      chartData: { ...formData.charts[index] }
-    },
-    confirm: (modalRef) => {
-      formData.charts[index] = { ...modalRef.chartData };
-      ElMessage.success('图表更新成功');
-      return true;
-    }
-  });
-};
-
-const removeChart = (index) => {
-  formData.charts.splice(index, 1);
-  ElMessage.success('图表删除成功');
-};
-
-const getChartTypeLabel = (type) => {
-  const typeMap = {
-    line: '折线图',
-    bar: '柱状图',
-    pie: '饼图',
-    area: '面积图'
-  };
-  return typeMap[type] || '未知类型';
-};
-
-// 初始化数据
-if (props.dashboardData && Object.keys(props.dashboardData).length > 0) {
-  Object.assign(formData, props.dashboardData);
-}
-</script>
-
-<style scoped>
-.section {
-  margin-bottom: 32px;
-  
-  .section-title {
-    font-size: 16px;
-    font-weight: 600;
-    color: #303133;
-    margin: 0 0 16px 0;
-  }
-  
-  .section-header {
-    display: flex;
-    justify-content: space-between;
-    align-items: center;
-    margin-bottom: 16px;
-    
-    .section-title {
-      margin: 0;
-    }
-  }
-}
-
-.charts-list {
-  display: flex;
-  flex-direction: column;
-  gap: 12px;
-  
-  .chart-item {
-    display: flex;
-    align-items: center;
-    justify-content: space-between;
-    padding: 16px;
-    border: 1px solid #e4e7ed;
-    border-radius: 8px;
-    background: #fafafa;
-    
-    .chart-info {
-      display: flex;
-      align-items: center;
-      gap: 12px;
-      
-      .chart-icon {
-        width: 40px;
-        height: 40px;
-        display: flex;
-        align-items: center;
-        justify-content: center;
-        background: #f0f9ff;
-        border-radius: 8px;
-        color: #409eff;
-        font-size: 20px;
-      }
-      
-      .chart-details {
-        .chart-name {
-          font-weight: 600;
-          color: #303133;
-          margin-bottom: 4px;
-        }
-        
-        .chart-type {
-          font-size: 12px;
-          color: #909399;
-        }
-      }
-    }
-    
-    .chart-actions {
-      display: flex;
-      gap: 8px;
-    }
-  }
-}
-
-.sa-footer--submit {
-  display: flex;
-  justify-content: flex-end;
-  gap: 12px;
-  padding: 16px 24px;
-  border-top: 1px solid #e4e7ed;
-  background: #fafafa;
-}
-</style>

+ 0 - 105
src/app/shop/admin/data/report/components/add-report-modal.vue

@@ -1,105 +0,0 @@
-<template>
-  <div class="add-report-modal">
-    <el-form ref="formRef" :model="form" :rules="rules" label-width="100px">
-      <el-form-item label="报表名称" prop="name">
-        <el-input v-model="form.name" placeholder="请输入报表名称" />
-      </el-form-item>
-      <el-form-item label="报表描述" prop="description">
-        <el-input 
-          v-model="form.description" 
-          type="textarea" 
-          :rows="3" 
-          placeholder="请输入报表描述" 
-        />
-      </el-form-item>
-      <el-form-item label="报表类型" prop="type">
-        <el-select v-model="form.type" placeholder="请选择报表类型" style="width: 100%">
-          <el-option label="销售报表" value="sales" />
-          <el-option label="用户报表" value="user" />
-          <el-option label="财务报表" value="finance" />
-          <el-option label="运营报表" value="operation" />
-        </el-select>
-      </el-form-item>
-    </el-form>
-  </div>
-</template>
-
-<script setup>
-import { ref, reactive, watch } from 'vue'
-import { ElMessage } from 'element-plus'
-
-const props = defineProps({
-  title: {
-    type: String,
-    default: '新增报表'
-  },
-  type: {
-    type: String,
-    default: 'add'
-  },
-  reportData: {
-    type: Object,
-    default: () => ({})
-  }
-})
-
-const emit = defineEmits(['confirm'])
-
-const formRef = ref()
-const form = reactive({
-  name: '',
-  description: '',
-  type: ''
-})
-
-const rules = {
-  name: [
-    { required: true, message: '请输入报表名称', trigger: 'blur' },
-    { min: 2, max: 50, message: '长度在 2 到 50 个字符', trigger: 'blur' }
-  ],
-  description: [
-    { required: true, message: '请输入报表描述', trigger: 'blur' }
-  ],
-  type: [
-    { required: true, message: '请选择报表类型', trigger: 'change' }
-  ]
-}
-
-// 监听props变化,初始化表单数据
-watch(() => props.reportData, (newData) => {
-  if (newData && Object.keys(newData).length > 0) {
-    Object.assign(form, newData)
-  }
-}, { immediate: true, deep: true })
-
-// 表单验证和提交
-const handleConfirm = async () => {
-  try {
-    await formRef.value.validate()
-    emit('confirm', { ...form })
-    return true
-  } catch (error) {
-    ElMessage.error('请完善表单信息')
-    return false
-  }
-}
-
-// 暴露给父组件的方法
-defineExpose({
-  handleConfirm
-})
-</script>
-
-<style scoped>
-.add-report-modal {
-  padding: 20px;
-}
-
-.el-form {
-  max-width: 500px;
-}
-
-.el-form-item {
-  margin-bottom: 20px;
-}
-</style>

+ 451 - 0
src/app/shop/admin/data/report/components/chartEdit.vue

@@ -0,0 +1,451 @@
+<template>
+  <div class="chart-edit-container">
+    <!-- 图表类型选择 -->
+    <div class="chart-type-selector">
+      <div class="chart-type-item" 
+           :class="{ active: selectedChartType === 'line' }"
+           @click="selectedChartType = 'line'">
+        <i class="el-icon-data-line"></i>
+        <span>折线图</span>
+      </div>
+      <div class="chart-type-item" 
+           :class="{ active: selectedChartType === 'bar' }"
+           @click="selectedChartType = 'bar'">
+        <i class="el-icon-data-board"></i>
+        <span>柱状图</span>
+      </div>
+      <div class="chart-type-item" 
+           :class="{ active: selectedChartType === 'pie' }"
+           @click="selectedChartType = 'pie'">
+        <i class="el-icon-pie-chart"></i>
+        <span>饼图</span>
+      </div>
+    </div>
+
+    <!-- 主要内容区域 -->
+    <div class="chart-content">
+      <!-- 左侧图表列表 -->
+      <div class="chart-list-panel">
+        <div class="search-box">
+          <el-input 
+            v-model="searchKeyword" 
+            placeholder="搜索图表名称"
+            prefix-icon="el-icon-search"
+            clearable
+            @input="filterCharts"
+          />
+        </div>
+        <div class="chart-list" v-loading="chartListLoading">
+          <div 
+            v-for="chart in filteredCharts" 
+            :key="chart.id"
+            class="chart-item"
+            :class="{ active: selectedChart?.id === chart.id }"
+            @click="selectChart(chart)"
+          >
+            <div class="chart-icon">
+              <i class="el-icon-data-analysis"></i>
+            </div>
+            <div class="chart-info">
+              <div class="chart-name">{{ chart.name }}</div>
+              <div class="chart-memo">{{ chart.memo }}</div>
+            </div>
+          </div>
+        </div>
+      </div>
+
+      <!-- 右侧预览区域 -->
+      <div class="chart-preview-panel">
+        <div v-if="!selectedChart" class="empty-preview">
+          <i class="el-icon-data-analysis"></i>
+          <p>请选择左侧图表查看预览</p>
+        </div>
+        <div v-else class="preview-content">
+          <div class="preview-header">
+            <h3>{{ selectedChart.name }}</h3>
+            <p>{{ selectedChart.memo }}</p>
+          </div>
+          <div class="preview-chart">
+            <!-- 这里可以放置图表预览组件 -->
+            <div class="chart-placeholder">
+              <i class="el-icon-data-line" v-if="selectedChartType === 'line'"></i>
+              <i class="el-icon-data-board" v-else-if="selectedChartType === 'bar'"></i>
+              <i class="el-icon-pie-chart" v-else-if="selectedChartType === 'pie'"></i>
+              <p>{{ selectedChartType === 'line' ? '折线图' : selectedChartType === 'bar' ? '柱状图' : '饼图' }}预览</p>
+            </div>
+          </div>
+        </div>
+      </div>
+    </div>
+
+    <!-- 底部操作按钮 -->
+    <div class="chart-actions">
+      <el-button @click="cancel">取消</el-button>
+      <el-button type="primary" @click="confirm" :disabled="!selectedChart">确认</el-button>
+    </div>
+  </div>
+</template>
+
+<script setup>
+import { computed, onMounted, ref } from 'vue';
+import { ElMessage } from 'element-plus';
+import { api } from '../../data.service.js';
+
+const props = defineProps({
+  modal: {
+    type: Object,
+    default: () => ({})
+  }
+});
+
+const emit = defineEmits(['modalCallBack']);
+
+// 响应式数据
+const chartListLoading = ref(false);
+const chartList = ref([]);
+const selectedChart = ref(null);
+const selectedChartType = ref('line'); // 默认选择折线图
+const searchKeyword = ref('');
+
+// 过滤后的图表列表
+const filteredCharts = computed(() => {
+  if (!searchKeyword.value) {
+    return chartList.value;
+  }
+  return chartList.value.filter(chart => 
+    chart.name.toLowerCase().includes(searchKeyword.value.toLowerCase()) ||
+    chart.memo.toLowerCase().includes(searchKeyword.value.toLowerCase())
+  );
+});
+
+// 获取可选图表列表
+async function getChartList() {
+  try {
+    chartListLoading.value = true;
+    const spectId = props.modal.params.spectId;
+    if (!spectId) {
+      ElMessage.error('缺少看板ID参数');
+      return;
+    }
+    
+    const { code, data } = await api.report.spectaculars.addView(spectId);
+    if (code === '200') {
+      chartList.value = data || [];
+    } else {
+      ElMessage.error('获取图表列表失败');
+    }
+  } catch (error) {
+    console.error('获取图表列表失败:', error);
+    ElMessage.error('获取图表列表失败');
+  } finally {
+    chartListLoading.value = false;
+  }
+}
+
+// 选择图表
+function selectChart(chart) {
+  selectedChart.value = chart;
+}
+
+// 过滤图表
+function filterCharts() {
+  // 搜索逻辑已通过computed实现
+}
+
+// 取消操作
+function cancel() {
+  emit('modalCallBack', { event: 'cancel' });
+}
+
+// 确认添加图表
+async function confirm() {
+  if (!selectedChart.value) {
+    ElMessage.warning('请选择一个图表');
+    return;
+  }
+
+  try {
+    const spectId = props.modal.params.spectId;
+    const submitData = {
+      id: spectId,
+      dimensions: [
+        {
+          dimensionId: selectedChart.value.id,
+          viewType: selectedChartType.value
+        }
+      ]
+    };
+
+    const { code } = await api.report.spectaculars.dimensions.add(submitData);
+    if (code === '200') {
+      ElMessage.success('添加图表成功');
+      emit('modalCallBack', { event: 'confirm' });
+    } else {
+      ElMessage.error('添加图表失败');
+    }
+  } catch (error) {
+    console.error('添加图表失败:', error);
+    ElMessage.error('添加图表失败');
+  }
+}
+
+// 初始化
+async function init() {
+  await getChartList();
+}
+
+onMounted(() => {
+  init();
+});
+</script>
+
+<style scoped>
+.chart-edit-container {
+  display: flex;
+  flex-direction: column;
+  height: 600px;
+  background: #fff;
+}
+
+/* 图表类型选择器 */
+.chart-type-selector {
+  display: flex;
+  justify-content: center;
+  gap: 20px;
+  padding: 20px;
+  border-bottom: 1px solid #e4e7ed;
+  background: #f8f9fa;
+}
+
+.chart-type-item {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 8px;
+  padding: 16px 24px;
+  border: 2px solid #e4e7ed;
+  border-radius: 8px;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  background: #fff;
+  min-width: 80px;
+}
+
+.chart-type-item:hover {
+  border-color: #409eff;
+  box-shadow: 0 2px 8px rgba(64, 158, 255, 0.2);
+}
+
+.chart-type-item.active {
+  border-color: #409eff;
+  background: #ecf5ff;
+  color: #409eff;
+}
+
+.chart-type-item i {
+  font-size: 24px;
+}
+
+.chart-type-item span {
+  font-size: 14px;
+  font-weight: 500;
+}
+
+/* 主要内容区域 */
+.chart-content {
+  display: flex;
+  flex: 1;
+  overflow: hidden;
+}
+
+/* 左侧图表列表 */
+.chart-list-panel {
+  width: 300px;
+  border-right: 1px solid #e4e7ed;
+  display: flex;
+  flex-direction: column;
+}
+
+.search-box {
+  padding: 16px;
+  border-bottom: 1px solid #e4e7ed;
+}
+
+.chart-list {
+  flex: 1;
+  overflow-y: auto;
+  padding: 8px;
+}
+
+.chart-item {
+  display: flex;
+  align-items: center;
+  gap: 12px;
+  padding: 12px;
+  border: 1px solid #e4e7ed;
+  border-radius: 6px;
+  margin-bottom: 8px;
+  cursor: pointer;
+  transition: all 0.3s ease;
+  background: #fff;
+}
+
+.chart-item:hover {
+  border-color: #409eff;
+  box-shadow: 0 2px 8px rgba(64, 158, 255, 0.1);
+}
+
+.chart-item.active {
+  border-color: #409eff;
+  background: #ecf5ff;
+}
+
+.chart-icon {
+  width: 40px;
+  height: 40px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  background: #f0f2f5;
+  border-radius: 6px;
+  color: #606266;
+}
+
+.chart-item.active .chart-icon {
+  background: #409eff;
+  color: #fff;
+}
+
+.chart-icon i {
+  font-size: 18px;
+}
+
+.chart-info {
+  flex: 1;
+  min-width: 0;
+}
+
+.chart-name {
+  font-size: 14px;
+  font-weight: 500;
+  color: #303133;
+  margin-bottom: 4px;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+.chart-memo {
+  font-size: 12px;
+  color: #909399;
+  overflow: hidden;
+  text-overflow: ellipsis;
+  white-space: nowrap;
+}
+
+/* 右侧预览区域 */
+.chart-preview-panel {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  background: #fafafa;
+}
+
+.empty-preview {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  justify-content: center;
+  color: #909399;
+}
+
+.empty-preview i {
+  font-size: 48px;
+  margin-bottom: 16px;
+}
+
+.empty-preview p {
+  font-size: 14px;
+  margin: 0;
+}
+
+.preview-content {
+  flex: 1;
+  display: flex;
+  flex-direction: column;
+  padding: 20px;
+}
+
+.preview-header {
+  margin-bottom: 20px;
+}
+
+.preview-header h3 {
+  margin: 0 0 8px 0;
+  font-size: 18px;
+  color: #303133;
+}
+
+.preview-header p {
+  margin: 0;
+  font-size: 14px;
+  color: #606266;
+}
+
+.preview-chart {
+  flex: 1;
+  background: #fff;
+  border: 1px solid #e4e7ed;
+  border-radius: 8px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+}
+
+.chart-placeholder {
+  display: flex;
+  flex-direction: column;
+  align-items: center;
+  gap: 16px;
+  color: #909399;
+}
+
+.chart-placeholder i {
+  font-size: 64px;
+}
+
+.chart-placeholder p {
+  margin: 0;
+  font-size: 16px;
+}
+
+/* 底部操作按钮 */
+.chart-actions {
+  display: flex;
+  justify-content: flex-end;
+  gap: 12px;
+  padding: 16px 20px;
+  border-top: 1px solid #e4e7ed;
+  background: #fff;
+}
+
+/* 滚动条样式 */
+.chart-list::-webkit-scrollbar {
+  width: 6px;
+}
+
+.chart-list::-webkit-scrollbar-track {
+  background: #f1f1f1;
+  border-radius: 3px;
+}
+
+.chart-list::-webkit-scrollbar-thumb {
+  background: #c1c1c1;
+  border-radius: 3px;
+}
+
+.chart-list::-webkit-scrollbar-thumb:hover {
+  background: #a8a8a8;
+}
+</style>

+ 0 - 584
src/app/shop/admin/data/report/components/dashboard-tabs.vue

@@ -1,584 +0,0 @@
-<template>
-  <div class="dashboard-tabs report-container">
-    <!-- 标签页头部 -->
-    <div class="tabs-header">
-      <el-tabs v-model="activeTab" type="card" @tab-change="handleTabChange" @tab-remove="handleTabRemove">
-        <el-tab-pane
-          v-for="tab in tabs"
-          :key="tab.id"
-          :label="tab.name"
-          :name="tab.id"
-          :closable="tabs.length > 1"
-        >
-        </el-tab-pane>
-        <template #addIcon>
-          <el-button type="primary" size="small" @click="addReport">
-            <el-icon><Plus /></el-icon>
-            新增报表
-          </el-button>
-        </template>
-      </el-tabs>
-    </div>
-
-    <!-- 标签页内容 -->
-    <div class="tabs-content">
-      <div v-for="tab in tabs" :key="tab.id" v-show="activeTab === tab.id" class="tab-pane">
-        <!-- 报表操作栏 -->
-        <div class="report-actions">
-          <div class="left-actions">
-            <h3 class="report-title">{{ tab.name }}</h3>
-            <span class="report-desc">{{ tab.description }}</span>
-          </div>
-          <div class="right-actions">
-            <el-button size="small" @click="refreshReport(tab.id)" class="sa-button-refresh">
-              <el-icon><Refresh /></el-icon>
-              刷新数据
-            </el-button>
-            <el-button size="small" @click="editReport(tab)">
-              <el-icon><Edit /></el-icon>
-              编辑
-            </el-button>
-            <el-button size="small" type="danger" @click="deleteReport(tab.id)" :disabled="tabs.length <= 1">
-              <el-icon><Delete /></el-icon>
-              删除
-            </el-button>
-            <el-button size="small" @click="exportReport(tab.id)">
-              <el-icon><Download /></el-icon>
-              导出报表
-            </el-button>
-          </div>
-        </div>
-
-        <!-- 报表内容 -->
-        <div class="report-content" v-loading="tab.loading">
-          <!-- 统计卡片 -->
-          <div class="stats-cards" v-if="tab.stats">
-            <div class="stats-card" v-for="(stat, index) in tab.stats" :key="index">
-              <div class="stats-content">
-                <div class="stats-icon" :class="stat.type || 'primary'">
-                  <el-icon :size="24">
-                    <component :is="stat.icon" />
-                  </el-icon>
-                </div>
-                <div class="stats-info">
-                  <div class="stats-value">{{ stat.value }}</div>
-                  <div class="stats-label">{{ stat.label }}</div>
-                </div>
-                <div class="stats-trend" v-if="stat.trend" :class="stat.trend > 0 ? 'positive' : 'negative'">
-                  <el-icon :size="12">
-                    <ArrowUp v-if="stat.trend > 0" />
-                    <ArrowDown v-else />
-                  </el-icon>
-                  <span>{{ Math.abs(stat.trend) }}%</span>
-                </div>
-              </div>
-            </div>
-          </div>
-
-          <!-- 图表区域 -->
-          <div class="chart-area" v-if="tab.chartData">
-            <div class="chart-header">
-              <h4 class="chart-title">{{ tab.chartTitle || '数据趋势' }}</h4>
-              <div class="chart-controls">
-                <el-radio-group v-model="tab.chartType" size="small" @change="updateChart(tab.id)">
-                  <el-radio-button label="line">折线图</el-radio-button>
-              <el-radio-button label="bar">柱状图</el-radio-button>
-              <el-radio-button label="pie">饼图</el-radio-button>
-                </el-radio-group>
-              </div>
-            </div>
-            <div class="chart-container">
-              <v-chart :option="tab.chartOption" autoresize style="height: 400px;" />
-            </div>
-          </div>
-
-          <!-- 数据表格 -->
-          <div class="table-area" v-if="tab.tableData">
-            <div class="table-header">
-              <h4 class="table-title">详细数据</h4>
-              <div class="table-actions">
-                <el-input
-                  v-model="tab.searchKeyword"
-                  placeholder="搜索"
-                  size="small"
-                  style="width: 200px;"
-                  @input="searchTable(tab.id)"
-                >
-                  <template #prefix>
-                    <el-icon><Search /></el-icon>
-                  </template>
-                </el-input>
-              </div>
-            </div>
-            <div class="table-content">
-              <el-table :data="tab.filteredTableData || tab.tableData" stripe border>
-                <el-table-column
-                  v-for="column in tab.tableColumns"
-                  :key="column.prop"
-                  :prop="column.prop"
-                  :label="column.label"
-                  :width="column.width"
-                  :min-width="column.minWidth"
-                  :align="column.align || 'center'"
-                  :sortable="column.sortable"
-                >
-                  <template #default="{ row }">
-                    <span v-if="column.formatter" v-html="column.formatter(row[column.prop], row)"></span>
-                    <span v-else>{{ row[column.prop] }}</span>
-                  </template>
-                </el-table-column>
-              </el-table>
-            </div>
-          </div>
-        </div>
-      </div>
-    </div>
-
-    <!-- 对话框已改为 useModal 调用 -->
-  </div>
-</template>
-
-<script setup>
-import { ref, reactive, computed, onMounted, nextTick } from 'vue'
-import { ElMessage, ElMessageBox } from 'element-plus'
-import { useModal } from '@/sheep/components/sa-modal/sa-modal.vue'
-import {
-  Plus,
-  Refresh,
-  Edit,
-  Delete,
-  Download,
-  Search,
-  ArrowUp,
-  ArrowDown,
-  TrendCharts,
-  DataAnalysis,
-  Money,
-  User
-} from '@element-plus/icons-vue'
-import VChart from 'vue-echarts'
-import * as echarts from 'echarts'
-import { api } from '../../data.service.js'
-
-// 响应式数据
-const activeTab = ref('1')
-
-// 标签页数据
-const tabs = ref([
-  {
-    id: '1',
-    name: '销售概览',
-    description: '销售数据总览和趋势分析',
-    type: 'sales',
-    loading: false,
-    chartType: 'line',
-    chartTitle: '销售趋势',
-    searchKeyword: '',
-    stats: [
-      {
-        label: '总销售额',
-        value: '¥125,680',
-        icon: 'Money',
-        color: '#409EFF',
-        trend: 12.5
-      },
-      {
-        label: '订单数量',
-        value: '1,234',
-        icon: 'DataAnalysis',
-        color: '#67C23A',
-        trend: 8.2
-      },
-      {
-        label: '新用户',
-        value: '456',
-        icon: 'User',
-        color: '#E6A23C',
-        trend: -2.1
-      },
-      {
-        label: '转化率',
-        value: '3.2%',
-        icon: 'TrendCharts',
-        color: '#F56C6C',
-        trend: 5.8
-      }
-    ],
-    chartData: [],
-    chartOption: {},
-    tableData: [],
-    tableColumns: [
-      { prop: 'date', label: '日期', width: 120 },
-      { prop: 'sales', label: '销售额', width: 120, formatter: (val) => `¥${val}` },
-      { prop: 'orders', label: '订单数', width: 100 },
-      { prop: 'users', label: '新用户', width: 100 },
-      { prop: 'conversion', label: '转化率', width: 100, formatter: (val) => `${val}%` }
-    ]
-  }
-])
-
-
-
-// 方法
-const handleTabChange = (tabName) => {
-  activeTab.value = tabName
-  loadReportData(tabName)
-}
-
-const handleTabRemove = (tabName) => {
-  deleteReport(tabName)
-}
-
-const refreshReport = async (tabId) => {
-  const tab = tabs.value.find(t => t.id === tabId)
-  if (tab) {
-    tab.loading = true
-    await loadReportData(tabId)
-    tab.loading = false
-    ElMessage.success('数据已刷新')
-  }
-}
-
-
-
-const deleteReport = async (tabId) => {
-  if (tabs.value.length <= 1) {
-    ElMessage.warning('至少保留一个报表')
-    return
-  }
-
-  try {
-    await ElMessageBox.confirm('确定要删除这个报表吗?', '确认删除', {
-      type: 'warning'
-    })
-
-    // 调用API删除报表
-    await api.report.spectaculars.delete(tabId)
-    
-    // 从本地数组中移除
-    const index = tabs.value.findIndex(t => t.id === tabId)
-    if (index > -1) {
-      tabs.value.splice(index, 1)
-      
-      // 如果删除的是当前激活的标签页,切换到第一个
-      if (activeTab.value === tabId) {
-        activeTab.value = tabs.value[0].id
-      }
-    }
-    
-    ElMessage.success('删除成功')
-  } catch (error) {
-    if (error !== 'cancel') {
-      ElMessage.error('删除失败')
-    }
-  }
-}
-
-const exportReport = async (tabId) => {
-  const tab = tabs.value.find(t => t.id === tabId)
-  if (tab) {
-    ElMessage.info('导出功能开发中')
-  }
-}
-
-
-
-
-
-const updateChart = (tabId) => {
-  const tab = tabs.value.find(t => t.id === tabId)
-  if (tab && tab.chartData) {
-    generateChartOption(tab)
-  }
-}
-
-const searchTable = (tabId) => {
-  const tab = tabs.value.find(t => t.id === tabId)
-  if (tab && tab.tableData) {
-    if (!tab.searchKeyword) {
-      tab.filteredTableData = tab.tableData
-    } else {
-      tab.filteredTableData = tab.tableData.filter(row => {
-        return Object.values(row).some(value => 
-          String(value).toLowerCase().includes(tab.searchKeyword.toLowerCase())
-        )
-      })
-    }
-  }
-}
-
-const loadReportData = async (tabId) => {
-  const tab = tabs.value.find(t => t.id === tabId)
-  if (!tab) return
-  
-  try {
-    tab.loading = true
-    
-    // 根据报表类型加载不同的数据
-    switch (tab.type) {
-      case 'sales':
-        await loadSalesData(tab)
-        break
-      case 'user':
-        await loadUserData(tab)
-        break
-      case 'order':
-        await loadOrderData(tab)
-        break
-      case 'finance':
-        await loadFinanceData(tab)
-        break
-      default:
-        await loadDefaultData(tab)
-    }
-    
-    // 生成图表配置
-    generateChartOption(tab)
-    
-    // 初始化表格过滤数据
-    tab.filteredTableData = tab.tableData
-  } catch (error) {
-    ElMessage.error('数据加载失败')
-  } finally {
-    tab.loading = false
-  }
-}
-
-const loadSalesData = async (tab) => {
-  // 模拟销售数据
-  tab.chartData = [
-    { date: '2024-01-01', value: 1200 },
-    { date: '2024-01-02', value: 1350 },
-    { date: '2024-01-03', value: 1100 },
-    { date: '2024-01-04', value: 1450 },
-    { date: '2024-01-05', value: 1600 }
-  ]
-  
-  tab.tableData = [
-    { date: '2024-01-01', sales: 1200, orders: 45, users: 12, conversion: 2.8 },
-    { date: '2024-01-02', sales: 1350, orders: 52, users: 15, conversion: 3.1 },
-    { date: '2024-01-03', sales: 1100, orders: 38, users: 8, conversion: 2.5 },
-    { date: '2024-01-04', sales: 1450, orders: 58, users: 18, conversion: 3.5 },
-    { date: '2024-01-05', sales: 1600, orders: 62, users: 22, conversion: 3.8 }
-  ]
-}
-
-const loadUserData = async (tab) => {
-  // 模拟用户数据
-  tab.stats = [
-    { label: '总用户数', value: '12,345', icon: 'User', color: '#409EFF', trend: 15.2 },
-    { label: '活跃用户', value: '8,901', icon: 'TrendCharts', color: '#67C23A', trend: 8.7 },
-    { label: '新增用户', value: '234', icon: 'DataAnalysis', color: '#E6A23C', trend: -3.2 },
-    { label: '留存率', value: '72.1%', icon: 'Money', color: '#F56C6C', trend: 4.5 }
-  ]
-}
-
-const loadOrderData = async (tab) => {
-  // 模拟订单数据
-  tab.stats = [
-    { label: '总订单数', value: '5,678', icon: 'DataAnalysis', color: '#409EFF', trend: 12.3 },
-    { label: '待处理', value: '123', icon: 'TrendCharts', color: '#E6A23C', trend: -5.1 },
-    { label: '已完成', value: '5,234', icon: 'Money', color: '#67C23A', trend: 18.9 },
-    { label: '退款率', value: '2.1%', icon: 'User', color: '#F56C6C', trend: -1.2 }
-  ]
-}
-
-const loadFinanceData = async (tab) => {
-  // 模拟财务数据
-  tab.stats = [
-    { label: '总收入', value: '¥234,567', icon: 'Money', color: '#409EFF', trend: 22.1 },
-    { label: '总支出', value: '¥123,456', icon: 'DataAnalysis', color: '#F56C6C', trend: 8.3 },
-    { label: '净利润', value: '¥111,111', icon: 'TrendCharts', color: '#67C23A', trend: 35.7 },
-    { label: '利润率', value: '47.4%', icon: 'User', color: '#E6A23C', trend: 12.8 }
-  ]
-}
-
-const loadDefaultData = async (tab) => {
-  // 默认数据
-  tab.chartData = []
-  tab.tableData = []
-  tab.stats = []
-}
-
-const generateChartOption = (tab) => {
-  if (!tab.chartData || tab.chartData.length === 0) return
-  
-  const xData = tab.chartData.map(item => item.date)
-  const yData = tab.chartData.map(item => item.value)
-  
-  const baseOption = {
-      tooltip: {
-        trigger: 'axis',
-        axisPointer: {
-          type: 'cross'
-        }
-      },
-      legend: {
-        data: [tab.chartTitle || '数据']
-      },
-    grid: {
-      left: '3%',
-      right: '4%',
-      bottom: '3%',
-      containLabel: true
-    },
-    xAxis: {
-      type: 'category',
-      boundaryGap: false,
-      data: xData
-    },
-    yAxis: {
-      type: 'value'
-    }
-  }
-  
-  switch (tab.chartType) {
-    case 'line':
-      tab.chartOption = {
-        ...baseOption,
-        series: [{
-          name: tab.chartTitle || '数据',
-          type: 'line',
-          data: yData,
-          smooth: true,
-          areaStyle: {
-            opacity: 0.3
-          }
-        }]
-      }
-      break
-    case 'bar':
-      tab.chartOption = {
-        ...baseOption,
-        series: [{
-          name: tab.chartTitle || '数据',
-          type: 'bar',
-          data: yData
-        }]
-      }
-      break
-    case 'pie':
-      tab.chartOption = {
-        tooltip: {
-          trigger: 'item'
-        },
-        legend: {
-          orient: 'vertical',
-          left: 'left'
-        },
-        series: [{
-          name: tab.chartTitle || '数据',
-          type: 'pie',
-          radius: '50%',
-          data: tab.chartData.map((item, index) => ({
-            value: item.value,
-            name: item.date || `数据${index + 1}`
-          })),
-          emphasis: {
-            itemStyle: {
-              shadowBlur: 10,
-              shadowOffsetX: 0,
-              shadowColor: 'rgba(0, 0, 0, 0.5)'
-            }
-          }
-        }]
-      }
-      break
-  }
-}
-
-// 新增报表
-const addReport = () => {
-  useModal({
-    title: '新增报表',
-    width: '600px',
-    height: '400px',
-    component: () => import('./add-report-modal.vue'),
-    componentProps: {
-      title: '新增报表',
-      type: 'add'
-    },
-    confirm: (reportData) => {
-      // 添加新标签页
-      const newId = String(tabs.value.length + 1)
-      tabs.value.push({
-        id: newId,
-        name: reportData.name,
-        description: reportData.description,
-        type: reportData.type,
-        loading: false,
-        chartType: 'line',
-        chartTitle: reportData.name + '趋势',
-        searchKeyword: '',
-        stats: [],
-        chartData: [],
-        tableData: [],
-        filteredTableData: []
-      })
-      activeTab.value = newId
-      loadReportData(newId)
-      ElMessage.success('报表创建成功!')
-    }
-  })
-}
-
-// 编辑报表
-const editReport = (tab) => {
-  useModal({
-    title: '编辑报表',
-    width: '600px',
-    height: '400px',
-    component: () => import('./add-report-modal.vue'),
-    componentProps: {
-      title: '编辑报表',
-      type: 'edit',
-      reportData: {
-        name: tab.name,
-        description: tab.description,
-        type: tab.type
-      }
-    },
-    confirm: (reportData) => {
-      // 更新标签页数据
-      tab.name = reportData.name
-      tab.description = reportData.description
-      tab.type = reportData.type
-      tab.chartTitle = reportData.name + '趋势'
-      loadReportData(tab.id)
-      ElMessage.success('报表更新成功!')
-    }
-  })
-}
-
-// 暴露方法
-defineExpose({
-  refreshAllTabs: () => {
-    tabs.value.forEach(tab => {
-      loadReportData(tab.id)
-    })
-  },
-  addReport,
-  editReport
-})
-
-// 初始化
-onMounted(() => {
-  loadReportData(activeTab.value)
-})
-</script>
-
-<style scoped>
-@import '../styles/report-common.scss';
-
-.dashboard-tabs {
-  .stats-trend {
-    &.positive {
-      color: var(--el-color-success);
-    }
-    
-    &.negative {
-      color: var(--el-color-danger);
-    }
-  }
-}
-</style>

+ 99 - 0
src/app/shop/admin/data/report/components/dashboardEdit.vue

@@ -0,0 +1,99 @@
+<template>
+  <el-container>
+    <el-main>
+      <el-form :model="form.model" :rules="form.rules" ref="formRef" :label-width="formLabelWidth">
+        <el-form-item label="看板名称" prop="name">
+          <el-input v-model="form.model.name" placeholder="请输入看板名称"></el-input>
+        </el-form-item>
+      </el-form>
+    </el-main>
+    <el-footer class="sa-footer--submit">
+      <el-button v-if="modal.params.type == 'add'" type="primary" @click="confirm">
+        保存
+      </el-button>
+      <el-button v-if="modal.params.type == 'edit'" type="primary" @click="confirm">
+        更新
+      </el-button>
+    </el-footer>
+  </el-container>
+</template>
+
+<script setup>
+import { cloneDeep } from 'lodash';
+import { onMounted, reactive, ref, unref } from 'vue';
+import { ElMessage } from 'element-plus';
+import { useFormConfig } from '@/hooks/useFormConfig';
+import { api } from '../../data.service.js';
+
+// 使用表单配置hooks
+const { formLabelWidth } = useFormConfig({ enWidth: '140px' });
+
+const emit = defineEmits(['modalCallBack']);
+const props = defineProps({
+  modal: {
+    type: Object,
+  },
+});
+
+// 添加 编辑 form
+let formRef = ref(null);
+const form = reactive({
+  model: {
+    name: '',
+  },
+  get rules() {
+    return {
+      name: [
+        { required: true, message: '请输入看板名称', trigger: 'blur' },
+        { min: 2, max: 50, message: '长度在 2 到 50 个字符', trigger: 'blur' }
+      ]
+    };
+  },
+});
+const loading = ref(false);
+
+// 获取详情
+async function getDetail(id) {
+  loading.value = true;
+  const { code, data } = await api.report.spectaculars.detail({ id });
+  code === '200' && (form.model = data);
+  loading.value = false;
+}
+
+// 表单关闭时提交
+async function confirm() {
+  unref(formRef).validate(async (valid) => {
+    if (!valid) return;
+    let submitForm = cloneDeep(form.model);
+    const { code } =
+      props.modal.params.type == 'add'
+        ? await api.report.spectaculars.add(submitForm)
+        : await api.report.spectaculars.update(submitForm);
+    if (code == '200') {
+      ElMessage.success('保存成功');
+      emit('modalCallBack', { event: 'confirm' });
+    }
+  });
+}
+
+async function init() {
+  if (props.modal.params.id) {
+    await getDetail(props.modal.params.id);
+  }
+}
+
+onMounted(() => {
+  init();
+});
+</script>
+
+<style scoped>
+.sa-footer--submit {
+  display: flex;
+  justify-content: flex-end;
+  gap: 12px;
+  padding: 16px 24px;
+  border-top: 1px solid #e4e7ed;
+  background: #fafafa;
+}
+</style>

+ 0 - 0
src/app/shop/admin/data/report/components/data-display-modal.vue → src/app/shop/admin/data/report/components/dataDisplayEdit.vue


+ 0 - 115
src/app/shop/admin/data/report/components/dimension-view-modal.vue

@@ -1,115 +0,0 @@
-<template>
-  <div class="dimension-view-modal">
-    <div class="dimension-info">
-      <el-descriptions :column="2" border>
-        <el-descriptions-item label="维度ID">
-          {{ dimensionData.id || '-' }}
-        </el-descriptions-item>
-        <el-descriptions-item label="维度名称">
-          {{ dimensionData.name || '-' }}
-        </el-descriptions-item>
-        <el-descriptions-item label="维度编码">
-          {{ dimensionData.code || '-' }}
-        </el-descriptions-item>
-        <el-descriptions-item label="单位类型">
-          {{ getUnitTypeLabel(dimensionData.unitType) }}
-        </el-descriptions-item>
-        <el-descriptions-item label="视图类型">
-          {{ getViewTypeLabel(dimensionData.viewType) }}
-        </el-descriptions-item>
-        <el-descriptions-item label="状态">
-          <el-tag :type="dimensionData.status === 1 ? 'success' : 'danger'">
-            {{ dimensionData.status === 1 ? '启用' : '禁用' }}
-          </el-tag>
-        </el-descriptions-item>
-        <el-descriptions-item label="创建人">
-          {{ dimensionData.createName || '-' }}
-        </el-descriptions-item>
-        <el-descriptions-item label="创建时间">
-          {{ dimensionData.createTime || '-' }}
-        </el-descriptions-item>
-        <el-descriptions-item label="更新人">
-          {{ dimensionData.updateName || '-' }}
-        </el-descriptions-item>
-        <el-descriptions-item label="更新时间">
-          {{ dimensionData.updateTime || '-' }}
-        </el-descriptions-item>
-        <el-descriptions-item label="维度描述" :span="2">
-          {{ dimensionData.memo || '-' }}
-        </el-descriptions-item>
-      </el-descriptions>
-    </div>
-
-    <!-- 维度数据统计 -->
-    <div v-if="dimensionData.sections && dimensionData.sections.length > 0" class="dimension-stats">
-      <h4>数据统计</h4>
-      <el-table :data="dimensionData.sections" border style="width: 100%">
-        <el-table-column prop="sectionName" label="分组名称" />
-        <el-table-column prop="statisticsValue" label="统计值" />
-        <el-table-column prop="proportion" label="占比" >
-          <template #default="{ row }">
-            {{ (row.proportion * 100).toFixed(2) }}%
-          </template>
-        </el-table-column>
-        <el-table-column prop="total" label="总计" />
-      </el-table>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { computed } from 'vue'
-
-const props = defineProps({
-  dimensionData: {
-    type: Object,
-    default: () => ({})
-  }
-})
-
-// 获取单位类型标签
-const getUnitTypeLabel = (type) => {
-  const typeMap = {
-    0: '数量',
-    1: '金额',
-    2: '百分比',
-    3: '时间'
-  }
-  return typeMap[type] || '-'
-}
-
-// 获取视图类型标签
-const getViewTypeLabel = (type) => {
-  const typeMap = {
-    'line': '折线图',
-    'bar': '柱状图',
-    'pie': '饼图',
-    'table': '表格'
-  }
-  return typeMap[type] || '-'
-}
-</script>
-
-<style scoped>
-.dimension-view-modal {
-  padding: 20px;
-}
-
-.dimension-info {
-  margin-bottom: 20px;
-}
-
-.dimension-stats {
-  margin-top: 20px;
-}
-
-.dimension-stats h4 {
-  margin-bottom: 15px;
-  color: #303133;
-  font-weight: 600;
-}
-
-:deep(.el-descriptions__label) {
-  font-weight: 600;
-}
-</style>

+ 3 - 17
src/app/shop/admin/data/report/components/dimension-management.vue → src/app/shop/admin/data/report/components/dimensionManagementEdit.vue

@@ -86,12 +86,7 @@
                 </el-icon>
                 编辑
               </el-button>
-              <el-button size="small" type="info" link @click="handleView(row)">
-                <el-icon>
-                  <View />
-                </el-icon>
-                查看
-              </el-button>
+
               <el-button size="small" type="danger" link @click="handleDelete(row)">
                 <el-icon>
                   <Delete />
@@ -137,7 +132,7 @@
 import { ref, reactive, computed, onMounted } from 'vue'
 import { ElMessage, ElMessageBox } from 'element-plus'
 import {
-  Plus, Refresh, Search, RefreshLeft, Edit, View, Delete,
+  Plus, Refresh, Search, RefreshLeft, Edit, Delete,
   Check, Close
 } from '@element-plus/icons-vue'
 import { api } from '../../data.service.js'
@@ -265,16 +260,7 @@ const handleEdit = (row) => {
   })
 }
 
-const handleView = (row) => {
-  useModal(() => import('./dimension-view-modal.vue'), {
-    title: '维度详情',
-    width: '700px',
-    height: '600px',
-    componentProps: {
-      dimensionData: row
-    }
-  })
-}
+
 
 const handleDelete = async (row) => {
   try {

+ 0 - 775
src/app/shop/admin/data/report/components/report-detail-modal.vue

@@ -1,775 +0,0 @@
-<template>
-  <div class="report-detail-modal">
-    <!-- 报表头部信息 -->
-    <div class="report-header">
-      <div class="header-left">
-        <div class="report-title">
-          <h3>{{ reportData?.name || '未命名报表' }}</h3>
-          <div class="report-meta">
-            <el-tag :type="getStatusType(reportData?.status)">{{ getStatusText(reportData?.status) }}</el-tag>
-            <span class="meta-item">创建时间:{{ formatDate(reportData?.createTime) }}</span>
-            <span class="meta-item">更新时间:{{ formatDate(reportData?.updateTime) }}</span>
-          </div>
-        </div>
-      </div>
-      <div class="header-right">
-        <el-button-group>
-          <el-button @click="refreshReport" :loading="refreshing">
-            <el-icon><Refresh /></el-icon>
-            刷新
-          </el-button>
-          <el-button @click="exportReport">
-            <el-icon><Download /></el-icon>
-            导出
-          </el-button>
-          <el-button @click="editReport">
-            <el-icon><Edit /></el-icon>
-            编辑
-          </el-button>
-          <el-button type="primary" @click="shareReport">
-            <el-icon><Share /></el-icon>
-            分享
-          </el-button>
-        </el-button-group>
-      </div>
-    </div>
-
-    <!-- 筛选条件 -->
-    <div class="filter-section">
-      <el-card shadow="never" class="filter-card">
-        <template #header>
-          <div class="card-header">
-            <span>筛选条件</span>
-            <el-button text @click="toggleFilterExpand">
-              <el-icon><component :is="filterExpanded ? 'ArrowUp' : 'ArrowDown'" /></el-icon>
-              {{ filterExpanded ? '收起' : '展开' }}
-            </el-button>
-          </div>
-        </template>
-        <div v-show="filterExpanded" class="filter-content">
-          <el-form :model="filterForm" inline>
-            <el-form-item label="时间范围">
-              <el-date-picker
-                v-model="filterForm.dateRange"
-                type="daterange"
-                range-separator="至"
-                start-placeholder="开始日期"
-                end-placeholder="结束日期"
-                format="YYYY-MM-DD"
-                value-format="YYYY-MM-DD"
-                @change="handleFilterChange"
-              />
-            </el-form-item>
-            <el-form-item label="数据类型">
-              <el-select v-model="filterForm.dataType" placeholder="请选择" @change="handleFilterChange">
-                <el-option label="全部" value="" />
-                <el-option label="销售数据" value="sales" />
-                <el-option label="订单数据" value="orders" />
-                <el-option label="用户数据" value="users" />
-                <el-option label="商品数据" value="goods" />
-              </el-select>
-            </el-form-item>
-            <el-form-item label="状态">
-              <el-select v-model="filterForm.status" placeholder="请选择" @change="handleFilterChange">
-                <el-option label="全部" value="" />
-                <el-option label="正常" value="normal" />
-                <el-option label="异常" value="error" />
-                <el-option label="待处理" value="pending" />
-              </el-select>
-            </el-form-item>
-            <el-form-item>
-              <el-button type="primary" @click="applyFilter">
-                <el-icon><Search /></el-icon>
-                查询
-              </el-button>
-              <el-button @click="resetFilter">
-                <el-icon><RefreshLeft /></el-icon>
-                重置
-              </el-button>
-            </el-form-item>
-          </el-form>
-        </div>
-      </el-card>
-    </div>
-
-    <!-- 数据概览 -->
-    <div class="overview-section">
-      <el-row :gutter="20">
-        <el-col :span="6" v-for="(item, index) in overviewData" :key="index">
-          <el-card shadow="hover" class="overview-card">
-            <div class="overview-item">
-              <div class="overview-icon" :class="item.type">
-                <el-icon><component :is="item.icon" /></el-icon>
-              </div>
-              <div class="overview-content">
-                <div class="overview-value">{{ item.value }}</div>
-                <div class="overview-label">{{ item.label }}</div>
-                <div class="overview-trend" :class="item.trend > 0 ? 'up' : 'down'">
-                  <el-icon><component :is="item.trend > 0 ? 'TrendCharts' : 'Bottom'" /></el-icon>
-                  {{ Math.abs(item.trend) }}%
-                </div>
-              </div>
-            </div>
-          </el-card>
-        </el-col>
-      </el-row>
-    </div>
-
-    <!-- 图表展示区域 -->
-    <div class="charts-section">
-      <el-card shadow="never">
-        <template #header>
-          <div class="card-header">
-            <span>数据图表</span>
-            <div class="chart-controls">
-              <el-radio-group v-model="chartType" @change="handleChartTypeChange">
-                <el-radio-button label="line">折线图</el-radio-button>
-                <el-radio-button label="bar">柱状图</el-radio-button>
-                <el-radio-button label="pie">饼图</el-radio-button>
-                <el-radio-button label="area">面积图</el-radio-button>
-              </el-radio-group>
-            </div>
-          </div>
-        </template>
-        <div class="chart-container" v-loading="chartLoading">
-          <v-chart :option="chartOption" autoresize style="height: 400px;" />
-        </div>
-      </el-card>
-    </div>
-
-    <!-- 详细数据表格 -->
-    <div class="table-section">
-      <el-card shadow="never">
-        <template #header>
-          <div class="card-header">
-            <span>详细数据</span>
-            <div class="table-controls">
-              <el-input
-                v-model="searchKeyword"
-                placeholder="搜索数据..."
-                style="width: 200px; margin-right: 12px;"
-                @input="handleSearch"
-              >
-                <template #prefix>
-                  <el-icon><Search /></el-icon>
-                </template>
-              </el-input>
-              <el-button @click="exportTableData">
-                <el-icon><Download /></el-icon>
-                导出
-              </el-button>
-            </div>
-          </div>
-        </template>
-        
-        <el-table
-          :data="tableData"
-          v-loading="tableLoading"
-          @sort-change="handleSortChange"
-          stripe
-          style="width: 100%"
-        >
-          <el-table-column prop="date" label="日期" sortable width="120" />
-          <el-table-column prop="type" label="数据类型" width="120">
-            <template #default="{ row }">
-              <el-tag :type="getDataTypeColor(row.type)">{{ getDataTypeLabel(row.type) }}</el-tag>
-            </template>
-          </el-table-column>
-          <el-table-column prop="value" label="数值" sortable width="120">
-            <template #default="{ row }">
-              <span class="number-value">{{ formatNumber(row.value) }}</span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="growth" label="增长率" sortable width="120">
-            <template #default="{ row }">
-              <span :class="row.growth >= 0 ? 'growth-positive' : 'growth-negative'">
-                {{ row.growth >= 0 ? '+' : '' }}{{ row.growth.toFixed(1) }}%
-              </span>
-            </template>
-          </el-table-column>
-          <el-table-column prop="status" label="状态" width="100">
-            <template #default="{ row }">
-              <el-tag :type="getStatusType(row.status)">{{ getStatusText(row.status) }}</el-tag>
-            </template>
-          </el-table-column>
-          <el-table-column prop="remark" label="备注" show-overflow-tooltip />
-          <el-table-column label="操作" width="150" fixed="right">
-            <template #default="{ row, $index }">
-              <el-button size="small" @click="viewDetail(row)">
-                查看
-              </el-button>
-              <el-button size="small" type="primary" @click="editRow(row, $index)">
-                编辑
-              </el-button>
-            </template>
-          </el-table-column>
-        </el-table>
-        
-        <!-- 分页 -->
-        <div class="pagination-wrapper">
-          <el-pagination
-            v-model:current-page="pagination.currentPage"
-            v-model:page-size="pagination.pageSize"
-            :page-sizes="[10, 20, 50, 100]"
-            :total="pagination.total"
-            layout="total, sizes, prev, pager, next, jumper"
-            @size-change="handleSizeChange"
-            @current-change="handleCurrentChange"
-          />
-        </div>
-      </el-card>
-    </div>
-  </div>
-</template>
-
-<script setup>
-import { ref, reactive, onMounted } from 'vue';
-import { ElMessage } from 'element-plus';
-import {
-  Refresh,
-  Download,
-  Edit,
-  Share,
-  Search,
-  RefreshLeft,
-  ArrowUp,
-  ArrowDown,
-  TrendCharts,
-  Bottom,
-  Money,
-  ShoppingCart,
-  User,
-  Goods
-} from '@element-plus/icons-vue';
-import VChart from 'vue-echarts';
-import { use } from 'echarts/core';
-import {
-  CanvasRenderer
-} from 'echarts/renderers';
-import {
-  LineChart,
-  BarChart,
-  PieChart as EChartsPieChart
-} from 'echarts/charts';
-import {
-  TitleComponent,
-  TooltipComponent,
-  LegendComponent,
-  GridComponent
-} from 'echarts/components';
-
-use([
-  CanvasRenderer,
-  LineChart,
-  BarChart,
-  EChartsPieChart,
-  TitleComponent,
-  TooltipComponent,
-  LegendComponent,
-  GridComponent
-]);
-
-const props = defineProps({
-  reportData: {
-    type: Object,
-    default: () => ({})
-  }
-});
-
-// 响应式数据
-const refreshing = ref(false);
-const filterExpanded = ref(true);
-const chartLoading = ref(false);
-const tableLoading = ref(false);
-const chartType = ref('line');
-const searchKeyword = ref('');
-
-const filterForm = reactive({
-  dateRange: [],
-  dataType: '',
-  status: ''
-});
-
-const pagination = reactive({
-  currentPage: 1,
-  pageSize: 20,
-  total: 0
-});
-
-// 概览数据
-const overviewData = ref([
-  {
-    label: '总销售额',
-    value: '¥1,234,567',
-    trend: 12.5,
-    type: 'sales',
-    icon: 'Money'
-  },
-  {
-    label: '订单数量',
-    value: '8,456',
-    trend: -3.2,
-    type: 'orders',
-    icon: 'ShoppingCart'
-  },
-  {
-    label: '用户数量',
-    value: '12,345',
-    trend: 8.7,
-    type: 'users',
-    icon: 'User'
-  },
-  {
-    label: '商品数量',
-    value: '2,567',
-    trend: 5.4,
-    type: 'goods',
-    icon: 'Goods'
-  }
-]);
-
-// 表格数据
-const tableData = ref([]);
-
-// 图表配置
-const chartOption = ref({});
-
-// 方法
-const refreshReport = async () => {
-  refreshing.value = true;
-  try {
-    await loadReportData();
-    ElMessage.success('报表刷新成功');
-  } catch (error) {
-    ElMessage.error('报表刷新失败');
-  } finally {
-    refreshing.value = false;
-  }
-};
-
-const exportReport = () => {
-  ElMessage.info('导出功能开发中...');
-};
-
-const editReport = () => {
-  ElMessage.info('编辑功能开发中...');
-};
-
-const shareReport = () => {
-  ElMessage.info('分享功能开发中...');
-};
-
-const toggleFilterExpand = () => {
-  filterExpanded.value = !filterExpanded.value;
-};
-
-const handleFilterChange = () => {
-  // 筛选条件变化时的处理
-};
-
-const applyFilter = () => {
-  loadTableData();
-  loadChartData();
-  ElMessage.success('筛选条件已应用');
-};
-
-const resetFilter = () => {
-  Object.assign(filterForm, {
-    dateRange: [],
-    dataType: '',
-    status: ''
-  });
-  loadTableData();
-  loadChartData();
-  ElMessage.success('筛选条件已重置');
-};
-
-const handleChartTypeChange = () => {
-  loadChartData();
-};
-
-const handleSearch = () => {
-  // 搜索处理
-  loadTableData();
-};
-
-const handleSortChange = ({ prop, order }) => {
-  // 排序处理
-  loadTableData();
-};
-
-const handleSizeChange = (size) => {
-  pagination.pageSize = size;
-  loadTableData();
-};
-
-const handleCurrentChange = (page) => {
-  pagination.currentPage = page;
-  loadTableData();
-};
-
-const exportTableData = () => {
-  ElMessage.info('导出表格功能开发中...');
-};
-
-const viewDetail = (row) => {
-  ElMessage.info(`查看详情: ${row.date}`);
-};
-
-const editRow = (row, index) => {
-  ElMessage.info(`编辑行: ${index + 1}`);
-};
-
-// 工具方法
-const formatDate = (date) => {
-  if (!date) return '-';
-  return new Date(date).toLocaleDateString('zh-CN');
-};
-
-const formatNumber = (num) => {
-  if (typeof num !== 'number') return num;
-  return num.toLocaleString();
-};
-
-const getStatusType = (status) => {
-  const types = {
-    normal: 'success',
-    error: 'danger',
-    pending: 'warning',
-    active: 'success',
-    inactive: 'info'
-  };
-  return types[status] || 'info';
-};
-
-const getStatusText = (status) => {
-  const texts = {
-    normal: '正常',
-    error: '异常',
-    pending: '待处理',
-    active: '活跃',
-    inactive: '非活跃'
-  };
-  return texts[status] || '未知';
-};
-
-const getDataTypeColor = (type) => {
-  const colors = {
-    sales: 'success',
-    orders: 'primary',
-    users: 'warning',
-    goods: 'info'
-  };
-  return colors[type] || 'info';
-};
-
-const getDataTypeLabel = (type) => {
-  const labels = {
-    sales: '销售',
-    orders: '订单',
-    users: '用户',
-    goods: '商品'
-  };
-  return labels[type] || '未知';
-};
-
-// 数据加载方法
-const loadReportData = async () => {
-  await Promise.all([
-    loadTableData(),
-    loadChartData()
-  ]);
-};
-
-const loadTableData = async () => {
-  tableLoading.value = true;
-  try {
-    // 模拟数据加载
-    await new Promise(resolve => setTimeout(resolve, 500));
-    
-    const mockData = Array.from({ length: 50 }, (_, index) => ({
-      date: new Date(Date.now() - index * 24 * 60 * 60 * 1000).toISOString().split('T')[0],
-      type: ['sales', 'orders', 'users', 'goods'][index % 4],
-      value: Math.floor(Math.random() * 10000) + 1000,
-      growth: (Math.random() - 0.5) * 20,
-      status: ['normal', 'error', 'pending'][index % 3],
-      remark: `备注信息 ${index + 1}`
-    }));
-    
-    tableData.value = mockData.slice(
-      (pagination.currentPage - 1) * pagination.pageSize,
-      pagination.currentPage * pagination.pageSize
-    );
-    pagination.total = mockData.length;
-  } catch (error) {
-    ElMessage.error('数据加载失败');
-  } finally {
-    tableLoading.value = false;
-  }
-};
-
-const loadChartData = async () => {
-  chartLoading.value = true;
-  try {
-    // 模拟数据加载
-    await new Promise(resolve => setTimeout(resolve, 300));
-    
-    const days = Array.from({ length: 7 }, (_, i) => {
-      const date = new Date();
-      date.setDate(date.getDate() - i);
-      return date.toLocaleDateString('zh-CN', { month: 'short', day: 'numeric' });
-    }).reverse();
-    
-    const values = Array.from({ length: 7 }, () => Math.floor(Math.random() * 1000) + 100);
-    
-    if (chartType.value === 'pie') {
-      chartOption.value = {
-        tooltip: {
-          trigger: 'item',
-          formatter: '{a} <br/>{b}: {c} ({d}%)'
-        },
-        legend: {
-          orient: 'vertical',
-          left: 'left'
-        },
-        series: [
-          {
-            name: '数据分布',
-            type: 'pie',
-            radius: '50%',
-            data: [
-              { value: 335, name: '销售数据' },
-              { value: 310, name: '订单数据' },
-              { value: 234, name: '用户数据' },
-              { value: 135, name: '商品数据' }
-            ]
-          }
-        ]
-      };
-    } else {
-      chartOption.value = {
-        tooltip: {
-          trigger: 'axis'
-        },
-        legend: {
-          data: ['数据趋势']
-        },
-        grid: {
-          left: '3%',
-          right: '4%',
-          bottom: '3%',
-          containLabel: true
-        },
-        xAxis: {
-          type: 'category',
-          data: days
-        },
-        yAxis: {
-          type: 'value'
-        },
-        series: [
-          {
-            name: '数据趋势',
-            type: chartType.value,
-            data: values,
-            areaStyle: chartType.value === 'area' ? {} : undefined
-          }
-        ]
-      };
-    }
-  } catch (error) {
-    ElMessage.error('图表数据加载失败');
-  } finally {
-    chartLoading.value = false;
-  }
-};
-
-// 生命周期
-onMounted(() => {
-  loadReportData();
-});
-</script>
-
-<style scoped>
-.report-detail-modal {
-  .report-header {
-    display: flex;
-    justify-content: space-between;
-    align-items: flex-start;
-    margin-bottom: 24px;
-    padding: 20px;
-    background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-    border-radius: 12px;
-    color: white;
-    
-    .header-left {
-      .report-title {
-        h3 {
-          margin: 0 0 8px 0;
-          font-size: 24px;
-          font-weight: 600;
-        }
-        
-        .report-meta {
-          display: flex;
-          align-items: center;
-          gap: 16px;
-          font-size: 14px;
-          opacity: 0.9;
-          
-          .meta-item {
-            display: flex;
-            align-items: center;
-          }
-        }
-      }
-    }
-    
-    .header-right {
-      .el-button-group {
-        .el-button {
-          background: rgba(255, 255, 255, 0.1);
-          border-color: rgba(255, 255, 255, 0.2);
-          color: white;
-          
-          &:hover {
-            background: rgba(255, 255, 255, 0.2);
-          }
-        }
-      }
-    }
-  }
-  
-  .filter-section,
-  .overview-section,
-  .charts-section,
-  .table-section {
-    margin-bottom: 24px;
-  }
-  
-  .filter-card {
-    .card-header {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-    }
-    
-    .filter-content {
-      .el-form {
-        .el-form-item {
-          margin-bottom: 16px;
-        }
-      }
-    }
-  }
-  
-  .overview-section {
-    .overview-card {
-      .overview-item {
-        display: flex;
-        align-items: center;
-        gap: 16px;
-        
-        .overview-icon {
-          width: 48px;
-          height: 48px;
-          border-radius: 12px;
-          display: flex;
-          align-items: center;
-          justify-content: center;
-          font-size: 24px;
-          color: white;
-          
-          &.sales {
-            background: linear-gradient(135deg, #67c23a, #85ce61);
-          }
-          
-          &.orders {
-            background: linear-gradient(135deg, #409eff, #66b1ff);
-          }
-          
-          &.users {
-            background: linear-gradient(135deg, #e6a23c, #ebb563);
-          }
-          
-          &.goods {
-            background: linear-gradient(135deg, #f56c6c, #f78989);
-          }
-        }
-        
-        .overview-content {
-          flex: 1;
-          
-          .overview-value {
-            font-size: 24px;
-            font-weight: 600;
-            color: #303133;
-            margin-bottom: 4px;
-          }
-          
-          .overview-label {
-            font-size: 14px;
-            color: #909399;
-            margin-bottom: 4px;
-          }
-          
-          .overview-trend {
-            display: flex;
-            align-items: center;
-            gap: 4px;
-            font-size: 12px;
-            font-weight: 500;
-            
-            &.up {
-              color: #67c23a;
-            }
-            
-            &.down {
-              color: #f56c6c;
-            }
-          }
-        }
-      }
-    }
-  }
-  
-  .charts-section,
-  .table-section {
-    .card-header {
-      display: flex;
-      justify-content: space-between;
-      align-items: center;
-    }
-    
-    .chart-container {
-      padding: 16px 0;
-    }
-    
-    .table-controls {
-      display: flex;
-      align-items: center;
-    }
-  }
-  
-  .number-value {
-    font-weight: 500;
-    color: #303133;
-  }
-  
-  .growth-positive {
-    color: #67c23a;
-    font-weight: 500;
-  }
-  
-  .growth-negative {
-    color: #f56c6c;
-    font-weight: 500;
-  }
-  
-  .pagination-wrapper {
-    display: flex;
-    justify-content: center;
-    margin-top: 20px;
-  }
-}
-</style>

+ 4907 - 0
src/app/shop/admin/data/report/detail.json

@@ -0,0 +1,4907 @@
+{
+  "code": "200",
+  "data": {
+    "dimensions": [
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "6",
+        "memo": "用户总数",
+        "name": "用户总数",
+        "sections": [
+          {
+            "id": "229",
+            "memo": "用户总数",
+            "name": "悟空360-用户总数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.0743,
+                "statisticsValue": 493470
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0743,
+                "statisticsValue": 493700
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.0743,
+                "statisticsValue": 493897
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.0743,
+                "statisticsValue": 494105
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.0743,
+                "statisticsValue": 494202
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0743,
+                "statisticsValue": 494307
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0744,
+                "statisticsValue": 494412
+              }
+            ],
+            "total": 3458093
+          },
+          {
+            "id": "268",
+            "memo": "用户总数",
+            "name": "悟空三基同创-用户总数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.0928,
+                "statisticsValue": 616412
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0928,
+                "statisticsValue": 616596
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.0928,
+                "statisticsValue": 616801
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.0928,
+                "statisticsValue": 616975
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.0928,
+                "statisticsValue": 617073
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0928,
+                "statisticsValue": 617163
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0928,
+                "statisticsValue": 617264
+              }
+            ],
+            "total": 4318284
+          },
+          {
+            "id": "306",
+            "memo": "用户总数",
+            "name": "悟空华为-用户总数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.0688,
+                "statisticsValue": 457468
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0688,
+                "statisticsValue": 457479
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.0688,
+                "statisticsValue": 457492
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.0688,
+                "statisticsValue": 457497
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.0688,
+                "statisticsValue": 457502
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0688,
+                "statisticsValue": 457503
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0688,
+                "statisticsValue": 457508
+              }
+            ],
+            "total": 3202449
+          },
+          {
+            "id": "305",
+            "memo": "用户总数",
+            "name": "悟空小度-用户总数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.2913,
+                "statisticsValue": 1935840
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2913,
+                "statisticsValue": 1935840
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.2912,
+                "statisticsValue": 1935840
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.2912,
+                "statisticsValue": 1935840
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.2912,
+                "statisticsValue": 1935840
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.2912,
+                "statisticsValue": 1935840
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.2911,
+                "statisticsValue": 1935840
+              }
+            ],
+            "total": 13550880
+          },
+          {
+            "id": "267",
+            "memo": "用户总数",
+            "name": "悟空小米-用户总数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.3732,
+                "statisticsValue": 2480213
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.3732,
+                "statisticsValue": 2480218
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.3731,
+                "statisticsValue": 2480230
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.3731,
+                "statisticsValue": 2480236
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.3731,
+                "statisticsValue": 2480243
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.3731,
+                "statisticsValue": 2480245
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.373,
+                "statisticsValue": 2480250
+              }
+            ],
+            "total": 17361635
+          },
+          {
+            "id": "230",
+            "memo": "用户总数",
+            "name": "悟空掌育-用户总数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.0996,
+                "statisticsValue": 661944
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0997,
+                "statisticsValue": 662319
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.0997,
+                "statisticsValue": 662710
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.0997,
+                "statisticsValue": 663013
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.0998,
+                "statisticsValue": 663224
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0998,
+                "statisticsValue": 663448
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0998,
+                "statisticsValue": 663682
+              }
+            ],
+            "total": 4640340
+          },
+          {
+            "id": 0,
+            "memo": "",
+            "name": "用户总数汇总",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 6645347
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 6646152
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 6646970
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 6647666
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 6648084
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 6648506
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 6648956
+              }
+            ],
+            "total": 46531681
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 122,
+        "unitType": 2,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:37",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "7",
+        "memo": "新增用户数",
+        "name": "新增用户数",
+        "sections": [
+          {
+            "id": "228",
+            "memo": "新增用户数",
+            "name": "悟空360-新增用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.2584,
+                "statisticsValue": 200
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2857,
+                "statisticsValue": 230
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.2408,
+                "statisticsValue": 197
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.2989,
+                "statisticsValue": 208
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.2321,
+                "statisticsValue": 97
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.2488,
+                "statisticsValue": 105
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.2333,
+                "statisticsValue": 105
+              }
+            ],
+            "total": 1142
+          },
+          {
+            "id": "269",
+            "memo": "新增用户数",
+            "name": "悟空三基同创-新增用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.2093,
+                "statisticsValue": 162
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2286,
+                "statisticsValue": 184
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.2506,
+                "statisticsValue": 205
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.25,
+                "statisticsValue": 174
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.2344,
+                "statisticsValue": 98
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.2133,
+                "statisticsValue": 90
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.2244,
+                "statisticsValue": 101
+              }
+            ],
+            "total": 1014
+          },
+          {
+            "id": "307",
+            "memo": "新增用户数",
+            "name": "悟空华为-新增用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.009,
+                "statisticsValue": 7
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0137,
+                "statisticsValue": 11
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.0159,
+                "statisticsValue": 13
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.0072,
+                "statisticsValue": 5
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.012,
+                "statisticsValue": 5
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0024,
+                "statisticsValue": 1
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0111,
+                "statisticsValue": 5
+              }
+            ],
+            "total": 47
+          },
+          {
+            "id": "304",
+            "memo": "新增用户数",
+            "name": "悟空小度-新增用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "266",
+            "memo": "新增用户数",
+            "name": "悟空小米-新增用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.009,
+                "statisticsValue": 7
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0062,
+                "statisticsValue": 5
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.0147,
+                "statisticsValue": 12
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.0086,
+                "statisticsValue": 6
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.0167,
+                "statisticsValue": 7
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0047,
+                "statisticsValue": 2
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0111,
+                "statisticsValue": 5
+              }
+            ],
+            "total": 44
+          },
+          {
+            "id": "231",
+            "memo": "新增用户数",
+            "name": "悟空掌育-新增用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.5142,
+                "statisticsValue": 398
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.4658,
+                "statisticsValue": 375
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.478,
+                "statisticsValue": 391
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.4353,
+                "statisticsValue": 303
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.5048,
+                "statisticsValue": 211
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.5308,
+                "statisticsValue": 224
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.52,
+                "statisticsValue": 234
+              }
+            ],
+            "total": 2136
+          },
+          {
+            "id": 0,
+            "memo": "",
+            "name": "新增用户数汇总",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 774
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 805
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 818
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 696
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 418
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 422
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 450
+              }
+            ],
+            "total": 4383
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 123,
+        "unitType": 2,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "8",
+        "memo": "活跃用户数",
+        "name": "活跃用户数",
+        "sections": [
+          {
+            "id": "227",
+            "memo": "活跃用户数",
+            "name": "悟空360-活跃用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.2139,
+                "statisticsValue": 8909
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2133,
+                "statisticsValue": 8970
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.2119,
+                "statisticsValue": 8576
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.2169,
+                "statisticsValue": 8273
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.2302,
+                "statisticsValue": 6244
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.231,
+                "statisticsValue": 6100
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.2316,
+                "statisticsValue": 6029
+              }
+            ],
+            "total": 53101
+          },
+          {
+            "id": "270",
+            "memo": "活跃用户数",
+            "name": "悟空三基同创-活跃用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.0553,
+                "statisticsValue": 2305
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0567,
+                "statisticsValue": 2383
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.0581,
+                "statisticsValue": 2351
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.0584,
+                "statisticsValue": 2229
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.057,
+                "statisticsValue": 1547
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0552,
+                "statisticsValue": 1457
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0562,
+                "statisticsValue": 1462
+              }
+            ],
+            "total": 13734
+          },
+          {
+            "id": "308",
+            "memo": "活跃用户数",
+            "name": "悟空华为-活跃用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.0684,
+                "statisticsValue": 2850
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.066,
+                "statisticsValue": 2774
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.0683,
+                "statisticsValue": 2762
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.065,
+                "statisticsValue": 2478
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.0573,
+                "statisticsValue": 1554
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0579,
+                "statisticsValue": 1528
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0582,
+                "statisticsValue": 1516
+              }
+            ],
+            "total": 15462
+          },
+          {
+            "id": "303",
+            "memo": "活跃用户数",
+            "name": "悟空小度-活跃用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "265",
+            "memo": "活跃用户数",
+            "name": "悟空小米-活跃用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.5761,
+                "statisticsValue": 23999
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.5772,
+                "statisticsValue": 24279
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.5718,
+                "statisticsValue": 23141
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.5711,
+                "statisticsValue": 21782
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.5648,
+                "statisticsValue": 15321
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.5642,
+                "statisticsValue": 14902
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.5601,
+                "statisticsValue": 14581
+              }
+            ],
+            "total": 138005
+          },
+          {
+            "id": "232",
+            "memo": "活跃用户数",
+            "name": "悟空掌育-活跃用户数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.0863,
+                "statisticsValue": 3595
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0869,
+                "statisticsValue": 3655
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.0899,
+                "statisticsValue": 3637
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.0885,
+                "statisticsValue": 3377
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.0907,
+                "statisticsValue": 2460
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0918,
+                "statisticsValue": 2425
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0939,
+                "statisticsValue": 2444
+              }
+            ],
+            "total": 21593
+          },
+          {
+            "id": 0,
+            "memo": "",
+            "name": "活跃用户数汇总",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 41658
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 42061
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 40467
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 38139
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 27126
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 26412
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 26032
+              }
+            ],
+            "total": 241895
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 124,
+        "unitType": 2,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "9",
+        "memo": "付费金额",
+        "name": "付费金额",
+        "sections": [
+          {
+            "id": "226",
+            "memo": "付费金额",
+            "name": "悟空360-付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.4348,
+                "statisticsValue": 260
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2019,
+                "statisticsValue": 195
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.3636,
+                "statisticsValue": 156
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.3333,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.6389,
+                "statisticsValue": 598
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0517,
+                "statisticsValue": 39
+              }
+            ],
+            "total": 1287
+          },
+          {
+            "id": "271",
+            "memo": "付费金额",
+            "name": "悟空三基同创-付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.0652,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0807,
+                "statisticsValue": 78
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0417,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0517,
+                "statisticsValue": 39
+              }
+            ],
+            "total": 195
+          },
+          {
+            "id": "309",
+            "memo": "付费金额",
+            "name": "悟空华为-付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.3095,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 299
+          },
+          {
+            "id": "302",
+            "memo": "付费金额",
+            "name": "悟空小度-付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "264",
+            "memo": "付费金额",
+            "name": "悟空小米-付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.5,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2019,
+                "statisticsValue": 195
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.6364,
+                "statisticsValue": 273
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.6667,
+                "statisticsValue": 78
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.3194,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.8966,
+                "statisticsValue": 676
+              }
+            ],
+            "total": 1820
+          },
+          {
+            "id": "233",
+            "memo": "付费金额",
+            "name": "悟空掌育-付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.206,
+                "statisticsValue": 199
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 199
+          },
+          {
+            "id": 0,
+            "memo": "",
+            "name": "付费金额汇总",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 598
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 966
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 429
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 117
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 936
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 754
+              }
+            ],
+            "total": 3800
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 125,
+        "unitType": 3,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "10",
+        "memo": "付费率",
+        "name": "付费率",
+        "sections": [
+          {
+            "id": "225",
+            "memo": "付费率",
+            "name": "悟空360-付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.1897,
+                "statisticsValue": 0.00011
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2619,
+                "statisticsValue": 0.00044
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.6479,
+                "statisticsValue": 0.00046
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.5517,
+                "statisticsValue": 0.00016
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.2832,
+                "statisticsValue": 0.00032
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.1441,
+                "statisticsValue": 0.00016
+              }
+            ],
+            "total": 0.00165
+          },
+          {
+            "id": "272",
+            "memo": "付费率",
+            "name": "悟空三基同创-付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.7414,
+                "statisticsValue": 0.00043
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.244,
+                "statisticsValue": 0.00041
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.6018,
+                "statisticsValue": 0.00068
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.6126,
+                "statisticsValue": 0.00068
+              }
+            ],
+            "total": 0.0022
+          },
+          {
+            "id": "310",
+            "memo": "付费率",
+            "name": "悟空华为-付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2143,
+                "statisticsValue": 0.00036
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0.00036
+          },
+          {
+            "id": "301",
+            "memo": "付费率",
+            "name": "悟空小度-付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "263",
+            "memo": "付费率",
+            "name": "悟空小米-付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.069,
+                "statisticsValue": 0.00004
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.119,
+                "statisticsValue": 0.0002
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.3521,
+                "statisticsValue": 0.00025
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.4483,
+                "statisticsValue": 0.00013
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.115,
+                "statisticsValue": 0.00013
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.2432,
+                "statisticsValue": 0.00027
+              }
+            ],
+            "total": 0.00102
+          },
+          {
+            "id": "234",
+            "memo": "付费率",
+            "name": "悟空掌育-付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.1607,
+                "statisticsValue": 0.00027
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0.00027
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 126,
+        "unitType": 4,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "11",
+        "memo": "付费人数",
+        "name": "付费人数",
+        "sections": [
+          {
+            "id": "224",
+            "memo": "付费人数",
+            "name": "悟空360-付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.3333,
+                "statisticsValue": 1
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.3333,
+                "statisticsValue": 4
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.4,
+                "statisticsValue": 4
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.3333,
+                "statisticsValue": 1
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.4,
+                "statisticsValue": 2
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.1667,
+                "statisticsValue": 1
+              }
+            ],
+            "total": 13
+          },
+          {
+            "id": "273",
+            "memo": "付费人数",
+            "name": "悟空三基同创-付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.3333,
+                "statisticsValue": 1
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0833,
+                "statisticsValue": 1
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.2,
+                "statisticsValue": 1
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.1667,
+                "statisticsValue": 1
+              }
+            ],
+            "total": 4
+          },
+          {
+            "id": "311",
+            "memo": "付费人数",
+            "name": "悟空华为-付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0833,
+                "statisticsValue": 1
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 1
+          },
+          {
+            "id": "300",
+            "memo": "付费人数",
+            "name": "悟空小度-付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "262",
+            "memo": "付费人数",
+            "name": "悟空小米-付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.3333,
+                "statisticsValue": 1
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.4167,
+                "statisticsValue": 5
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.6,
+                "statisticsValue": 6
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.6667,
+                "statisticsValue": 2
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.4,
+                "statisticsValue": 2
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.6667,
+                "statisticsValue": 4
+              }
+            ],
+            "total": 20
+          },
+          {
+            "id": "235",
+            "memo": "付费人数",
+            "name": "悟空掌育-付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0833,
+                "statisticsValue": 1
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 1
+          },
+          {
+            "id": 0,
+            "memo": "",
+            "name": "付费人数汇总",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 3
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 12
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 10
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 3
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 5
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 6
+              }
+            ],
+            "total": 39
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 127,
+        "unitType": 2,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "12",
+        "memo": "每日用户平均付费",
+        "name": "arpu",
+        "sections": [
+          {
+            "id": "223",
+            "memo": "每日用户平均付费",
+            "name": "悟空360-arpu",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.4985,
+                "statisticsValue": 0.02918
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0967,
+                "statisticsValue": 0.02173
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.6067,
+                "statisticsValue": 0.01819
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.5508,
+                "statisticsValue": 0.00624
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.6768,
+                "statisticsValue": 0.09803
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0813,
+                "statisticsValue": 0.00646
+              }
+            ],
+            "total": 0.17983
+          },
+          {
+            "id": "274",
+            "memo": "每日用户平均付费",
+            "name": "悟空三基同创-arpu",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.2889,
+                "statisticsValue": 0.01691
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.1457,
+                "statisticsValue": 0.03273
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.1847,
+                "statisticsValue": 0.02676
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.3355,
+                "statisticsValue": 0.02667
+              }
+            ],
+            "total": 0.10307
+          },
+          {
+            "id": "312",
+            "memo": "每日用户平均付费",
+            "name": "悟空华为-arpu",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.4796,
+                "statisticsValue": 0.10778
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0.10778
+          },
+          {
+            "id": "299",
+            "memo": "每日用户平均付费",
+            "name": "悟空小度-arpu",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "261",
+            "memo": "每日用户平均付费",
+            "name": "悟空小米-arpu",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.2127,
+                "statisticsValue": 0.01245
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0357,
+                "statisticsValue": 0.00803
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.3933,
+                "statisticsValue": 0.01179
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.4492,
+                "statisticsValue": 0.00509
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.1385,
+                "statisticsValue": 0.02006
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.5832,
+                "statisticsValue": 0.04636
+              }
+            ],
+            "total": 0.10378
+          },
+          {
+            "id": "236",
+            "memo": "每日用户平均付费",
+            "name": "悟空掌育-arpu",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2423,
+                "statisticsValue": 0.05444
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0.05444
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 128,
+        "unitType": 3,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "13",
+        "memo": "新增付费金额",
+        "name": "新增付费金额",
+        "sections": [
+          {
+            "id": "222",
+            "memo": "新增付费金额",
+            "name": "悟空360-新增付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "275",
+            "memo": "新增付费金额",
+            "name": "悟空三基同创-新增付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "313",
+            "memo": "新增付费金额",
+            "name": "悟空华为-新增付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "298",
+            "memo": "新增付费金额",
+            "name": "悟空小度-新增付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "260",
+            "memo": "新增付费金额",
+            "name": "悟空小米-新增付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "237",
+            "memo": "新增付费金额",
+            "name": "悟空掌育-新增付费金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": 0,
+            "memo": "",
+            "name": "新增付费金额汇总",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 129,
+        "unitType": 3,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "14",
+        "memo": "新增付费率",
+        "name": "新增付费率",
+        "sections": [
+          {
+            "id": "221",
+            "memo": "新增付费率",
+            "name": "悟空360-新增付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "276",
+            "memo": "新增付费率",
+            "name": "悟空三基同创-新增付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "314",
+            "memo": "新增付费率",
+            "name": "悟空华为-新增付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "297",
+            "memo": "新增付费率",
+            "name": "悟空小度-新增付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "259",
+            "memo": "新增付费率",
+            "name": "悟空小米-新增付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "238",
+            "memo": "新增付费率",
+            "name": "悟空掌育-新增付费率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 130,
+        "unitType": 4,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "15",
+        "memo": "新增付费人数",
+        "name": "新增付费人数",
+        "sections": [
+          {
+            "id": "220",
+            "memo": "新增付费人数",
+            "name": "悟空360-新增付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "277",
+            "memo": "新增付费人数",
+            "name": "悟空三基同创-新增付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "315",
+            "memo": "新增付费人数",
+            "name": "悟空华为-新增付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "296",
+            "memo": "新增付费人数",
+            "name": "悟空小度-新增付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "258",
+            "memo": "新增付费人数",
+            "name": "悟空小米-新增付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "239",
+            "memo": "新增付费人数",
+            "name": "悟空掌育-新增付费人数",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": 0,
+            "memo": "",
+            "name": "新增付费人数汇总",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 131,
+        "unitType": 2,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "16",
+        "memo": "每日付费用户平均付费",
+        "name": "arppu",
+        "sections": [
+          {
+            "id": "219",
+            "memo": "每日付费用户平均付费",
+            "name": "悟空360-每日付费用户平均付费",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.4348,
+                "statisticsValue": 260
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0734,
+                "statisticsValue": 48.75
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.4615,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.5,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.6133,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.1579,
+                "statisticsValue": 39
+              }
+            ],
+            "total": 724.75
+          },
+          {
+            "id": "278",
+            "memo": "每日付费用户平均付费",
+            "name": "悟空三基同创-每日付费用户平均付费",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.0652,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.1175,
+                "statisticsValue": 78
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.08,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.1579,
+                "statisticsValue": 39
+              }
+            ],
+            "total": 195
+          },
+          {
+            "id": "316",
+            "memo": "每日付费用户平均付费",
+            "name": "悟空华为-每日付费用户平均付费",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.4505,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 299
+          },
+          {
+            "id": "295",
+            "memo": "每日付费用户平均付费",
+            "name": "悟空小度-每日付费用户平均付费",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "257",
+            "memo": "每日付费用户平均付费",
+            "name": "悟空小米-每日付费用户平均付费",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.5,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0588,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.5385,
+                "statisticsValue": 45.5
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.5,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.3067,
+                "statisticsValue": 149.5
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.6842,
+                "statisticsValue": 169
+              }
+            ],
+            "total": 741
+          },
+          {
+            "id": "240",
+            "memo": "每日付费用户平均付费",
+            "name": "悟空掌育-每日付费用户平均付费",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2998,
+                "statisticsValue": 199
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 100,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 199
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 132,
+        "unitType": 3,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "19",
+        "memo": "30日留存",
+        "name": "30日留存",
+        "sections": [],
+        "selected": false,
+        "spectacularsDimensionId": 135,
+        "unitType": 2,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "20",
+        "memo": "入账金额",
+        "name": "入账金额",
+        "sections": [
+          {
+            "id": "216",
+            "memo": "入账金额",
+            "name": "悟空360-入账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.4348,
+                "statisticsValue": 260
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2019,
+                "statisticsValue": 195
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.3636,
+                "statisticsValue": 156
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.8125,
+                "statisticsValue": 338
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.6389,
+                "statisticsValue": 598
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0517,
+                "statisticsValue": 39
+              }
+            ],
+            "total": 1885
+          },
+          {
+            "id": "281",
+            "memo": "入账金额",
+            "name": "悟空三基同创-入账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.0652,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0807,
+                "statisticsValue": 78
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0417,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.0517,
+                "statisticsValue": 39
+              }
+            ],
+            "total": 195
+          },
+          {
+            "id": "319",
+            "memo": "入账金额",
+            "name": "悟空华为-入账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.3095,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 299
+          },
+          {
+            "id": "292",
+            "memo": "入账金额",
+            "name": "悟空小度-入账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "254",
+            "memo": "入账金额",
+            "name": "悟空小米-入账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.5,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2019,
+                "statisticsValue": 195
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.6364,
+                "statisticsValue": 273
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.1875,
+                "statisticsValue": 78
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.3194,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0.8966,
+                "statisticsValue": 676
+              }
+            ],
+            "total": 1820
+          },
+          {
+            "id": "243",
+            "memo": "入账金额",
+            "name": "悟空掌育-入账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.206,
+                "statisticsValue": 199
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 199
+          },
+          {
+            "id": 0,
+            "memo": "",
+            "name": "入账金额汇总",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 598
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 966
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 429
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 416
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 936
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 754
+              }
+            ],
+            "total": 4398
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 183,
+        "unitType": 2,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "22",
+        "memo": "出账金额",
+        "name": "出账金额",
+        "sections": [
+          {
+            "id": "214",
+            "memo": "出账金额",
+            "name": "悟空360-出账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.0417,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.3867,
+                "statisticsValue": 377
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 975
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 598
+              }
+            ],
+            "total": 1989
+          },
+          {
+            "id": "283",
+            "memo": "出账金额",
+            "name": "悟空三基同创-出账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "321",
+            "memo": "出账金额",
+            "name": "悟空华为-出账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.6389,
+                "statisticsValue": 598
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 598
+          },
+          {
+            "id": "290",
+            "memo": "出账金额",
+            "name": "悟空小度-出账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "252",
+            "memo": "出账金额",
+            "name": "悟空小米-出账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 676
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.3194,
+                "statisticsValue": 299
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.6133,
+                "statisticsValue": 598
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 1651
+          },
+          {
+            "id": "245",
+            "memo": "出账金额",
+            "name": "悟空掌育-出账金额",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": 0,
+            "memo": "",
+            "name": "出账金额汇总",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 676
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 936
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 975
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 975
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 39
+              },
+              {
+                "cutDay": "2025-09-03",
+                "id": 0,
+                "proportion": 1,
+                "statisticsValue": 598
+              }
+            ],
+            "total": 4238
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 184,
+        "unitType": 2,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "24",
+        "memo": "次日留存率",
+        "name": "次日留存率",
+        "sections": [
+          {
+            "id": "212",
+            "memo": "次日留存率",
+            "name": "悟空360-次日留存率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.263,
+                "statisticsValue": 0.51
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.2733,
+                "statisticsValue": 0.46521
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.256,
+                "statisticsValue": 0.50761
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.2571,
+                "statisticsValue": 0.38461
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.2759,
+                "statisticsValue": 0.44329
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.1782,
+                "statisticsValue": 0.51428
+              }
+            ],
+            "total": 2.825
+          },
+          {
+            "id": "285",
+            "memo": "次日留存率",
+            "name": "悟空三基同创-次日留存率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.1496,
+                "statisticsValue": 0.29012
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.1309,
+                "statisticsValue": 0.22282
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.155,
+                "statisticsValue": 0.30731
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.1306,
+                "statisticsValue": 0.1954
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.127,
+                "statisticsValue": 0.20408
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.0886,
+                "statisticsValue": 0.25555
+              }
+            ],
+            "total": 1.47528
+          },
+          {
+            "id": "323",
+            "memo": "次日留存率",
+            "name": "悟空华为-次日留存率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.1473,
+                "statisticsValue": 0.28571
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.1602,
+                "statisticsValue": 0.27272
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.2328,
+                "statisticsValue": 0.46153
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.1337,
+                "statisticsValue": 0.2
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.249,
+                "statisticsValue": 0.4
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.3465,
+                "statisticsValue": 1
+              }
+            ],
+            "total": 2.61996
+          },
+          {
+            "id": "288",
+            "memo": "次日留存率",
+            "name": "悟空小度-次日留存率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              }
+            ],
+            "total": 0
+          },
+          {
+            "id": "250",
+            "memo": "次日留存率",
+            "name": "悟空小米-次日留存率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.1473,
+                "statisticsValue": 0.28571
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.1175,
+                "statisticsValue": 0.2
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.0841,
+                "statisticsValue": 0.16666
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.2228,
+                "statisticsValue": 0.33333
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0,
+                "statisticsValue": 0
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.1733,
+                "statisticsValue": 0.5
+              }
+            ],
+            "total": 1.4857
+          },
+          {
+            "id": "247",
+            "memo": "次日留存率",
+            "name": "悟空掌育-次日留存率",
+            "statistics": [
+              {
+                "cutDay": "2025-08-28",
+                "id": 0,
+                "proportion": 0.2928,
+                "statisticsValue": 0.56783
+              },
+              {
+                "cutDay": "2025-08-29",
+                "id": 0,
+                "proportion": 0.318,
+                "statisticsValue": 0.54133
+              },
+              {
+                "cutDay": "2025-08-30",
+                "id": 0,
+                "proportion": 0.2722,
+                "statisticsValue": 0.53964
+              },
+              {
+                "cutDay": "2025-08-31",
+                "id": 0,
+                "proportion": 0.2559,
+                "statisticsValue": 0.38283
+              },
+              {
+                "cutDay": "2025-09-01",
+                "id": 0,
+                "proportion": 0.3481,
+                "statisticsValue": 0.55924
+              },
+              {
+                "cutDay": "2025-09-02",
+                "id": 0,
+                "proportion": 0.2135,
+                "statisticsValue": 0.61607
+              }
+            ],
+            "total": 3.20694
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 140,
+        "unitType": 2,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      },
+      {
+        "createName": "admin",
+        "createTime": "2020-01-07 13:30:02",
+        "id": "25",
+        "memo": "7日留存率",
+        "name": "7日留存率",
+        "sections": [
+          {
+            "id": "211",
+            "memo": "7日留存率",
+            "name": "悟空360-7日留存率",
+            "statistics": [],
+            "total": 0
+          },
+          {
+            "id": "286",
+            "memo": "7日留存率",
+            "name": "悟空三基同创-7日留存率",
+            "statistics": [],
+            "total": 0
+          },
+          {
+            "id": "324",
+            "memo": "7日留存率",
+            "name": "悟空华为-7日留存率",
+            "statistics": [],
+            "total": 0
+          },
+          {
+            "id": "287",
+            "memo": "7日留存率",
+            "name": "悟空小度-7日留存率",
+            "statistics": [],
+            "total": 0
+          },
+          {
+            "id": "249",
+            "memo": "7日留存率",
+            "name": "悟空小米-7日留存率",
+            "statistics": [],
+            "total": 0
+          },
+          {
+            "id": "248",
+            "memo": "7日留存率",
+            "name": "悟空掌育-7日留存率",
+            "statistics": [],
+            "total": 0
+          }
+        ],
+        "selected": false,
+        "spectacularsDimensionId": 141,
+        "unitType": 2,
+        "updateName": "",
+        "updateTime": "2022-08-09 09:16:40",
+        "viewType": "line"
+      }
+    ],
+    "id": 19,
+    "name": "test",
+    "userId": 1
+  },
+  "message": "SUCCESS",
+  "voice": ""
+}

+ 553 - 536
src/app/shop/admin/data/report/index.vue

@@ -1,334 +1,377 @@
 <template>
   <div class="data-report-main">
-    <!-- 顶部导航栏 -->
-    <div class="top-navbar">
-      <div class="navbar-left">
-        <div class="logo-section">
-          <div class="logo-icon">📊</div>
-          <span class="logo-text">数据报表</span>
-        </div>
-      </div>
-      <div class="navbar-right">
-        <el-button type="text" class="nav-button">
-          <el-icon><Bell /></el-icon>
-        </el-button>
-        <el-button type="text" class="nav-button">
-          <el-icon><Setting /></el-icon>
-        </el-button>
-        <div class="user-avatar">
-          <el-avatar size="small">U</el-avatar>
-        </div>
-      </div>
-    </div>
-
     <!-- 主要内容区域 -->
     <div class="main-content">
-      <!-- 左侧导航栏 -->
-      <div class="sidebar">
-        <div class="sidebar-menu">
-          <div class="menu-item active" @click="activeTab = 'overview'">
-            <div class="menu-icon">📈</div>
-            <span class="menu-text">概览</span>
-          </div>
-          <div class="menu-item" @click="activeTab = 'charts'; showDataDisplay()">
-            <div class="menu-icon">📊</div>
-            <span class="menu-text">图表</span>
-          </div>
-          <div class="menu-item" @click="activeTab = 'dashboard'; showAddDashboard()">
-            <div class="menu-icon">📋</div>
-            <span class="menu-text">看板</span>
-          </div>
-          <div class="menu-item" @click="activeTab = 'reports'; showReportDetail()">
-            <div class="menu-icon">📄</div>
-            <span class="menu-text">报表</span>
-          </div>
-          <div class="menu-item" @click="showDimensionManagement">
-            <div class="menu-icon">⚙️</div>
-            <span class="menu-text">设置</span>
-          </div>
-        </div>
-      </div>
-
-      <!-- 右侧内容区域 -->
-      <div class="content-area">
-        <!-- 概览页面 -->
-        <div v-if="activeTab === 'overview'" class="overview-content">
-          <!-- 页面标题 -->
-          <div class="page-header">
-            <h1 class="page-title">数据概览</h1>
-            <p class="page-subtitle">实时数据分析与监控</p>
-            <div class="header-actions">
-              <el-button @click="getYesterdayData" :loading="loading">刷新数据</el-button>
-              <el-button type="primary" @click="showDimensionManagement">
-                <el-icon><Setting /></el-icon>
-                维度管理
+      <!-- 顶部区域:左侧看板列表 + 右侧新增图表 -->
+      <div class="top-section">
+        <!-- 左侧看板列表区域 -->
+        <div class="dashboard-list-section">
+          <div class="section-header">
+            <h2 class="section-title">
+              <el-icon>
+                <Grid />
+              </el-icon>
+              看板列表
+            </h2>
+            <div class="section-actions">
+              <el-button type="primary" @click="addDashboard">
+                <el-icon>
+                  <Plus />
+                </el-icon>
+                新增看板
+              </el-button>
+              <el-button type="primary" @click="addChart">
+                <el-icon>
+                  <Plus />
+                </el-icon>
+                新增图表
               </el-button>
             </div>
           </div>
-          
-          <!-- 数据图表网格 -->
-          <div v-loading="loading" class="charts-grid">
-            <div 
-              v-for="item in yesterdayData" 
-              :key="item.id" 
-              class="chart-card"
-            >
-              <div class="chart-header">
-                <h3>{{ item.name }}</h3>
-                <div class="chart-actions">
-                  <el-button text size="small" @click="showDataDisplay(item.name)">
-                    查看详情
-                  </el-button>
+          <div class="dashboard-buttons" v-loading="dashboardLoading">
+            <div v-for="dashboard in dashboardList" :key="dashboard.id" class="dashboard-card"
+              :class="{ active: selectedDashboard?.id === dashboard.id }" @click="selectDashboard(dashboard)">
+              <div class="dashboard-content">
+                <div class="dashboard-icon">
+                  <el-icon>
+                    <Grid />
+                  </el-icon>
                 </div>
-              </div>
-              <div class="chart-content">
-                <div class="chart-summary">
-                  <div 
-                    v-for="section in item.sections" 
-                    :key="section.id"
-                    class="summary-item"
-                  >
-                    <div class="summary-label">{{ section.sectionName }}</div>
-                    <div class="summary-value">
-                      {{ formatValue(section.statisticsValue, item.unitType) }}
-                    </div>
-                  </div>
+                <div class="dashboard-info">
+                  <div class="dashboard-name">{{ dashboard.name }}</div>
                 </div>
-                <!-- 这里可以添加实际的图表组件 -->
-                <div class="chart-placeholder">
-                  <div class="chart-type-indicator">{{ getChartTypeLabel(item.viewType) }}</div>
+                <div class="dashboard-actions">
+                  <el-button size="small" type="text" @click.stop="editDashboard(dashboard)" class="action-btn">
+                    <el-icon>
+                      <Edit />
+                    </el-icon>
+                  </el-button>
+                  <el-button size="small" type="text" @click.stop="deleteDashboard(dashboard)"
+                    class="action-btn delete-btn">
+                    <el-icon>
+                      <Delete />
+                    </el-icon>
+                  </el-button>
                 </div>
               </div>
             </div>
-          </div>
-          
-          <!-- 统计摘要 -->
-          <div class="stats-summary">
-            <div class="summary-card">
-              <div class="summary-title">今日概览</div>
-              <div class="summary-stats">
-                <div class="summary-stat">
-                  <span class="stat-label">总用户数</span>
-                  <span class="stat-value">{{ statsData.totalUsers.toLocaleString() }}</span>
-                </div>
-                <div class="summary-stat">
-                  <span class="stat-label">总订单数</span>
-                  <span class="stat-value">{{ statsData.totalOrders.toLocaleString() }}</span>
-                </div>
-                <div class="summary-stat">
-                  <span class="stat-label">总销售额</span>
-                  <span class="stat-value">¥{{ statsData.totalSales.toLocaleString() }}</span>
-                </div>
-              </div>
+            <div v-if="!dashboardList.length" class="empty-state">
+              <div class="empty-icon">📋</div>
+              <div class="empty-text">暂无看板数据</div>
             </div>
           </div>
         </div>
 
-        <!-- 图表页面 -->
-        <div v-if="activeTab === 'charts'" class="charts-content">
-          <div class="page-header">
-            <h1 class="page-title">数据图表</h1>
-            <p class="page-subtitle">可视化数据分析</p>
-          </div>
-          <div class="chart-placeholder">
-            <div class="placeholder-content">
-              <div class="placeholder-icon">📊</div>
-              <h3>图表功能开发中</h3>
-              <p>点击此处查看数据图表</p>
-            </div>
+
+      </div>
+
+      <!-- 下方图表数据显示区域 -->
+      <div class="charts-display-section">
+        <div class="section-header">
+          <h2 class="section-title">
+            <el-icon>
+              <TrendCharts />
+            </el-icon>
+            {{ selectedDashboard ? selectedDashboard.name : '数据图表' }}
+          </h2>
+          <div class="section-actions">
+            <el-button @click="refreshChartData" :loading="loading" size="small">
+              <el-icon>
+                <Refresh />
+              </el-icon>
+              刷新数据
+            </el-button>
+            <el-button @click="showDimensionManagement" size="small">
+              <el-icon>
+                <Setting />
+              </el-icon>
+              维度管理
+            </el-button>
           </div>
         </div>
 
-        <!-- 看板页面 -->
-        <div v-if="activeTab === 'dashboard'" class="dashboard-content">
-          <div class="page-header">
-            <h1 class="page-title">数据看板</h1>
-            <p class="page-subtitle">自定义数据看板</p>
-          </div>
-          <div class="dashboard-placeholder">
-            <div class="placeholder-content">
-              <div class="placeholder-icon">📋</div>
-              <h3>看板功能开发中</h3>
-              <p>新增看板和图表功能</p>
+        <!-- 图表网格 -->
+        <div v-loading="loading" class="charts-grid">
+          <div v-for="chart in currentCharts" :key="chart.id" class="chart-card">
+            <div class="chart-header">
+              <h3>{{ chart.name }}</h3>
+              <div class="chart-actions">
+                <el-button text size="small" @click="showChartDetail(chart)">
+                  <el-icon>
+                    <View />
+                  </el-icon>
+                  查看详情
+                </el-button>
+                <el-button text size="small" @click="editChart(chart)">
+                  <el-icon>
+                    <Edit />
+                  </el-icon>
+                  编辑
+                </el-button>
+              </div>
+            </div>
+            <div class="chart-content">
+              <div class="chart-summary">
+                <div v-for="section in chart.sections" :key="section.id" class="summary-item">
+                  <div class="summary-label">{{ section.sectionName || section.name }}</div>
+                  <div class="summary-value">
+                    {{ formatValue(section.statisticsValue || section.total, chart.unitType) }}
+                  </div>
+                </div>
+              </div>
+              <div class="chart-placeholder">
+                <div class="chart-type-indicator">{{ getChartTypeLabel(chart.viewType) }}</div>
+              </div>
             </div>
           </div>
-        </div>
 
-        <!-- 报表页面 -->
-        <div v-if="activeTab === 'reports'" class="reports-content">
-          <div class="page-header">
-            <h1 class="page-title">数据报表</h1>
-            <p class="page-subtitle">详细数据报表</p>
-          </div>
-          <div class="report-placeholder">
-            <div class="placeholder-content">
-              <div class="placeholder-icon">📄</div>
-              <h3>报表功能开发中</h3>
-              <p>报表详情页面</p>
-            </div>
+          <!-- 空状态 -->
+          <div v-if="!currentCharts.length" class="empty-charts">
+            <div class="empty-icon">📊</div>
+            <div class="empty-text">{{ selectedDashboard ? '该看板暂无图表数据' : '请选择看板查看图表数据' }}</div>
+            <el-button v-if="selectedDashboard" type="primary" @click="addChart">
+              添加图表
+            </el-button>
           </div>
         </div>
       </div>
     </div>
-
-    <!-- 维度管理对话框已改为 useModal 调用 -->
-    
-    <!-- 数据展示对话框已改为 useModal 调用 -->
-
-    <!-- 新增看板对话框已改为 useModal 调用 -->
-
-    <!-- 报表详情对话框已改为 useModal 调用 -->
   </div>
 </template>
 <script setup>
-import { onMounted, reactive, ref } from 'vue';
-import { ElMessage } from 'element-plus';
-import { Bell, Setting, ArrowRight } from '@element-plus/icons-vue';
-import { useModal } from '@/sheep/components/sa-modal/sa-modal.vue';
+import { onMounted, reactive, ref, computed } from 'vue';
+import { ElMessage, ElMessageBox } from 'element-plus';
+import { Setting, Plus, Grid, View, Edit, Delete, TrendCharts, Refresh } from '@element-plus/icons-vue';
+import { useModal } from '@/sheep/hooks';
 import { api } from '../data.service.js';
-import DashboardTabs from './components/dashboard-tabs.vue';
-import DimensionManagement from './components/dimension-management.vue';
-import DataDisplayModal from './components/data-display-modal.vue';
-import AddDashboardModal from './components/add-dashboard-modal.vue';
-import ReportDetailModal from './components/report-detail-modal.vue';
-
-const components = {
-  DashboardTabs,
-  DimensionManagement,
-  DataDisplayModal,
-  AddDashboardModal,
-  ReportDetailModal
-};
-
-// 当前活动标签
-const activeTab = ref('overview');
-// 维度管理对话框已改为 useModal
-// 数据展示对话框
-const dataDisplayVisible = ref(false);
-const currentDataType = ref('');
-const dashboardRef = ref();
-// 新增看板对话框
-const addDashboardVisible = ref(false);
-// 报表详情对话框已改为 useModal 调用
-
-// 统计数据
-const statsData = reactive({
-  totalSales: 0,
-  totalOrders: 0,
-  totalUsers: 0,
-  totalGoods: 0,
-});
+import dimensionManagementEdit from './components/dimensionManagementEdit.vue';
+import dataDisplayEdit from './components/dataDisplayEdit.vue';
+import dashboardEdit from './components/dashboardEdit.vue';
+import chartEdit from './components/chartEdit.vue';
 
-// 昨日数据
-const yesterdayData = ref([]);
+// 响应式数据
 const loading = ref(false);
+const dashboardLoading = ref(false);
+const selectedDashboard = ref(null);
+const dashboardList = ref([]);
+const chartData = ref([]);
+
+// 计算当前选中看板的图表数据
+const currentCharts = computed(() => {
+  if (!selectedDashboard.value) return [];
+  return chartData.value.filter(chart =>
+    chart.dashboardId === selectedDashboard.value.id
+  );
+});
 
-// 获取昨日数据
-async function getYesterdayData() {
+// 获取看板列表数据
+async function getDashboardList() {
+  dashboardLoading.value = true;
   try {
-    loading.value = true;
-    // 使用真实API或mock数据
-    const response = await api.report.spectaculars.yesterdayData();
-    // 使用API数据
-    const result = response;
-    
-    if (result.code === '200') {
-      yesterdayData.value = result.data;
-      // 计算统计数据
-      calculateStats(result.data);
+    const { code, data } = await api.report.spectaculars.list({
+      page: 1,
+      size: 100,
+      userId: '' // 可以根据实际需要传入用户ID
+    });
+    if (code == 200) {
+      // 根据实际返回的数据结构处理
+      dashboardList.value = data.list || data || [];
+      // 默认选中第一个看板并调用详情接口
+      if (dashboardList.value.length > 0 && !selectedDashboard.value) {
+        selectedDashboard.value = dashboardList.value[0];
+        // 自动调用第一个看板的详情接口
+        await getChartData(dashboardList.value[0].id);
+      }
+    } else {
+      ElMessage.error('获取看板列表失败');
+      dashboardList.value = [];
     }
   } catch (error) {
-    // API调用失败
-    console.error('Failed to load yesterday data:', error);
-    ElMessage.error('数据加载失败');
+    console.error('获取看板列表失败:', error);
+    ElMessage.error('获取看板列表失败,请重试');
+    dashboardList.value = [];
+  } finally {
+    dashboardLoading.value = false;
+  }
+}
+
+// 获取图表数据
+async function getChartData(dashboardId) {
+  if (!dashboardId) return;
+
+  loading.value = true;
+  try {
+    const { code, data } = await api.report.spectaculars.detail({
+      id: dashboardId,
+      startTime: '', // 可以根据实际需要设置时间范围
+      endTime: '',
+      timeInterval: 7
+    });
+    if (code == 200) {
+      // 更新当前看板的图表数据
+      const newCharts = Array.isArray(data) ? data : [data];
+      chartData.value = chartData.value.filter(chart => chart.dashboardId !== dashboardId);
+      chartData.value.push(...newCharts.map(chart => ({ ...chart, dashboardId })));
+      // 处理维度数据用于图表显示
+      processChartData(data);
+    } else {
+      ElMessage.error('获取图表数据失败');
+    }
+  } catch (error) {
+    console.error('获取图表数据失败:', error);
+    ElMessage.error('获取图表数据失败,请重试');
   } finally {
     loading.value = false;
   }
 }
 
-// 计算统计数据
-function calculateStats(data) {
-  let totalUsers = 0;
-  let totalOrders = 0;
-  let totalSales = 0;
-  let totalGoods = 0;
-  
-  data.forEach(item => {
-    item.sections.forEach(section => {
-      if (item.name.includes('用户')) {
-        totalUsers += section.statisticsValue;
-      } else if (item.name.includes('订单')) {
-        totalOrders += section.statisticsValue;
-      } else if (item.name.includes('金额') || item.name.includes('付费')) {
-        totalSales += section.statisticsValue;
-      } else if (item.name.includes('商品')) {
-        totalGoods += section.statisticsValue;
+// 刷新图表数据
+async function refreshChartData() {
+  if (selectedDashboard.value) {
+    await getChartData(selectedDashboard.value.id);
+  }
+}
+
+// 选择看板
+async function selectDashboard(dashboard) {
+  selectedDashboard.value = dashboard;
+  await getChartData(dashboard.id);
+}
+
+// 处理图表数据
+function processChartData(data) {
+  // 处理从detail接口返回的数据,转换为图表可用格式
+  if (data && data.dimensions) {
+    console.log('处理图表数据:', data.dimensions);
+  }
+}
+
+
+
+// 删除看板
+function deleteDashboard(dashboard) {
+  ElMessageBox.confirm(`确定要删除看板 "${dashboard.name}" 吗?`, '提示', {
+    confirmButtonText: '确定',
+    cancelButtonText: '取消',
+    type: 'warning'
+  }).then(async () => {
+    try {
+      // 调用删除API
+      const { code } = await api.report.spectaculars.delete(dashboard.id);
+      if (code == 200) {
+        ElMessage.success('看板删除成功');
+        getDashboardList();
+      } else {
+        ElMessage.error('删除看板失败');
       }
-    });
-  });
-  
-  Object.assign(statsData, {
-    totalSales,
-    totalOrders,
-    totalUsers,
-    totalGoods
+    } catch (error) {
+      console.error('删除看板失败:', error);
+      ElMessage.error('删除看板失败,请重试');
+    }
+  }).catch(() => {
+    // 取消删除
   });
 }
 
+// 显示图表详情
+function showChartDetail(chart) {
+  showDataDisplay({ chart });
+}
+
+
+
 // 显示数据展示页面
-const showDataDisplay = (type) => {
-  useModal(() => import('./components/data-display-modal.vue'), {
-    title: `${type} - 数据详情`,
-    width: '90%',
-    height: '80vh',
-    componentProps: {
-      dataType: type
+function showDataDisplay(options) {
+  useModal(
+    dataDisplayEdit,
+    {
+      title: `${options.chart?.name || options.dataType || '数据'} - 数据详情`,
+      width: '90%',
+      height: '80vh',
+      dataType: options.dataType,
+      chart: options.chart
     },
-    confirm: () => {
-      ElMessage.success('数据查看完成');
-      return true;
+    {
+      confirm: () => {
+        getChartData(selectedDashboard.value?.id);
+      }
     }
-  });
-};
-
-// 显示新增看板页面
-const showAddDashboard = () => {
-  useModal(() => import('./components/add-dashboard-modal.vue'), {
-    title: '新增看板',
-    width: '80%',
-    height: '80vh',
-    componentProps: {
-      dashboardData: {}
+  );
+}
+
+// 新增看板
+function addDashboard() {
+  useModal(
+    dashboardEdit,
+    { title: '新增看板', type: 'add', width: '500px' },
+    {
+      confirm: () => {
+        getDashboardList();
+      }
+    }
+  );
+}
+
+// 编辑看板
+function editDashboard(row) {
+  useModal(
+    dashboardEdit,
+    {
+      title: '编辑看板',
+      type: 'edit',
+      id: row.id,
+      dashboardData: row
     },
-    confirm: (modalRef) => {
-      console.log('保存看板数据:', modalRef.dashboardData);
-      ElMessage.success('看板创建成功!');
-      refreshData();
-      return true;
+    {
+      confirm: () => {
+        getDashboardList();
+      }
     }
-  });
-};
-
-// 显示报表详情页面
-const showReportDetail = () => {
-  useModal(() => import('./components/report-detail-modal.vue'), {
-    title: '数据报表详情',
-    width: '90%',
-    height: '85vh',
-    componentProps: {
-      reportData: {
-        title: '数据报表详情',
-        type: 'general'
+  );
+}
+
+
+
+// 新增图表
+function addChart() {
+  if (!selectedDashboard.value) {
+    ElMessage.warning('请先选择一个看板');
+    return;
+  }
+  
+  useModal(
+    chartEdit,
+    {
+      title: '新增图表',
+      type: 'add',
+      spectId: selectedDashboard.value?.id
+    },
+    {
+      confirm: () => {
+        getChartData(selectedDashboard.value?.id);
       }
+    }
+  );
+}
+
+// 编辑图表
+function editChart(row) {
+  useModal(
+    chartEdit,
+    {
+      title: '编辑图表',
+      type: 'edit',
+      id: row.id,
+      chartData: row,
+      dashboardId: selectedDashboard.value?.id
     },
-    confirm: (modalRef) => {
-      console.log('保存报表数据:', modalRef.reportData);
-      ElMessage.success('报表保存成功!');
-      refreshData();
-      return true;
+    {
+      confirm: () => {
+        getChartData(selectedDashboard.value?.id);
+      }
     }
-  });
-};
+  );
+}
 
 // 格式化数值
 function formatValue(value, unitType) {
@@ -352,31 +395,30 @@ function getChartTypeLabel(viewType) {
   return typeMap[viewType] || '图表';
 }
 
-// 刷新数据
-const refreshData = () => {
-  getYesterdayData();
-  if (dashboardRef.value) {
-    dashboardRef.value.refreshAllTabs();
-  }
-};
-
-// 显示维度管理
-const showDimensionManagement = () => {
-  useModal(() => import('./components/dimension-management.vue'), {
-    title: '维度管理',
-    width: '90%',
-    height: '80vh',
-    componentProps: {},
-    confirm: () => {
-      refreshData();
-      return true;
+
+
+// 维度管理
+function showDimensionManagement() {
+  useModal(
+    dimensionManagementEdit,
+    {
+      title: '维度管理',
+      width: '90%',
+      height: '80vh'
+    },
+    {
+      confirm: () => {
+        getDashboardList();
+        if (selectedDashboard.value) {
+          getChartData(selectedDashboard.value.id);
+        }
+      }
     }
-  });
-};
+  );
+}
 
 onMounted(() => {
-  getYesterdayData();
-  refreshData();
+  getDashboardList();
 });
 </script>
 <style scoped>
@@ -384,364 +426,339 @@ onMounted(() => {
   height: 100vh;
   display: flex;
   flex-direction: column;
-  background: #f5f7fa;
+  background-color: #f5f7fa;
+  padding: 20px;
 }
 
-/* 顶部导航栏 */
-.top-navbar {
-  height: 60px;
-  background: #ffffff;
-  border-bottom: 1px solid #e4e7ed;
+/* 主要内容区域 */
+.main-content {
+  flex: 1;
   display: flex;
-  align-items: center;
-  justify-content: space-between;
-  padding: 0 24px;
-  box-shadow: 0 2px 4px rgba(0, 0, 0, 0.05);
+  flex-direction: column;
+  gap: 20px;
+  overflow: hidden;
 }
 
-.navbar-left {
+/* 顶部区域 */
+.top-section {
   display: flex;
-  align-items: center;
+  gap: 20px;
 }
 
-.logo-section {
+/* 左侧看板列表区域 */
+.dashboard-list-section {
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
   display: flex;
-  align-items: center;
-  gap: 12px;
+  flex-direction: column;
+  flex: 1;
 }
 
-.logo-icon {
-  font-size: 24px;
+.section-header {
+  display: flex;
+  justify-content: space-between;
+  align-items: center;
+  margin-bottom: 16px;
+  padding-bottom: 12px;
+  border-bottom: 1px solid #f0f2f5;
 }
 
-.logo-text {
+.section-title {
   font-size: 18px;
   font-weight: 600;
   color: #303133;
-}
-
-.navbar-right {
+  margin: 0;
   display: flex;
   align-items: center;
-  gap: 16px;
-}
-
-.nav-button {
-  color: #606266;
-  font-size: 18px;
-}
-
-.user-avatar {
-  margin-left: 8px;
+  gap: 8px;
 }
 
-/* 主要内容区域 */
-.main-content {
-  flex: 1;
+.section-actions {
   display: flex;
-  overflow: hidden;
-}
-
-/* 左侧导航栏 */
-.sidebar {
-  width: 200px;
-  background: #ffffff;
-  border-right: 1px solid #e4e7ed;
-  padding: 24px 0;
+  gap: 8px;
 }
 
-.sidebar-menu {
+.dashboard-buttons {
   display: flex;
-  flex-direction: column;
-  gap: 8px;
-  padding: 0 16px;
+  flex-wrap: wrap;
+  gap: 14px;
+  overflow-y: auto;
 }
 
-.menu-item {
-  display: flex;
-  align-items: center;
-  gap: 12px;
-  padding: 12px 16px;
+.dashboard-card {
+  background: #fff;
+  border: 1px solid #e4e7ed;
   border-radius: 8px;
+  padding: 14px;
   cursor: pointer;
   transition: all 0.3s ease;
-  color: #606266;
+  position: relative;
+  box-shadow: 0 1px 3px rgba(0, 0, 0, 0.05);
+  min-width: 180px;
+  max-width: 300px;
+  width: fit-content;
 }
 
-.menu-item:hover {
-  background: #f0f9ff;
-  color: #409eff;
+.dashboard-card.active {
+  border-color: #409eff;
+  background: linear-gradient(135deg, #ecf5ff 0%, #f0f9ff 100%);
+  box-shadow: 0 2px 8px rgba(64, 158, 255, 0.2);
 }
 
-.menu-item.active {
-  background: #409eff;
-  color: #ffffff;
+.dashboard-content {
+  display: flex;
+  align-items: flex-start;
+  gap: 12px;
 }
 
-.menu-icon {
-  font-size: 18px;
-  width: 20px;
-  text-align: center;
+.dashboard-icon {
+  width: 36px;
+  height: 36px;
+  background: linear-gradient(135deg, #409eff, #67c23a);
+  border-radius: 6px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: white;
+  font-size: 16px;
+  flex-shrink: 0;
 }
 
-.menu-text {
-  font-size: 14px;
-  font-weight: 500;
+.dashboard-info {
+  flex: 1;
+  min-width: 0;
 }
 
-/* 右侧内容区域 */
-.content-area {
-  flex: 1;
-  padding: 24px;
-  overflow-y: auto;
+.dashboard-name {
+  font-size: 15px;
+  font-weight: 600;
+  color: #303133;
+  line-height: 1.4;
+  word-wrap: break-word;
+  word-break: break-all;
 }
 
-/* 页面标题 */
-.page-header {
-  text-align: center;
-  margin-bottom: 40px;
-  padding: 40px 0;
-  background: linear-gradient(135deg, #667eea 0%, #764ba2 100%);
-  color: white;
-  border-radius: 16px;
-  position: relative;
-  overflow: hidden;
+.dashboard-actions {
+  display: flex;
+  gap: 2px;
+  opacity: 1;
+  flex-shrink: 0;
+  margin-left: 8px;
 }
 
-.page-header::before {
-  content: '';
-  position: absolute;
-  top: 0;
-  left: 0;
-  right: 0;
-  bottom: 0;
-  background: url('data:image/svg+xml,<svg xmlns="http://www.w3.org/2000/svg" viewBox="0 0 100 100"><defs><pattern id="grain" width="100" height="100" patternUnits="userSpaceOnUse"><circle cx="50" cy="50" r="1" fill="%23ffffff" opacity="0.1"/></pattern></defs><rect width="100" height="100" fill="url(%23grain)"/></svg>');
-  opacity: 0.3;
+.action-btn {
+  width: 24px;
+  height: 24px;
+  border-radius: 4px;
+  display: flex;
+  align-items: center;
+  justify-content: center;
+  color: #606266;
+  transition: all 0.2s ease;
 }
 
-.page-title {
-  font-size: 32px;
-  font-weight: 700;
-  margin: 0 0 8px 0;
-  position: relative;
-  z-index: 1;
+.action-btn:hover {
+  background: #f5f7fa;
+  color: #409eff;
 }
 
-.page-subtitle {
-  font-size: 16px;
-  opacity: 0.9;
-  margin: 0 0 20px 0;
-  position: relative;
-  z-index: 1;
+.delete-btn:hover {
+  background: #fef0f0;
+  color: #f56c6c;
 }
 
-.header-actions {
-  position: relative;
-  z-index: 1;
+.empty-state {
   display: flex;
+  flex-direction: column;
+  align-items: center;
   justify-content: center;
-  gap: 12px;
-  margin-top: 20px;
+  width: 100%;
+  height: 100%;
+  color: #909399;
+  text-align: center;
+  min-height: 100px;
 }
 
-.header-actions .el-button {
-  background: rgba(255, 255, 255, 0.2);
-  border: 1px solid rgba(255, 255, 255, 0.3);
-  color: white;
+.empty-icon {
+  font-size: 48px;
+  margin-bottom: 12px;
 }
 
-.header-actions .el-button:hover {
-  background: rgba(255, 255, 255, 0.3);
-  border-color: rgba(255, 255, 255, 0.5);
+.empty-text {
+  font-size: 14px;
+  margin-bottom: 16px;
+}
+
+
+
+
+
+/* 下方图表显示区域 */
+.charts-display-section {
+  flex: 1;
+  background: white;
+  border-radius: 12px;
+  padding: 20px;
+  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
+  display: flex;
+  flex-direction: column;
+  min-height: 0;
 }
 
-/* 图表网格样式 */
+/* 图表网格 */
 .charts-grid {
+  flex: 1;
   display: grid;
-  grid-template-columns: repeat(auto-fit, minmax(400px, 1fr));
+  grid-template-columns: repeat(auto-fill, minmax(350px, 1fr));
   gap: 20px;
-  margin-bottom: 30px;
+  overflow-y: auto;
+  padding: 16px 0;
 }
 
 .chart-card {
-  background: white;
-  border-radius: 12px;
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-  border: 1px solid #f0f0f0;
-  overflow: hidden;
-  transition: all 0.3s ease;
+  background: #f8f9fa;
+  border-radius: 8px;
+  padding: 16px;
+  border: 1px solid #e4e7ed;
+  transition: all 0.3s;
+  height: fit-content;
 }
 
 .chart-card:hover {
+  box-shadow: 0 4px 12px rgba(0, 0, 0, 0.1);
   transform: translateY(-2px);
-  box-shadow: 0 4px 16px rgba(0, 0, 0, 0.15);
-  border-color: #409eff;
 }
 
 .chart-header {
-  padding: 20px 24px 16px;
-  border-bottom: 1px solid #f0f0f0;
   display: flex;
   justify-content: space-between;
   align-items: center;
+  margin-bottom: 12px;
+  padding-bottom: 8px;
+  border-bottom: 1px solid #e4e7ed;
 }
 
 .chart-header h3 {
   margin: 0;
-  font-size: 16px;
+  font-size: 14px;
   font-weight: 600;
-  color: #1a1a1a;
+  color: #303133;
+}
+
+.chart-actions {
+  display: flex;
+  gap: 4px;
+  opacity: 0;
+  transition: opacity 0.3s;
+}
+
+.chart-card:hover .chart-actions {
+  opacity: 1;
 }
 
 .chart-content {
-  padding: 20px 24px;
+  min-height: 120px;
 }
 
 .chart-summary {
-  display: flex;
-  flex-wrap: wrap;
-  gap: 16px;
-  margin-bottom: 16px;
+  display: grid;
+  grid-template-columns: repeat(auto-fit, minmax(80px, 1fr));
+  gap: 8px;
+  margin-bottom: 12px;
 }
 
 .summary-item {
-  flex: 1;
-  min-width: 120px;
+  text-align: center;
+  padding: 8px;
+  background: white;
+  border-radius: 4px;
+  border: 1px solid #e4e7ed;
 }
 
 .summary-label {
-  font-size: 12px;
-  color: #666;
-  margin-bottom: 4px;
+  font-size: 11px;
+  color: #909399;
+  margin-bottom: 2px;
 }
 
 .summary-value {
-  font-size: 20px;
+  font-size: 14px;
   font-weight: 600;
-  color: #1a1a1a;
+  color: #303133;
 }
 
 .chart-placeholder {
-  height: 120px;
-  background: #f8f9fa;
-  border-radius: 8px;
+  height: 80px;
+  background: linear-gradient(135deg, #f5f7fa 0%, #c3cfe2 100%);
+  border-radius: 4px;
   display: flex;
   align-items: center;
   justify-content: center;
-  border: 2px dashed #e0e0e0;
+  color: #909399;
+  font-size: 12px;
 }
 
 .chart-type-indicator {
-  color: #666;
-  font-size: 14px;
-  font-weight: 500;
-}
-
-/* 统计摘要样式 */
-.stats-summary {
-  margin-top: 30px;
-}
-
-.summary-card {
-  background: white;
+  background: rgba(255, 255, 255, 0.9);
+  padding: 4px 12px;
   border-radius: 12px;
-  padding: 24px;
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.1);
-  border: 1px solid #f0f0f0;
-}
-
-.summary-title {
-  font-size: 18px;
-  font-weight: 600;
-  color: #1a1a1a;
-  margin-bottom: 20px;
-}
-
-.summary-stats {
-  display: grid;
-  grid-template-columns: repeat(auto-fit, minmax(200px, 1fr));
-  gap: 24px;
+  font-weight: 500;
 }
 
-.summary-stat {
+/* 空状态 */
+.empty-charts {
+  grid-column: 1 / -1;
   display: flex;
-  justify-content: space-between;
+  flex-direction: column;
   align-items: center;
-  padding: 16px;
-  background: #f8f9fa;
-  border-radius: 8px;
-}
-
-.summary-stat .stat-label {
-  font-size: 14px;
-  color: #666;
-  font-weight: 500;
-}
-
-.summary-stat .stat-value {
-  font-size: 18px;
-  font-weight: 600;
-  color: #1a1a1a;
-}
-
-/* 图表区域 */
-.charts-section {
-  background: #ffffff;
-  border-radius: 12px;
-  padding: 24px;
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
-}
-
-/* 占位符样式 */
-.chart-placeholder,
-.dashboard-placeholder,
-.report-placeholder {
-  background: #ffffff;
-  border-radius: 12px;
-  padding: 60px 24px;
+  justify-content: center;
+  height: 200px;
+  color: #909399;
   text-align: center;
-  box-shadow: 0 2px 8px rgba(0, 0, 0, 0.06);
 }
 
-.placeholder-content {
-  max-width: 400px;
-  margin: 0 auto;
+.empty-charts .empty-icon {
+  font-size: 48px;
+  margin-bottom: 12px;
 }
 
-.placeholder-icon {
-  font-size: 64px;
-  margin-bottom: 24px;
-  opacity: 0.6;
-}
-
-.placeholder-content h3 {
-  font-size: 20px;
-  color: #303133;
-  margin: 0 0 12px 0;
-}
-
-.placeholder-content p {
+.empty-charts .empty-text {
   font-size: 14px;
-  color: #909399;
-  margin: 0;
+  margin-bottom: 16px;
 }
 
 /* 响应式设计 */
 @media (max-width: 768px) {
-  .sidebar {
-    width: 60px;
+  .data-report-main {
+    padding: 12px;
   }
-  
-  .menu-text {
-    display: none;
+
+  .top-section {
+    flex-direction: column;
+    height: auto;
   }
-  
-  .stats-grid {
+
+  .dashboard-list-section {
+    height: 250px;
+  }
+
+  .charts-grid {
     grid-template-columns: 1fr;
   }
-  
-  .content-area {
-    padding: 16px;
+}
+
+@media (max-width: 480px) {
+  .section-header {
+    flex-direction: column;
+    align-items: flex-start;
+    gap: 12px;
+  }
+
+  .section-actions {
+    width: 100%;
+    justify-content: flex-end;
   }
 }
 </style>

+ 0 - 1
src/app/shop/admin/finance/withdraw/audit.vue

@@ -159,7 +159,6 @@ async function handleConfirm() {
     // 审核通过时添加通道信息
     if (auditType.value === 'approve') {
       requestData.channelId = formData.channelId;
-      requestData.channelCode = formData.channelCode;
     }
 
     // 调用审核API

+ 3 - 3
src/app/shop/admin/finance/withdraw/detail.vue

@@ -6,7 +6,7 @@
         <div class="sa-flex sa-row-between sa-m-b-20">
           <h3>{{ t('modules.withdraw.basicInfo') }}</h3>
           <!-- 操作按钮 -->
-          <div class="operation-buttons mb-40px" v-if="withdrawDetail.status === 1">
+          <div v-if="[1, 5, 6].includes(withdrawDetail.status)">
             <el-button type="success" plain @click="handleApprove" class="mr-10px">{{ t('modules.withdraw.approve')
             }}</el-button>
             <el-button type="danger" plain @click="handleReject">{{ t('modules.withdraw.reject') }}</el-button>
@@ -64,7 +64,7 @@
           <el-col :span="6">
             <div class="info-item" :style="{ '--label-width': formLabelWidth }">
               <span class="label">{{ t('modules.withdraw.channel') }}:</span>
-              <span class="value">{{ withdrawDetail.channelName || '--' }}</span>
+              <span class="value">{{ withdrawDetail.channel || '--' }}</span>
             </div>
           </el-col>
         </el-row>
@@ -72,7 +72,7 @@
           <el-col :span="6">
             <div class="info-item" :style="{ '--label-width': formLabelWidth }">
               <span class="label">{{ t('modules.withdraw.method') }}:</span>
-              <span class="value">{{ withdrawDetail.methodName || '--' }}</span>
+              <span class="value">{{ withdrawDetail.bank || '--' }}</span>
             </div>
           </el-col>
           <el-col :span="6">

+ 2 - 7
src/app/shop/admin/finance/withdraw/index.vue

@@ -59,12 +59,12 @@
           </el-table-column>
           <el-table-column :label="t('modules.withdraw.channel')" min-width="130" align="center">
             <template #default="scope">
-              {{ scope.row.channelName || '-' }}
+              {{ scope.row.channel || '-' }}
             </template>
           </el-table-column>
           <el-table-column :label="t('modules.withdraw.method')" min-width="130" align="center">
             <template #default="scope">
-              {{ scope.row.methodName || '-' }}
+              {{ scope.row.bank || '-' }}
             </template>
           </el-table-column>
           <el-table-column :label="t('modules.withdraw.currency')" min-width="80" align="center">
@@ -82,11 +82,6 @@
               </el-tag>
             </template>
           </el-table-column>
-          <el-table-column :label="t('modules.withdraw.receivingBank')" min-width="150" align="center">
-            <template #default="scope">
-              {{ scope.row.bank || '-' }}
-            </template>
-          </el-table-column>
           <el-table-column :label="t('modules.withdraw.receivingAccountName')" min-width="130" align="center">
             <template #default="scope">
               {{ scope.row.bankAccountName || '-' }}