瀏覽代碼

数据看板修改计算与数据问题

11wqe1 3 天之前
父節點
當前提交
252d403ec9

+ 34 - 16
src/views/kanBan/components/dataBoardNew/AIApp/chartList/ParetoChart.vue

@@ -124,22 +124,40 @@ export default {
           },
           {
             name: '累计百分比',
-            type: 'line',
-            yAxisIndex: 1,
-            data: this.lineData,
-            symbol: 'circle',
-            symbolSize: 8,
-            lineStyle: {
-              color: '#91cc75'
-            },
-            itemStyle: {
-              color: '#91cc75'
-            },
-            label: {
-              show: true,
-              formatter: '{c}%',
-              position: 'top'
-            }
+              type: 'line',
+              yAxisIndex: 1,
+              data: this.lineData,
+              symbol: 'circle',
+              markLine: {
+                  symbol:'none',//去掉箭头
+                  data: [
+                      {
+                          name: '80%线',
+                          yAxis: 80,  // 80%的位置
+                          lineStyle: {
+                              color: 'red',  // 将该线设置为红色
+                              type: 'solid'  // 设置为实线
+                          },
+                          symbol: 'none', // 使用内置的箭头图标
+                          label: {
+                              show: false  // 不显示标签
+                          },
+                          // 这里可以添加其他样式配置
+                      }
+                  ]
+              },
+              symbolSize: 8,
+              lineStyle: {
+                  color: '#91cc75'
+              },
+              itemStyle: {
+                  color: '#91cc75'
+              },
+              label: {
+                  show: true,
+                  formatter: '{c}%',
+                  position: 'top'
+              }
           }
         ]
       };

+ 108 - 101
src/views/kanBan/components/dataBoardNew/baseData/chartList/useTimer.vue

@@ -52,60 +52,61 @@ export default {
     startCom(val){
         let data = JSON.parse(JSON.stringify(val))
         // x轴数据
-        this.categories = data[0].map(e=> e.name)
+        // this.categories = data[0].map(e=> e.name)
 
-        data[0].forEach(e => {
-            e.chlid = []
-        });
+        // data[0].forEach(e => {
+        //     e.chlid = []
+        // });
         
         // 得出x轴数据
-        // this.pageData = [data[0],data[0],data[0]]
+        this.pageData = data
 
 
-        // 日
-        this.day = data[1]
+        // // 
+        // this.day = data[1]
 
-        data[0].forEach(i=>{
-            // 数据分类
-            let kol = []
-            this.day.forEach(e => {
-                if (e.cclassid && e.cclassid.includes(i.id)) {                    
-                    kol.push(e)
-                }
-            })
-            // log
-            this.pageData[0].push(this.processBoxplotData(kol))
-        });
-
-        //周
-        this.week = this.sumMinutesByUser(data[2])
-        data[0].forEach(i=>{
-            // 数据分类
-            let kol = []
-            this.week.forEach(e => {
-                if (e.cclassid && e.cclassid.includes(i.id)) {                    
-                    kol.push(e)
-                }
-            })
-            this.pageData[1].push(this.processBoxplotData(kol))
-        });
-
-        // 月
-        this.month = this.sumMinutesByUser(data[3])
-        data[0].forEach(i=>{
-            // 数据分类
-            let kol = []
-            this.month.forEach(e => {
-                if (e.cclassid && e.cclassid.includes(i.id)) {                    
-                   kol.push(e)
-                }
-            })
-            this.pageData[2].push(this.processBoxplotData(kol))
-        });
+        // data[0].forEach(i=>{
+        //     // 数据分类
+        //     let kol = []
+        //     this.day.forEach(e => {
+        //         if (e.cclassid && e.cclassid.includes(i.id)) {                    
+        //             kol.push(e)
+        //         }
+        //     })
+        //     // log
+        //     this.pageData[0].push(this.processBoxplotData(kol))
+        // });
+
+        // //
+        // this.week = this.sumMinutesByUser(data[2])
+        // data[0].forEach(i=>{
+        //     // 数据分类
+        //     let kol = []
+        //     this.week.forEach(e => {
+        //         if (e.cclassid && e.cclassid.includes(i.id)) {                    
+        //             kol.push(e)
+        //         }
+        //     })
+        //     this.pageData[1].push(this.processBoxplotData(kol))
+        // });
+
+        // // 
+        // this.month = this.sumMinutesByUser(data[3])
+        // data[0].forEach(i=>{
+        //     // 数据分类
+        //     let kol = []
+        //     this.month.forEach(e => {
+        //         if (e.cclassid && e.cclassid.includes(i.id)) {                    
+        //            kol.push(e)
+        //         }
+        //     })
+        //     this.pageData[2].push(this.processBoxplotData(kol))
+        // });
 
         // console.log('this.pageData',this.pageData);
         
-        this.chartData = this.pageData[0]
+        // this.chartData = this.pageData[0]
+        this.chartData = data[0]
 
 
         this.initChart()
@@ -129,47 +130,47 @@ export default {
         }
     },
     // 把相同的数据加起来
-    sumMinutesByUser(data) {
-      return Object.values(data.reduce((acc, current) => {
-        const { userid, minutes } = current;
-        if (!acc[userid]) {
-          acc[userid] = { ...current, minutes: 0 }; // 初始化用户对象
-        }
-        acc[userid].minutes += minutes; // 累加 minutes
-        return acc;
-      }, {}));
-    },
+    // sumMinutesByUser(data) {
+    //   return Object.values(data.reduce((acc, current) => {
+    //     const { userid, minutes } = current;
+    //     if (!acc[userid]) {
+    //       acc[userid] = { ...current, minutes: 0 }; // 初始化用户对象
+    //     }
+    //     acc[userid].minutes += minutes; // 累加 minutes
+    //     return acc;
+    //   }, {}));
+    // },
     // 把数据处理成盒须图数据
-    processBoxplotData(data) {
-        // 检查数组是否为空
-        if (data.length === 0) return {
-            min: 0,
-            q1: 0,
-            median: 0,
-            q3: 0,
-            max: 0
-        }
+    // processBoxplotData(data) {
+    //     // 检查数组是否为空
+    //     if (data.length === 0) return {
+    //         min: 0,
+    //         q1: 0,
+    //         median: 0,
+    //         q3: 0,
+    //         max: 0
+    //     }
 
-        // 提取 minutes 值
-        const minutesArray = data.map(item => item.minutes);
-
-        // 计算盒须图需要的统计值
-        const sortedMinutes = minutesArray.sort((a, b) => a - b);
-        const q1 = sortedMinutes[Math.floor((sortedMinutes.length / 4))];
-        const median = sortedMinutes[Math.floor((sortedMinutes.length / 2))];
-        const q3 = sortedMinutes[Math.floor((sortedMinutes.length * (3 / 4)))];
-        const min = sortedMinutes[0];
-        const max = sortedMinutes[sortedMinutes.length - 1];
-
-        // 盒须图数据格式化
-        return {
-            min: min,
-            q1: q1,
-            median: median,
-            q3: q3,
-            max: max
-        };
-    },
+    //     // 提取 minutes 值
+    //     const minutesArray = data.map(item => item.minutes);
+
+    //     // 计算盒须图需要的统计值
+    //     const sortedMinutes = minutesArray.sort((a, b) => a - b);
+    //     const q1 = sortedMinutes[Math.floor((sortedMinutes.length / 4))];
+    //     const median = sortedMinutes[Math.floor((sortedMinutes.length / 2))];
+    //     const q3 = sortedMinutes[Math.floor((sortedMinutes.length * (3 / 4)))];
+    //     const min = sortedMinutes[0];
+    //     const max = sortedMinutes[sortedMinutes.length - 1];
+
+    //     // 盒须图数据格式化
+    //     return {
+    //         min: min,
+    //         q1: q1,
+    //         median: median,
+    //         q3: q3,
+    //         max: max
+    //     };
+    // },
     initChart() {
       this.$nextTick(() => {
           this.chart = echarts.init(this.$refs.chartContainer)
@@ -180,31 +181,37 @@ export default {
       this.chart && this.chart.resize();
     },
     updateChart() {
-      const chartData = this.chartData.map(item => [
-        item.min, item.q1, item.median, item.q3, item.max
-      ]);
+      // const chartData = this.chartData.map(item => [
+      //   item.min, item.q1, item.median, item.q3, item.max
+      // ]);
 
       const option = {
-        tooltip: {},
+        tooltip: {  // 新增tooltip配置
+          trigger: 'axis',  // 触发类型为坐标轴
+          axisPointer: {    // 坐标轴指示器配置
+            type: 'shadow'  // 阴影样式
+          },
+          formatter: function(params) {  // 自定义提示内容
+            return `${params[0].name}<br/>数值: ${params[0].value}分钟`;
+          }
+        },
+
         xAxis: {
-          type: 'category',
-          data: this.categories
+          data: this.chartData.map(e => e.lab),
+          axisLabel: {
+            color: '#666',
+            formatter: value => `${value}${this.cutNum == 0 ? '日' : this.cutNum == 1 ? '周' :'月'}`
+          },
         },
         yAxis: {
-          type: 'value',
-          axisLabel: {
-            formatter: '{value}分钟',
+           axisLabel: {
+            formatter: value => `${value}分钟`,  // 添加“分钟”单位
             color: '#666'
-          },
+          }
         },
         series: [{
-          type: 'boxplot',
-          data: chartData,
-          itemStyle: {
-            normal: {
-              color: '#5b9bd5'
-            }
-          }
+          type: 'bar',
+          data: this.chartData.map(e => e.num)
         }]
       };
 

+ 27 - 5
src/views/kanBan/components/dataBoardNew/baseData/index.vue

@@ -12,7 +12,7 @@
                 <levChart :alldata="alldata"/>
             </div>
             <div style="flex: 1;flex-shrink: 0;">
-                <useTimer :alldata="alldata.slice(6)"/>
+                <useTimer :alldata="alldata.slice(7)"/>
             </div>
        </div>
     </div>
@@ -100,13 +100,32 @@ export default {
 
                     res.data[5] = Array.from({ length: res.data[5].length ? res.data[5][res.data[5].length-1].lab * 1 : week}, (_, i) => {
                         const lab = String(i + 1).padStart(2, '0'); // 生成lab为01到最新日期
-                        const existingEntry = res.data[5].find(entry => 0+entry.lab === lab);                        
+                        const existingEntry = res.data[5].find(entry => '0'+entry.lab === lab);   
                         return existingEntry ? existingEntry : { lab, num: 0 };
                     });
 
                     res.data[6] = Array.from({ length: month}, (_, i) => {
                         const lab = String(i + 1).padStart(2, '0'); // 生成lab为01到最新日期
-                        const existingEntry = res.data[6].find(entry => entry.lab === lab);
+                        const existingEntry = res.data[6].find(entry => entry.lab == lab);
+                        return existingEntry ? existingEntry : { lab, num: 0 };
+                    });
+
+                    // 使用时长数据处理
+                    res.data[11] = Array.from({ length: day}, (_, i) => {
+                        const lab = String(i + 1).padStart(2, '0'); // 生成lab为01到最新日期
+                        const existingEntry = res.data[11].find(entry => entry.lab === lab);
+                        return existingEntry ? existingEntry : { lab, num: 0 };
+                    });
+
+                    res.data[12] = Array.from({ length: res.data[12].length ? res.data[12][res.data[12].length-1].lab * 1 : week}, (_, i) => {
+                        const lab = String(i + 1).padStart(2, '0'); // 生成lab为01到最新日期
+                        const existingEntry = res.data[12].find(entry => '0'+entry.lab === lab);                        
+                        return existingEntry ? existingEntry : { lab, num: 0 };
+                    });
+
+                    res.data[13] = Array.from({ length: month}, (_, i) => {
+                        const lab = String(i + 1).padStart(2, '0'); // 生成lab为01到最新日期
+                        const existingEntry = res.data[13].find(entry => entry.lab == lab);
                         return existingEntry ? existingEntry : { lab, num: 0 };
                     });
 
@@ -127,8 +146,11 @@ export default {
         getWeekOfMonth() {
             const date = new Date();
             const dayOfMonth = date.getDate();
-            const dayOfWeek = date.getDay() || 7; // 将周日(0)转换为7
-            return Math.ceil((dayOfMonth + 6 - dayOfWeek) / 7);
+            const firstDayOfMonth = new Date(date.getFullYear(), date.getMonth(), 1);
+            const dayOfWeek = firstDayOfMonth.getDay() || 7; // 将周日(0)转换为7
+            
+            // 计算本月的第几周
+            return Math.ceil((dayOfMonth + dayOfWeek - 1) / 7);
         }
     },
     mounted() {

+ 5 - 1
src/views/kanBan/components/dataBoardNew/teaMange/chartList/pie2.vue

@@ -32,7 +32,11 @@ export default {
     startCom(val) {
       let data = JSON.parse(JSON.stringify(val));
 
-      this.progress = (data.is / this.alltest.value).toFixed(2) * 100;
+      if(!data.is || !this.alltest.value){
+        this.progress = 0;
+      }else{
+        this.progress = (data.is / this.alltest.value).toFixed(2) * 100;
+      }
 
       this.initChart();
     },

+ 20 - 6
src/views/kanBan/components/dataBoardNew/teaMange/chartList/solid.vue

@@ -39,12 +39,26 @@ export default {
       // console.log("this.alltest", this.alltest[0].value);
       // console.log("data.noLook", data.noLook);
 
-      this.chartData[0].value =
-        ((data.noLook / this.alltest[0].value)* 100).toFixed(2) ;
-      this.chartData[1].value =
-        ((data.is / this.alltest[0].value)* 100).toFixed(2);
-      this.chartData[2].value =
-        ((this.alltest[2].value / this.alltest[0].value)* 100).toFixed(2);
+      if (!data.noLook || !this.alltest[0].value) {
+        this.chartData[0].value = 0;
+      }else{
+        this.chartData[0].value =
+          ((data.noLook / this.alltest[0].value)* 100).toFixed(2) ;
+      }
+      
+      if (!data.is || !this.alltest[0].value) {
+        this.chartData[1].value = 0
+      }else{
+        this.chartData[1].value =
+          ((data.is / this.alltest[0].value)* 100).toFixed(2);
+      }
+
+      if (!this.alltest[2].value || !this.alltest[0].value) {
+        this.chartData[2].value = 0 
+      }else{
+        this.chartData[2].value =
+          ((this.alltest[2].value / this.alltest[0].value)* 100).toFixed(2);
+      } 
 
       // console.log("this.chartData", this.chartData);
 

+ 8 - 3
src/views/kanBan/components/dataBoardNew/teaMange/index.vue

@@ -8,8 +8,8 @@
                 <pie2 :alldata="dataJ" :alltest="dataExponentList[0]"/>
             </div>
         </div>
-        <div class="DataDiv" v-if="mergedList.includes(org)">
-            获奖表单人数汇总
+        <div class="DataDiv">
+            热门表单人数汇总
             <div class="imgArea" style="display: flex;height: 100%;">
                 <barChart :alldata="chartsData"/>
             </div>
@@ -126,7 +126,12 @@ export default {
                     ]
 
                     top[0].value = res.data[0][0].num
-                    top[1].value = ((this.dataJ.is / res.data[0][0].num).toFixed(0)) * 100 + '%'
+
+                    if (!this.dataJ.is || !res.data[0][0].num) {
+                        top[1].value = '0%'
+                    }else{
+                        top[1].value = ((this.dataJ.is / res.data[0][0].num).toFixed(0)) * 100 + '%'
+                    }
                     top[2].value = res.data[1][0].num //本月新增
 
                     this.dataExponentList = top

+ 1 - 1
src/views/kanBan/components/dataBoardNew/teaing/chartList/appUseAss.vue

@@ -40,7 +40,7 @@ export default {
   },
   methods: {
     startCom(val) {
-      let data = JSON.parse(JSON.stringify(val)).filter(e=> e.typeids);
+      let data = JSON.parse(JSON.stringify(val)).filter(e=> e.typeids).filter(e => e.state != 7);
       
       let subject = JSON.parse(JSON.stringify(this.subject));
 

+ 2 - 2
src/views/kanBan/components/dataBoardNew/teaing/index.vue

@@ -112,14 +112,14 @@ export default {
             top[0].value = res.data[0][0].num
             top[1].value = res.data[1][0].num //本月新增
             //上月新增
-            if(res.data[1][0].num ==0 && res.data[2][0].num ==0){
+            if(!res.data[1][0].num || !res.data[2][0].num){
               top[2].value = '0%'
             }else{
               top[2].value = ((res.data[1][0].num - res.data[2][0].num) / res.data[2][0].num).toFixed(2) * 100 + '%'
             }
             
             // 课程所有阶段整合
-            let k =  this.Aitool(res.data[3])
+            let k =  this.Aitool(res.data[3].filter(e => e.state != 7))
             top[3].value = k
 
             this.dataExponentList = top