Hwt 3 yıl önce
ebeveyn
işleme
9e1c73cdc0

+ 9 - 0
commandCenter/src/components/common/Header.vue

@@ -120,17 +120,26 @@ export default {
     },
     selectTab (index) {
       this.tagTabIndex = index;
+      window.localStorage.setItem('tagTabIndex', index);
+      window.sessionStorage.setItem('tagTabIndex', index);
       if (index == 0) {
         this.$router.push('/homeIndex')
       } else if (index == 1) {
         this.$router.push('/communityAssets')
       } else if (index == 2) {
         this.$router.push('/industrialInvestment')
+      } else if (index == 3) {
+        this.$router.push('/operationalServices')
       }
     }
   },
   mounted () { },
   created () {
+    if (!!window.localStorage.tagTabIndex && !!window.sessionStorage.tagTabIndex) {
+      this.tagTabIndex = window.localStorage.tagTabIndex
+    } else {
+      this.tagTabIndex = 0;
+    }
     setInterval(() => {
       this.getTime();
     }, 1000);

+ 6 - 0
commandCenter/src/router/index.js

@@ -30,6 +30,12 @@ const quietRoute = [
                 component: () => import(/* webpackChunkName: "404" */ '@views/industrialInvestment/index.vue'),
                 meta: { title: 'industrialInvestment' }
             },
+            {
+                path: '/operationalServices',
+                name: 'operationalServices',
+                component: () => import(/* webpackChunkName: "404" */ '@views/operationalServices/index.vue'),
+                meta: { title: 'operationalServices' }
+            },
             {
                 path: '/403',
                 component: () => import(/* webpackChunkName: "404" */ '@views/errorPage/403.vue'),

+ 28 - 28
commandCenter/src/views/communityAssets/assembly/allcommunit.js

@@ -1,32 +1,32 @@
 import { mapState } from 'vuex';
 export default {
-  data() {
-    return {
-      loadding: true,
-    }
-  },
-  computed: {
-    //全局社区
-    ...mapState(['homeCommunityAll']),
+    data() {
+        return {
+            loadding: true
+        };
+    },
+    computed: {
+        //全局社区
+        ...mapState(['homeCommunityAll']),
 
-    resize() {
-      // 通过scale值来判断窗口是变化
-      return this.$store.getters['getScale'];
-    }
-  },
-  watch: {
-    //全局社区接口调用
-    'homeCommunityAll'(n) {
-      this.mixins_query.communityId = n;
-      this.getData();
-    }, resize(va) {
-      // console.log(va);
+        resize() {
+            // 通过scale值来判断窗口是变化
+            return this.$store.getters['getScale'];
+        }
+    },
+    watch: {
+        //全局社区接口调用
+        homeCommunityAll(n) {
+            this.mixins_query.communityId = n;
+            this.getData();
+        },
+        resize(va) {
+            // console.log(va);
+        }
+    },
+    methods: {},
+    created() {
+        this.mixins_query.communityId = this.homeCommunityAll;
+        this.getData();
     }
-  },
-  methods: {
-  },
-  created() {
-    this.mixins_query.communityId = this.homeCommunityAll;
-    this.getData();
-  }
-}
+};

+ 2 - 2
commandCenter/src/views/communityAssets/assembly/overallCommunity.vue

@@ -9,8 +9,8 @@
         :style="item.style"
         v-for="(item, index) in blockArr"
         :key="index"
-        @click="$router.push({ path: item.path })"
       >
+        <!-- @click="$router.push({ path: item.path })" -->
         <div class="number">{{ houseData[item.fontObj] }}</div>
         <div class="text">{{ item.name }}</div>
       </div>
@@ -93,7 +93,7 @@ export default {
             box-sizing: border-box;
             padding-left: rem(20);
             padding-top: rem(20);
-            cursor: pointer;
+            // cursor: pointer;
             .number {
                 font-size: rem(30);
             }

+ 32 - 0
commandCenter/src/views/operationalServices/assembly/allcommunit.js

@@ -0,0 +1,32 @@
+import { mapState } from 'vuex';
+export default {
+  data() {
+    return {
+      loadding: true,
+    }
+  },
+  computed: {
+    //全局社区
+    ...mapState(['homeCommunityAll']),
+
+    resize() {
+      // 通过scale值来判断窗口是变化
+      return this.$store.getters['getScale'];
+    }
+  },
+  watch: {
+    //全局社区接口调用
+    'homeCommunityAll'(n) {
+      this.mixins_query.communityId = n;
+      this.getData();
+    }, resize(va) {
+      // console.log(va);
+    }
+  },
+  methods: {
+  },
+  created() {
+    this.mixins_query.communityId = this.homeCommunityAll;
+    this.getData();
+  }
+}

+ 106 - 0
commandCenter/src/views/operationalServices/assembly/complaintsAndSuggestions.vue

@@ -0,0 +1,106 @@
+
+<template>
+  <div class="modelBlock">
+    <div class="model-title">
+      <div class="model-title-text">投诉建议数量趋势</div>
+      <div class="model-title-right">
+        <el-date-picker
+          value-format="yyyy-MM"
+          v-model="date"
+          type="month"
+          placeholder="选择月"
+          class="saveColumn-select"
+          @change="changeTime"
+          :clearable="false"
+        >
+        </el-date-picker>
+      </div>
+    </div>
+    <div class="model-content">
+      <zz-echart
+        :option="clientOptions"
+        class="chart"
+      ></zz-echart>
+    </div>
+  </div>
+</template>
+<script>
+import { discountedWave } from './indexOptionChart';
+let dataArr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+let dataDay = [
+  '01-01',
+  '01-02',
+  '01-03',
+  '01-04',
+  '01-05',
+  '01-06',
+  '01-07',
+  '01-08',
+  '01-09',
+  '01-10',
+  '01-11',
+  '01-12',
+  '01-13',
+  '01-14',
+  '01-15',
+  '01-16',
+  '01-17',
+  '01-18',
+  '01-19',
+  '01-20',
+  '01-21',
+  '01-22',
+  '01-23',
+  '01-24',
+  '01-25',
+  '01-26',
+  '01-27',
+  '01-28',
+  '01-29',
+  '01-30',
+  '01-31'
+];
+export default {
+  props: ['dataObj'],
+  data () {
+    return {
+      mixins_query: {
+        communityId: '',
+        date: ''
+      },
+      date: '',
+      clientOptions: discountedWave('(次)', dataDay, dataArr)
+    };
+  },
+  created () {
+    this.mixins_query.date = this.$moment().format('YYYY-MM') + '-01';
+    this.date = this.$moment().format('YYYY-MM');
+    this.getData();
+  },
+  methods: {
+    getData () {
+      this.$http
+        .get('/sc-community/statisticComplaintsTrend', this.mixins_query)
+        .then(({ status, data, msg }) => {
+          if (status == 0) {
+            let dateTime = [],
+              valueArr = [];
+            data.map((item) => {
+              dateTime.push(item.date);
+              valueArr.push(item.data);
+            });
+            this.clientOptions = discountedWave('(次)', dateTime, valueArr);
+          }
+        })
+        .catch((err) => { });
+    },
+    changeTime (v) {
+      this.mixins_query.date = v + '-01';
+      this.getData();
+    }
+  }
+};
+</script>
+<style scoped lang="scss">
+@import '../style.scss';
+</style>

+ 154 - 0
commandCenter/src/views/operationalServices/assembly/completionMaintenanceOrder.vue

@@ -0,0 +1,154 @@
+<template>
+  <div class="modelBlock">
+    <div class="model-title">
+      <div class="model-title-text">运维工单完成情况</div>
+      <div class="model-title-right">
+        <el-date-picker
+          value-format="yyyy-MM"
+          v-model="date"
+          type="month"
+          placeholder="选择月"
+          class="saveColumn-select"
+          @change="changeTime"
+          :clearable="false"
+        >
+        </el-date-picker>
+      </div>
+    </div>
+    <div class="model-content">
+      <zz-echart
+        :option="clientOptions"
+        class="chart"
+      ></zz-echart>
+      <div class="totals">
+        <span class="size-color">{{ total }}</span>
+        <span class="numbers size-color">任务总数</span>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import { GradualChange, ringType } from './indexOptionChart';
+// import permissionComponent from '../permissionComponent';
+const colors = [
+  GradualChange('#22D8FF', '#00B2FF'),
+  GradualChange('#F0646C', '#F4994E'),
+  GradualChange('#5EEDCC ', '#24C3F1'),
+  GradualChange('#7178FF', '#D2A4FF'),
+  GradualChange('#884DD2', '#DF63CC')
+];
+export default {
+  // mixins: [permissionComponent],
+  data () {
+    return {
+      // defaultModel: {
+      //   permissUrl: '17',
+      //   titleName: '运维工单'
+      // },
+      mixins_query: {
+        communityId: '',
+        date: '',
+      },
+      date: '',
+      total: 0,
+      clientOptions: ringType(
+        colors,
+        [
+          { value: 0, name: '待派单' },
+          { value: 0, name: '处理中' },
+          { value: 0, name: '已完成' },
+          { value: 0, name: '已完成(超时)' },
+          { value: 0, name: '已关闭' }
+        ],
+        {},
+        { type: 'number', total: 0 }
+      )
+    };
+  },
+  methods: {
+    getData () {
+      this.$http.get('/sc-community/statisticWorkOrderComplete', this.mixins_query).then(({ data, msg, status }) => {
+        if (status == 0 && !!data.datas) {
+          this.clientOptions = ringType(colors, this.eachartObj(data), {}, { type: 'number', total: data.total });
+        }
+      })
+    },
+    changeTime (v) {
+      this.mixins_query.date = v + '-01';
+      this.getData();
+    },
+    eachartObj (data) {
+      this.total = data.total || 0;
+      let newData = [];
+      for (let a in data.datas) {
+        newData.push({
+          value: data.datas[a],
+          name: a
+        });
+      }
+
+      return newData;
+    }
+  },
+  created () {
+    this.mixins_query.date = this.$moment().format('YYYY-MM') + '-01';
+    this.date = this.$moment().format('YYYY-MM');
+    this.getData();
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import '@assets/css/public-style.scss';
+.size-color {
+    color: #fff;
+}
+.modelBlock {
+    height: 100%;
+    padding: rem(15) rem(20) rem(20);
+    background: #171f32;
+    .model-title {
+        line-height: rem(30);
+        display: flex;
+        justify-content: space-between;
+        padding-bottom: rem(15);
+        border-bottom: 1px solid rgba(224, 225, 227, 0.2);
+        .saveColumn-select {
+            width: rem(120);
+            margin-left: rem(20);
+            /deep/ .el-input__inner {
+                background: transparent;
+                color: white;
+                border-color: rgba(255, 255, 255, 0.2);
+            }
+        }
+        .model-title-text {
+            color: white;
+        }
+    }
+    .model-content {
+        height: calc(100% - #{rem(45)});
+        display: flex;
+        justify-content: space-between;
+        font-size: 12px;
+        position: relative;
+        .totals {
+            position: absolute;
+            right: rem(10);
+            top: rem(26);
+            width: rem(120);
+            height: rem(40);
+            background: linear-gradient(90deg, rgba(14, 174, 255, 0.5) 0%, rgba(14, 174, 255, 0) 100%);
+            border-radius: 5px;
+            font-size: 20px;
+            padding: rem(8) rem(10);
+            display: flex;
+            justify-content: space-between;
+            .numbers {
+                font-size: 12px;
+                opacity: 0.5;
+                line-height: rem(32);
+            }
+        }
+    }
+}
+</style>

+ 162 - 0
commandCenter/src/views/operationalServices/assembly/distributionSuggestion.vue

@@ -0,0 +1,162 @@
+<template>
+  <div class="modelBlock">
+    <div class="model-title">
+      <div class="model-title-text">投诉建议类型分布</div>
+      <div class="model-title-right">
+        <el-date-picker
+          value-format="yyyy-MM"
+          v-model="date"
+          type="month"
+          placeholder="选择月"
+          class="saveColumn-select"
+          @change="changeTime"
+          :clearable="false"
+        >
+        </el-date-picker>
+      </div>
+    </div>
+    <div class="model-content">
+      <zz-echart
+        :option="clientOptions"
+        class="chart"
+      ></zz-echart>
+      <div class="totals">
+        <span class="size-color">{{ total }}</span>
+        <span class="numbers size-color">任务总数</span>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import { GradualChange, ringType } from './indexOptionChart';
+// import permissionComponent from '../permissionComponent';
+const colors = [
+  GradualChange('#22D8FF', '#00B2FF'),
+  GradualChange('#F0646C', '#F4994E'),
+  GradualChange('#5EEDCC ', '#24C3F1'),
+  GradualChange('#7178FF', '#D2A4FF'),
+  GradualChange('#884DD2', '#DF63CC')
+];
+export default {
+  // mixins: [permissionComponent],
+  data () {
+    return {
+      // defaultModel: {
+      //   permissUrl: '17',
+      //   titleName: '运维工单'
+      // },
+      mixins_query: {
+        communityId: '',
+        date: '',
+      },
+      date: '',
+      total: 0,
+      clientOptions: ringType(
+        colors,
+        [
+          { value: 0, name: '扰民投诉' },
+          { value: 0, name: '物业投诉' },
+          { value: 0, name: '公共卫生' },
+          { value: 0, name: '安全建议' },
+          { value: 0, name: '其他' }
+        ],
+        {},
+        { type: 'number', total: 0 }
+      )
+    };
+  },
+  methods: {
+    getData () {
+      this.$http.get('/sc-community-web/statisticComplaint', this.mixins_query).then(({ data, msg, status }) => {
+        if (status == 0 && !!data.datas) {
+          this.clientOptions = ringType(colors, this.eachartObj(data), {}, { type: 'number', total: data.total });
+        }
+      })
+    },
+    changeTime (v) {
+      this.mixins_query.date = v + '-01';
+      this.getData();
+    },
+    eachartObj (data) {
+      debugger
+      this.total = data.total || 0;
+      let newData = [];
+      let DataName = {
+        1: '扰民投诉',
+        2: '物业投诉',
+        3: '公共卫生',
+        4: '安全建议',
+        5: '其他'
+      }
+      for (let a in data.datas) {
+        newData.push({
+          value: data.datas[a],
+          name: DataName[a]
+        });
+      }
+
+      return newData;
+    }
+  },
+  created () {
+    this.mixins_query.date = this.$moment().format('YYYY-MM') + '-01';
+    this.date = this.$moment().format('YYYY-MM');
+    this.getData();
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import '@assets/css/public-style.scss';
+.size-color {
+    color: #fff;
+}
+.modelBlock {
+    height: 100%;
+    padding: rem(15) rem(20) rem(20);
+    background: #171f32;
+    .model-title {
+        line-height: rem(30);
+        display: flex;
+        justify-content: space-between;
+        padding-bottom: rem(15);
+        border-bottom: 1px solid rgba(224, 225, 227, 0.2);
+        .saveColumn-select {
+            width: rem(120);
+            margin-left: rem(20);
+            /deep/ .el-input__inner {
+                background: transparent;
+                color: white;
+                border-color: rgba(255, 255, 255, 0.2);
+            }
+        }
+        .model-title-text {
+            color: white;
+        }
+    }
+    .model-content {
+        height: calc(100% - #{rem(45)});
+        display: flex;
+        justify-content: space-between;
+        font-size: 12px;
+        position: relative;
+        .totals {
+            position: absolute;
+            right: rem(10);
+            top: rem(26);
+            width: rem(120);
+            height: rem(40);
+            background: linear-gradient(90deg, rgba(14, 174, 255, 0.5) 0%, rgba(14, 174, 255, 0) 100%);
+            border-radius: 5px;
+            font-size: 20px;
+            padding: rem(8) rem(10);
+            display: flex;
+            justify-content: space-between;
+            .numbers {
+                font-size: 12px;
+                opacity: 0.5;
+                line-height: rem(32);
+            }
+        }
+    }
+}
+</style>

+ 13 - 0
commandCenter/src/views/operationalServices/assembly/index.js

@@ -0,0 +1,13 @@
+export default {
+    components: {
+        todayTask: (resolve) => require([`@views/operationalServices/assembly/todayTask.vue`], resolve),
+        satisfaction: (resolve) => require([`@views/operationalServices/assembly/satisfaction.vue`], resolve),
+        completionMaintenanceOrder: (resolve) => require([`@views/operationalServices/assembly/completionMaintenanceOrder.vue`], resolve),
+        complaintsAndSuggestions: (resolve) => require([`@views/operationalServices/assembly/complaintsAndSuggestions.vue`], resolve),
+        orderClassification: (resolve) => require([`@views/operationalServices/assembly/orderClassification.vue`], resolve),
+        operationMaintenancePersonnel: (resolve) =>
+            require([`@views/operationalServices/assembly/operationMaintenancePersonnel.vue`], resolve),
+        distributionSuggestion: (resolve) => require([`@views/operationalServices/assembly/distributionSuggestion.vue`], resolve),
+        scoringOperationPersonnel: (resolve) => require([`@views/operationalServices/assembly/scoringOperationPersonnel.vue`], resolve)
+    }
+};

+ 1236 - 0
commandCenter/src/views/operationalServices/assembly/indexOptionChart.js

@@ -0,0 +1,1236 @@
+import echarts from 'echarts';
+//从左往右颜色渐变
+export const GradualChange = (color1, color2) => {
+    return new echarts.graphic.LinearGradient(1, 0, 0, 0, [
+        { offset: 1, color: color1 + '' },
+        { offset: 0, color: color2 + '' || color1 + '' }
+    ]);
+};
+export const getColor = ([color1, color2]) => {
+    // 右 下 左 上
+    return new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+        { offset: 0, color: color1 + '' },
+        { offset: 1, color: color2 + '' || color1 + '' }
+    ]);
+};
+
+export const dateType = (date) => {
+    let val = '';
+    if (date) {
+        val = `${date.slice(0, 4)}年${date.slice(4)}月`;
+    } else {
+        val = date;
+    }
+    return val;
+};
+//折现波浪线颜色渐变
+export const getItemStyle = (c1, c2) => {
+    return {
+        color: {
+            type: 'linear',
+            x: 0,
+            y: 0,
+            x2: 0,
+            y2: 1,
+            colorStops: [
+                {
+                    offset: 0,
+                    color: c1 // 0% 处的颜色
+                },
+                {
+                    offset: 1,
+                    color: c2 // 100% 处的颜色
+                }
+            ],
+            global: false // 缺省为 false
+        }
+    };
+};
+export const defaultMonth = ['01', '02', '03', '04', '05', '06', '07', '08', '09', '10', '11', '12'];
+export const defaultName = ['name1', 'name2', 'name3'];
+
+const defaultColor = [
+    GradualChange('#22D8FF', '#00B2FF'),
+    GradualChange('#F0646C', '#F4994E'),
+    GradualChange('#5EEDCC ', '#24C3F1'),
+    GradualChange('#7178FF', '#D2A4FF'),
+    GradualChange('#884DD2', '#DF63CC')
+];
+// 饼图
+export const ringType = (color = [], data = [], title = {}, legendFcuntion = {}) => {
+    let legendFcuntionValue = (v) => {
+        let val = '';
+        data.map((item) => {
+            if (item.name == v) {
+                if (legendFcuntion.type == '%') {
+                    val = `{a|${v}} · · · · · · {b|${parseInt((item.value / legendFcuntion.total).toFixed(2) * 100) || 0}%}`;
+                } else {
+                    val = `{a|${v}} · · · · · · {b|${item.value}}`;
+                }
+            }
+        });
+        return val;
+    };
+    return {
+        tooltip: {
+            trigger: 'item'
+        },
+        legend: {
+            orient: 'vertical',
+            right: 10,
+            top: 80,
+            itemGap: 10,
+            itemWidth: 12, // 图例图形宽度
+            itemHeight: 8,
+            type: 'scroll',
+            formatter: (v) => {
+                return legendFcuntionValue(v);
+            },
+            textStyle: {
+                rich: {
+                    a: {
+                        fontSize: 12,
+                        color: '#858892',
+                        padding: [0, 5, 0, 0]
+                    },
+                    b: {
+                        fontSize: 14,
+                        color: '#fff',
+                        padding: [0, 0, 0, 5]
+                    }
+                }
+            }
+        },
+        title,
+        color: !!color.length ? color : defaultColor,
+        series: [
+            {
+                type: 'pie',
+                // radius: ['55%', '70%'],
+                radius: ['55%', '70%'],
+                center: ['25%', '50%'],
+                avoidLabelOverlap: false,
+                // center: ['25%', '50%'],
+                label: {
+                    show: false,
+                    position: 'center'
+                },
+                labelLine: {
+                    show: false
+                },
+                data: data
+            }
+        ]
+    };
+};
+
+// 折现波浪
+export const discountedWave = (name = '', xAxis = [], series = [], legendShow = false, color = []) => {
+    let option = {
+        tooltip: {
+            trigger: 'axis',
+            textStyle: {
+                fontSize: 12,
+                color: '#FFFFFF'
+            }
+            // formatter(param) {
+            //   let el = `<div class="dmp-echart-tooltip"><h4>${dateType(param[0].axisValue)}</h4>`;
+            //   param.forEach(item => {
+            //     el += `<p>
+            //                   <span class="marker" style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-image: linear-gradient(to left,
+            //                     ${item.color.colorStops[0].color}, ${item.color.colorStops[1].color});"></span>
+            //                   <span>${item.seriesName}:${item.value}</span>
+            //                 </p>`;
+            //   });
+            //   el += `</div>`;
+            //   return el;
+            // }
+        },
+        grid: {
+            top: 50,
+            left: 10,
+            bottom: 0,
+            right: 5,
+            containLabel: true
+        },
+
+        legend: {
+            show: legendShow,
+            icon: 'circle',
+            x: 'right', // 可设定图例在左、右、居中
+            itemWidth: 8, // 图例图形宽度
+            itemHeight: 8,
+            itemGap: 20
+        },
+        xAxis: {
+            type: 'category',
+            axisLine: {
+                show: false // 不显示坐标轴
+            },
+            axisTick: {
+                show: false // 不显示坐标轴刻度
+            },
+            axisLabel: {
+                formatter: function (params, index) {
+                    return params.slice(5);
+                },
+                color: '#9B9DA5',
+                margin: 16
+            },
+            data: xAxis,
+            axisPointer: {
+                type: 'shadow',
+                shadowStyle: {
+                    color: {
+                        type: 'linear',
+                        x: 0,
+                        y: 0,
+                        x2: 0,
+                        y2: 1,
+                        colorStops: [
+                            {
+                                offset: 0,
+                                color: 'rgba(31,207,245,0)' // 0% 处的颜色
+                            },
+                            {
+                                offset: 0.8,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 0.2,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 1,
+                                color: 'rgba(31,207,245,0.05)'
+                            }
+                        ],
+                        global: false // 缺省为 false
+                    }
+                }
+            }
+        },
+        yAxis: {
+            type: 'value',
+            splitNumber: 4,
+            axisLine: {
+                show: false
+            },
+            name: name,
+            axisTick: {
+                show: false
+            },
+            axisLabel: {
+                color: '#9B9DA5',
+                margin: 15,
+                textStyle: {
+                    align: 'right',
+                    baseline: 'middle'
+                }
+            },
+            nameLocation: 'end',
+            nameTextStyle: { color: '#9B9DA5', padding: [0, 0, 0, -40] },
+            splitLine: {
+                lineStyle: {
+                    type: 'dotted',
+                    width: 0.2
+                }
+            }
+        },
+        series: [
+            {
+                // name: "设备告警",
+                type: 'line',
+                smooth: true,
+                symbol: 'circle', // 实心
+                symbolSize: 1, // 设定实心点的大小
+                itemStyle: getItemStyle('#5EEDCC', '#24C3F1'),
+                data: series,
+                areaStyle: {
+                    normal: {
+                        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                            {
+                                offset: 0,
+                                color: 'rgba(36,121,253,0.1)'
+                            },
+                            {
+                                offset: 1,
+                                color: 'rgba(19,194,247,0.3)'
+                            }
+                        ])
+                    }
+                },
+                lineStyle: {
+                    width: 1
+                }
+            }
+        ]
+    };
+    return option;
+};
+
+//柱状日期
+export const columnOptionsChart = (name = '', xAxis = [], series = [], color = [], barWidth = 6) => {
+    let defaultData = [
+        {
+            name: '',
+            type: 'bar',
+            data: []
+        }
+    ];
+    let defaultColor = [
+        ['#0EAEFF', '#85E9FF'],
+        ['#F0646C', '#F4994E']
+    ];
+    let seriesConfiguration = () => {
+        let seriesData = [];
+        series.map((item, index) => {
+            seriesData.push({
+                name: item.name,
+                type: 'bar',
+                data: item.data,
+                barWidth: barWidth,
+                itemStyle: {
+                    normal: {
+                        barBorderRadius: [15, 15, 0, 0],
+                        color: getColor(color[index] || defaultColor[index])
+                    }
+                },
+                barGap: '100%'
+            });
+        });
+        return seriesData;
+    };
+    let option = {
+        tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+                type: 'shadow',
+                shadowStyle: {
+                    color: {
+                        type: 'linear',
+                        x: 0,
+                        y: 0,
+                        x2: 0,
+                        y2: 1,
+                        colorStops: [
+                            {
+                                offset: 0,
+                                color: 'rgba(31,207,245,0)' // 0% 处的颜色
+                            },
+                            {
+                                offset: 0.8,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 0.2,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 1,
+                                color: 'rgba(31,207,245,0.05)'
+                            }
+                        ],
+                        global: false // 缺省为 false
+                    }
+                },
+                crossStyle: {
+                    shadowBlur: 30,
+                    shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+            },
+            extraCssText: 'background:rgba(33,40,56,0.6);border-radius:4px;padding:6px 10px',
+            textStyle: {
+                fontSize: 12,
+                color: '#FFFFFF'
+            },
+            formatter(param) {
+                let el = `<div class="dmp-echart-tooltip" style="text-align: center;"><h4>${dateType(param[0].axisValue)}</h4>`;
+                param.forEach((item) => {
+                    el += `<p style="text-align: left;">
+        <span style="display:inline-block;margin-right:5px;border-radius:4px;width:12px;height:8px;background-image: linear-gradient(to left, 
+          ${item.color.colorStops[0].color}, ${item.color.colorStops[1].color})"></span>
+                      <span>${item.seriesName}:${item.value.toFixed(2)}</span>
+                    </p>`;
+                });
+                el += `</div>`;
+                return el;
+            }
+        },
+        grid: {
+            top: 50,
+            left: 10,
+            bottom: 0,
+            right: 0,
+            containLabel: true
+        },
+        xAxis: {
+            type: 'category',
+            axisLine: {
+                show: false // 不显示坐标轴
+            },
+            axisTick: {
+                show: false // 不显示坐标轴刻度
+            },
+            axisLabel: {
+                formatter: function (params, index) {
+                    if (params.length == 2) {
+                        return params + '月';
+                    } else {
+                        return params.slice(5) + '月';
+                    }
+                },
+                color: '#9B9DA5',
+                margin: 15
+            },
+            data: !!xAxis.length ? xAxis : defaultMonth
+        },
+        yAxis: {
+            type: 'value',
+            splitNumber: 4,
+            name: name,
+            axisLine: {
+                show: false
+            },
+            axisTick: {
+                show: false
+            },
+            axisLabel: {
+                color: '#9B9DA5',
+                margin: 15,
+                textStyle: {
+                    align: 'right',
+                    baseline: 'middle'
+                }
+            },
+            nameLocation: 'end',
+            nameTextStyle: { color: '#9B9DA5', padding: [0, 0, 0, -40] },
+            splitLine: {
+                lineStyle: {
+                    type: 'dotted',
+                    width: 0.5
+                }
+            }
+        },
+        legend: {
+            show: false,
+            x: 'right',
+            icon: 'circle',
+            itemWidth: 8, // 图例图形宽度
+            itemHeight: 8,
+            itemGap: 20
+        },
+        series: seriesConfiguration() || defaultData
+    };
+    return option;
+};
+
+//柱状name  单柱状
+export const columnOptionsChartName = (name = '', xAxis = [], series = [], color = [], barWidth = 6) => {
+    let defaultData = [
+        {
+            name: '',
+            type: 'bar',
+            data: []
+        }
+    ];
+    let defaultColor = [
+        ['#0EAEFF', '#85E9FF'],
+        ['#F0646C', '#F4994E']
+    ];
+    let seriesConfiguration = () => {
+        let seriesData = [
+            {
+                type: 'bar',
+                data: [],
+                barWidth: barWidth,
+                itemStyle: {
+                    normal: {
+                        barBorderRadius: [15, 15, 0, 0],
+                        color: getColor(color[0] || defaultColor[0])
+                    }
+                },
+                barGap: '100%'
+            }
+        ];
+        series.map((item, index) => {
+            seriesData[0].data.push(item.data);
+        });
+        return seriesData;
+    };
+    let option = {
+        tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+                type: 'shadow',
+                shadowStyle: {
+                    color: {
+                        type: 'linear',
+                        x: 0,
+                        y: 0,
+                        x2: 0,
+                        y2: 1,
+                        colorStops: [
+                            {
+                                offset: 0,
+                                color: 'rgba(31,207,245,0)' // 0% 处的颜色
+                            },
+                            {
+                                offset: 0.8,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 0.2,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 1,
+                                color: 'rgba(31,207,245,0.05)'
+                            }
+                        ],
+                        global: false // 缺省为 false
+                    }
+                },
+                crossStyle: {
+                    shadowBlur: 30,
+                    shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+            },
+            extraCssText: 'background:rgba(33,40,56,0.6);border-radius:4px;padding:6px 10px',
+            textStyle: {
+                fontSize: 12,
+                color: '#FFFFFF'
+            },
+            formatter(param) {
+                let el = ``;
+                param.forEach((item) => {
+                    el += `<p style="text-align: left;">
+        <span style="display:inline-block;margin-right:5px;border-radius:4px;width:12px;height:8px;background-image: linear-gradient(to left, 
+          ${item.color.colorStops[0].color}, ${item.color.colorStops[1].color})"></span>
+                      <span>${item.name}:${item.value}${name}</span>
+                    </p>`;
+                });
+                el += ``;
+                return el;
+            }
+        },
+        grid: {
+            top: 50,
+            left: 10,
+            bottom: 0,
+            right: 0,
+            containLabel: true
+        },
+        xAxis: {
+            type: 'category',
+            axisLine: {
+                show: false // 不显示坐标轴
+            },
+            axisTick: {
+                show: false // 不显示坐标轴刻度
+            },
+            axisLabel: {
+                formatter: function (params, index) {
+                    return params;
+                },
+                color: '#9B9DA5',
+                margin: 15
+            },
+            data: !!xAxis.length ? xAxis : defaultName
+        },
+        yAxis: {
+            type: 'value',
+            splitNumber: 4,
+            name: name,
+            axisLine: {
+                show: false
+            },
+            axisTick: {
+                show: false
+            },
+            axisLabel: {
+                color: '#9B9DA5',
+                margin: 15,
+                textStyle: {
+                    align: 'right',
+                    baseline: 'middle'
+                }
+            },
+            nameLocation: 'end',
+            nameTextStyle: { color: '#9B9DA5', padding: [0, 0, 0, -40] },
+            splitLine: {
+                lineStyle: {
+                    type: 'dotted',
+                    width: 0.5
+                }
+            }
+        },
+        legend: {
+            show: false,
+            x: 'right',
+            icon: 'circle',
+            itemWidth: 8, // 图例图形宽度
+            itemHeight: 8,
+            itemGap: 20
+        },
+        series: seriesConfiguration() || defaultData
+    };
+    return option;
+};
+
+// 柱状图堆叠
+export const columnOptionsChartStacking = (name = '', xAxis = [], series = [], color = [], barWidth = 6) => {
+    let defaultData = [
+        {
+            name: '',
+            type: 'bar',
+            data: []
+        }
+    ];
+    let defaultColor = [
+        // ['#0EAEFF', '#85E9FF'],
+        ['#0EAEFF', '#0EAEFF'],
+        ['#85E9FF', '#85E9FF']
+        // ['#F0646C', '#F4994E']
+    ];
+
+    let seriesConfiguration = () => {
+        let seriesData = [
+            {
+                type: 'bar',
+                data: [],
+                name: '',
+                barWidth: barWidth,
+                itemStyle: {
+                    normal: {
+                        barBorderRadius: [15, 15, 0, 0],
+                        color: getColor(color[0] || defaultColor[0])
+                    }
+                },
+                barGap: '100%'
+            },
+            {
+                type: 'bar',
+                data: [],
+                name: '',
+                barWidth: barWidth,
+                itemStyle: {
+                    normal: {
+                        barBorderRadius: [15, 15, 0, 0],
+                        color: getColor(color[1] || defaultColor[1])
+                    }
+                },
+                barGap: '-100%',
+                z: '1'
+            }
+        ];
+        series.map((item, index) => {
+            seriesData[index].data = item.data;
+            seriesData[index].name = item.name;
+        });
+        return seriesData;
+    };
+    let option = {
+        tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+                type: 'shadow',
+                shadowStyle: {
+                    color: {
+                        type: 'linear',
+                        x: 0,
+                        y: 0,
+                        x2: 0,
+                        y2: 1,
+                        colorStops: [
+                            {
+                                offset: 0,
+                                color: 'rgba(31,207,245,0)' // 0% 处的颜色
+                            },
+                            {
+                                offset: 0.8,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 0.2,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 1,
+                                color: 'rgba(31,207,245,0.05)'
+                            }
+                        ],
+                        global: false // 缺省为 false
+                    }
+                },
+                crossStyle: {
+                    shadowBlur: 30,
+                    shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+            },
+            extraCssText: 'background:rgba(33,40,56,0.6);border-radius:4px;padding:6px 10px',
+            textStyle: {
+                fontSize: 12,
+                color: '#FFFFFF'
+            },
+            formatter(param) {
+                let el = ``;
+                param.forEach((item) => {
+                    el += `<p style="text-align: left;">
+        <span style="display:inline-block;margin-right:5px;border-radius:4px;width:12px;height:8px;background-image: linear-gradient(to left, 
+          ${item.color.colorStops[0].color}, ${item.color.colorStops[1].color})"></span>
+                      <span>${item.seriesName}:${item.value}${name}</span>
+                    </p>`;
+                });
+                el += ``;
+                return el;
+            }
+        },
+        grid: {
+            top: 50,
+            left: 10,
+            bottom: 0,
+            right: 0,
+            containLabel: true
+        },
+        xAxis: {
+            type: 'category',
+            axisLine: {
+                show: false // 不显示坐标轴
+            },
+            axisTick: {
+                show: false // 不显示坐标轴刻度
+            },
+            axisLabel: {
+                formatter: function (params, index) {
+                    return params;
+                },
+                color: '#9B9DA5',
+                margin: 15
+            },
+            data: !!xAxis.length ? xAxis : defaultName
+        },
+        yAxis: {
+            type: 'value',
+            splitNumber: 4,
+            name: name,
+            axisLine: {
+                show: false
+            },
+            axisTick: {
+                show: false
+            },
+            axisLabel: {
+                color: '#9B9DA5',
+                margin: 15,
+                textStyle: {
+                    align: 'right',
+                    baseline: 'middle'
+                }
+            },
+            nameLocation: 'end',
+            nameTextStyle: { color: '#9B9DA5', padding: [0, 0, 0, -40] },
+            splitLine: {
+                lineStyle: {
+                    type: 'dotted',
+                    width: 0.5
+                }
+            }
+        },
+        legend: {
+            show: false,
+            x: 'right',
+            icon: 'circle',
+            itemWidth: 8, // 图例图形宽度
+            itemHeight: 8,
+            itemGap: 20
+        },
+        series: seriesConfiguration() || defaultData
+    };
+    return option;
+};
+
+// 折线日期  间隔4个
+export const discountedChart = (name = '', xAxis = [], series = [], legendShow = false, color = []) => {
+    let option = {
+        tooltip: {
+            trigger: 'axis',
+            textStyle: {
+                fontSize: 12,
+                color: '#FFFFFF'
+            }
+            // formatter(param) {
+            //   let el = `<div class="dmp-echart-tooltip"><h4>${dateType(param[0].axisValue)}</h4>`;
+            //   param.forEach(item => {
+            //     el += `<p>
+            //                   <span class="marker" style="display:inline-block;margin-right:5px;border-radius:10px;width:10px;height:10px;background-image: linear-gradient(to left,
+            //                     ${item.color.colorStops[0].color}, ${item.color.colorStops[1].color});"></span>
+            //                   <span>${item.seriesName}:${item.value}</span>
+            //                 </p>`;
+            //   });
+            //   el += `</div>`;
+            //   return el;
+            // }
+        },
+        grid: {
+            top: 50,
+            left: 5,
+            bottom: 0,
+            right: 5,
+            containLabel: true
+        },
+
+        legend: {
+            show: legendShow,
+            icon: 'circle',
+            x: 'right', // 可设定图例在左、右、居中
+            itemWidth: 8, // 图例图形宽度
+            itemHeight: 8,
+            itemGap: 20
+        },
+        xAxis: {
+            type: 'category',
+            axisLine: {
+                show: false // 不显示坐标轴
+            },
+            axisTick: {
+                show: false // 不显示坐标轴刻度
+            },
+            axisLabel: {
+                interval: 4,
+                // formatter: function (params, index) {
+                //     return params.slice(5);
+                // },
+                color: '#9B9DA5',
+                margin: 16
+            },
+            data: xAxis,
+            axisPointer: {
+                type: 'shadow',
+                shadowStyle: {
+                    color: {
+                        type: 'linear',
+                        x: 0,
+                        y: 0,
+                        x2: 0,
+                        y2: 1,
+                        colorStops: [
+                            {
+                                offset: 0,
+                                color: 'rgba(31,207,245,0)' // 0% 处的颜色
+                            },
+                            {
+                                offset: 0.8,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 0.2,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 1,
+                                color: 'rgba(31,207,245,0.05)'
+                            }
+                        ],
+                        global: false // 缺省为 false
+                    }
+                }
+            }
+        },
+        yAxis: {
+            type: 'value',
+            splitNumber: 4,
+            axisLine: {
+                show: false
+            },
+            name: name,
+            axisTick: {
+                show: false
+            },
+            axisLabel: {
+                color: '#9B9DA5',
+                margin: 15,
+                textStyle: {
+                    align: 'right',
+                    baseline: 'middle'
+                }
+            },
+            nameLocation: 'end',
+            nameTextStyle: { color: '#9B9DA5', padding: [0, 0, 0, -40] },
+            splitLine: {
+                lineStyle: {
+                    type: 'dotted',
+                    width: 0.2
+                }
+            }
+        },
+        series: [
+            {
+                // name: "设备告警",
+                type: 'line',
+                smooth: true,
+                symbol: 'circle', // 实心
+                symbolSize: 1, // 设定实心点的大小
+                itemStyle: getItemStyle('#5EEDCC', '#24C3F1'),
+                data: series,
+                areaStyle: {
+                    normal: {
+                        color: new echarts.graphic.LinearGradient(0, 0, 0, 1, [
+                            {
+                                offset: 0,
+                                color: 'rgba(36,121,253,0.1)'
+                            },
+                            {
+                                offset: 1,
+                                color: 'rgba(19,194,247,0.3)'
+                            }
+                        ])
+                    }
+                },
+                lineStyle: {
+                    width: 1
+                }
+            }
+        ]
+    };
+    return option;
+};
+
+// 漏斗图
+export const funnelChart = (dataseries = [], series = []) => {
+    // var colors=[['#22D8FF','#00B2FF']]
+    var colorList = [
+        {
+            colorStops: [
+                {
+                    offset: 0,
+                    color: '#22D8FF' // 0% 处的颜色
+                },
+                {
+                    offset: 1,
+                    color: '#00B2FF' // 100% 处的颜色
+                }
+            ]
+        },
+        {
+            colorStops: [
+                {
+                    offset: 0,
+                    color: '#5EEDCC' // 0% 处的颜色
+                },
+                {
+                    offset: 1,
+                    color: '#24C3F1' // 100% 处的颜色
+                }
+            ]
+        },
+        {
+            colorStops: [
+                {
+                    offset: 0,
+                    color: '#F0646C' // 0% 处的颜色
+                },
+                {
+                    offset: 1,
+                    color: '#F4994E' // 100% 处的颜色
+                }
+            ]
+        },
+        {
+            colorStops: [
+                {
+                    offset: 0,
+                    color: '#7178FF' // 0% 处的颜色
+                },
+                {
+                    offset: 1,
+                    color: '#D2A4FF ' // 100% 处的颜色
+                }
+            ]
+        },
+        {
+            colorStops: [
+                {
+                    offset: 0,
+                    color: '#884DD2' // 0% 处的颜色
+                },
+                {
+                    offset: 1,
+                    color: '#DF63CC' // 100% 处的颜色
+                }
+            ]
+        }
+    ];
+    let option = {
+        title: {
+            text: ''
+        },
+
+        // backgroundColor:'#ffffff',
+        color: colorList,
+        series: [
+            {
+                top: 0,
+                type: 'funnel',
+                left: '10%',
+                top: '15%',
+                width: '50%',
+                height: '85%',
+                gap: 0,
+                minSize: 50,
+                maxSize: 260,
+                label: {
+                    show: true,
+                    position: 'inside',
+                    // formatter: '{d}'
+                    formatter: function (data) {
+                        return data.percent.toFixed(0) + '%';
+                    },
+                    textStyle: {
+                        shadowOffsetX: 0,
+                        fontSize: '14',
+                        shadowColor: 'rgba(0, 0, 0, 0)',
+                        color: '#FFFFFF'
+                    }
+                },
+                data: dataseries
+            },
+
+            {
+                top: 0,
+                type: 'funnel',
+                left: '0',
+                width: '30%',
+                height: '85%',
+                top: '15%',
+                gap: 16,
+                z: 1,
+                // minSize: 50,
+                // maxSize: 50,
+                label: {
+                    normal: {
+                        // padding :[11,25],
+                        formatter: function (params) {
+                            let el = `{a|${params.name}}  {b|${params.value}}`;
+                            return el;
+                        },
+                        textStyle: {
+                            rich: {
+                                a: {
+                                    fontSize: 12,
+                                    color: '#858892',
+                                    padding: [0, 5, 0, 0]
+                                },
+                                b: {
+                                    fontSize: 14,
+                                    color: '#fff',
+                                    padding: [0, 0, 0, 5]
+                                }
+                            }
+                        }
+                    }
+                },
+                //右侧的百分比显示的地方
+                labelLine: {
+                    show: true,
+                    normal: {
+                        show: false,
+                        length: 200,
+                        position: 'center',
+                        lineStyle: {
+                            width: 1,
+                            color: 'red',
+                            type: 'solid'
+                        }
+                    }
+                },
+                // 主体是透明的
+                itemStyle: {
+                    normal: {
+                        color: 'transparent',
+                        borderWidth: 0,
+                        opacity: 1
+                    }
+                },
+                data: series
+            }
+        ]
+    };
+    return option;
+};
+
+// 柱状图  双个柱图
+export const columnOptionsChartss = (name = '', xAxis = [], series = [], dataseries = [], dataName = [], color = [], barWidth = 6) => {
+    let defaultData = [
+        {
+            name: '',
+            type: 'bar',
+            data: []
+        }
+    ];
+    let defaultColor = [
+        ['#0EAEFF', '#85E9FF'],
+        ['#F0646C', '#F4994E']
+    ];
+    let seriesConfiguration = () => {
+        let seriesData = [
+            {
+                name: '',
+                type: 'bar',
+                data: [],
+                barWidth: barWidth,
+                itemStyle: {
+                    normal: {
+                        barBorderRadius: [15, 15, 0, 0],
+                        color: getColor(color[0] || defaultColor[0])
+                    }
+                },
+                barGap: '100%'
+            },
+            {
+                name: '',
+                type: 'bar',
+                data: [],
+                barWidth: barWidth,
+                itemStyle: {
+                    normal: {
+                        barBorderRadius: [15, 15, 0, 0],
+                        color: getColor(color[1] || defaultColor[1])
+                    }
+                },
+                barGap: '100%'
+            }
+        ];
+        series.map((item, index) => {
+            seriesData[0].data.push(item.data);
+            seriesData[0].name = dataName[0];
+        });
+        dataseries.map((items, indexs) => {
+            seriesData[1].data.push(items.data);
+            seriesData[1].name = dataName[1];
+        });
+
+        return seriesData;
+    };
+    let option = {
+        tooltip: {
+            trigger: 'axis',
+            axisPointer: {
+                type: 'shadow',
+                shadowStyle: {
+                    color: {
+                        type: 'linear',
+                        x: 0,
+                        y: 0,
+                        x2: 0,
+                        y2: 1,
+                        colorStops: [
+                            {
+                                offset: 0,
+                                color: 'rgba(31,207,245,0)' // 0% 处的颜色
+                            },
+                            {
+                                offset: 0.8,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 0.2,
+                                color: 'rgba(31,207,245,0.15)' // 100% 处的颜色
+                            },
+                            {
+                                offset: 1,
+                                color: 'rgba(31,207,245,0.05)'
+                            }
+                        ],
+                        global: false // 缺省为 false
+                    }
+                },
+                crossStyle: {
+                    shadowBlur: 30,
+                    shadowColor: 'rgba(0, 0, 0, 0.5)'
+                }
+            },
+            extraCssText: 'background:rgba(33,40,56,0.6);border-radius:4px;padding:6px 10px',
+            textStyle: {
+                fontSize: 12,
+                color: '#FFFFFF'
+            },
+            formatter(param) {
+                let el = ``;
+                param.forEach((item) => {
+                    el += `<p style="text-align: left;">
+        <span style="display:inline-block;margin-right:5px;border-radius:4px;width:12px;height:8px;background-image: linear-gradient(to left, 
+          ${item.color.colorStops[0].color}, ${item.color.colorStops[1].color})"></span>
+                      <span>${item.seriesName}:${item.value}${name}</span>
+                    </p>`;
+                });
+                el += ``;
+                return el;
+            }
+        },
+        grid: {
+            top: 50,
+            left: 10,
+            bottom: 0,
+            right: 0,
+            containLabel: true
+        },
+        xAxis: {
+            type: 'category',
+            axisLine: {
+                show: false // 不显示坐标轴
+            },
+            axisTick: {
+                show: false // 不显示坐标轴刻度
+            },
+            axisLabel: {
+                formatter: function (params, index) {
+                    return params;
+                },
+                color: '#9B9DA5',
+                margin: 15
+            },
+            data: !!xAxis.length ? xAxis : defaultName
+        },
+        yAxis: {
+            type: 'value',
+            splitNumber: 4,
+            name: name,
+            axisLine: {
+                show: false
+            },
+            axisTick: {
+                show: false
+            },
+            axisLabel: {
+                color: '#9B9DA5',
+                margin: 15,
+                textStyle: {
+                    align: 'right',
+                    baseline: 'middle'
+                }
+            },
+            nameLocation: 'end',
+            nameTextStyle: { color: '#9B9DA5', padding: [0, 0, 0, -40] },
+            splitLine: {
+                lineStyle: {
+                    type: 'dotted',
+                    width: 0.5
+                }
+            }
+        },
+        legend: {
+            show: true,
+            x: 'right',
+            icon: 'circle',
+            itemWidth: 8, // 图例图形宽度
+            itemHeight: 8,
+            itemGap: 20,
+            textStyle: {
+                color: '#FFF'
+            }
+        },
+        series: seriesConfiguration() || defaultData
+    };
+    return option;
+};

+ 95 - 0
commandCenter/src/views/operationalServices/assembly/operationMaintenancePersonnel.vue

@@ -0,0 +1,95 @@
+
+<template>
+  <div class="modelBlock">
+    <div class="model-title">
+      <div class="model-title-text">运维人员任务执行情况</div>
+      <div class="model-title-right">
+        <el-date-picker
+          value-format="yyyy-MM"
+          v-model="date"
+          type="month"
+          placeholder="选择月"
+          class="saveColumn-select"
+          :clearable="false"
+          @change="changeTime"
+        >
+        </el-date-picker>
+      </div>
+    </div>
+    <div class="model-content">
+      <zz-echart
+        :option="clientOptions"
+        class="chart"
+      ></zz-echart>
+    </div>
+  </div>
+</template>
+<script>
+import { columnOptionsChartStacking } from './indexOptionChart';
+let dataArr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+export default {
+  data () {
+    return {
+      mixins_query: {
+        communityId: '',
+        date: '',
+      },
+      date: '',
+      clientOptions: columnOptionsChartStacking(
+        '(个)',
+        ['name1', 'name2', 'name3'],
+        [
+          {
+            data: [10, 20, 15],
+            name: '任务总数'
+          },
+          {
+            data: [20, 30, 10],
+            name: '已完成'
+          }
+        ],
+        [],
+        10
+      ),
+    };
+  },
+  methods: {
+    getData () {
+      this.$http.get('/sc-community/statisticWorkOrderTask', this.mixins_query).then(({ data, msg, status }) => {
+        if (status == 0 && !!data) {
+          let dataName = [];
+          let dataNums = [];
+          let datacompelete = [];
+          data.map((item) => {
+            dataName.push(item.name);
+            dataNums.push(item.total);
+            datacompelete.push(item.completeTotal);
+          })
+          this.clientOptions = columnOptionsChartStacking('(个)', dataName, [{ data: dataNums, name: '任务总数' }, { data: datacompelete, name: '已完成' }], [], 10);
+        }
+      })
+    },
+    changeTime (v) {
+      this.mixins_query.date = v + '-01';
+      this.getData();
+    }
+  },
+  created () {
+    this.mixins_query.date = this.$moment().format('YYYY-MM') + '-01';
+    this.date = this.$moment().format('YYYY-MM');
+    this.getData();
+  }
+};
+</script>
+<style scoped lang="scss">
+@import '../style.scss';
+.model-title {
+    .model-title-right {
+        .saveColumn-select {
+            &:not(:first-child) {
+                margin-left: rem(20);
+            }
+        }
+    }
+}
+</style>

+ 92 - 0
commandCenter/src/views/operationalServices/assembly/orderClassification.vue

@@ -0,0 +1,92 @@
+<template>
+  <div class="modelBlock">
+    <div class="model-title">
+      <div class="model-title-text">运维工单分类</div>
+      <div class="model-title-right">
+        <el-date-picker
+          value-format="yyyy-MM"
+          v-model="date"
+          type="month"
+          placeholder="选择月"
+          class="saveColumn-select"
+          @change="changeTime"
+          :clearable="false"
+        >
+        </el-date-picker>
+      </div>
+    </div>
+    <div class="model-content">
+      <zz-echart
+        :option="clientOptions"
+        class="chart"
+      ></zz-echart>
+      <div class="totals">
+        <span class="size-color">{{ total }}</span>
+        <span class="numbers size-color">工作总数</span>
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+import { ringType } from './indexOptionChart';
+export default {
+  data () {
+    return {
+      mixins_query: {
+        communityId: '',
+        date: '',
+      },
+      total: 0,
+      date: '',
+      clientOptions: ringType(
+        [],
+        [
+          { value: 0, name: '业主报修' },
+          { value: 0, name: '内部报修' }
+        ],
+        {},
+        { type: '%', total: 0 }
+      )
+    };
+  },
+  methods: {
+    changeTime (v) {
+      this.mixins_query.date = v + '-01';
+      this.getData();
+    },
+    getData () {
+      this.$http.get('/sc-community/statisticWorkOrderCategory', this.mixins_query).then(({ data, msg, status }) => {
+        if (status == 0 && !!data.datas) {
+          this.clientOptions = ringType([], this.eachartObj(data), {}, { type: '%', total: data.total });
+        }
+      });
+    },
+    eachartObj (data) {
+      this.total = data.total;
+      let typeName = {
+        1: '业主报修',
+        2: '内部报修'
+      };
+      let newData = [];
+      for (let a in data.datas) {
+        newData.push({
+          value: data.datas[a],
+          name: a
+        });
+      }
+      return newData;
+    }
+  },
+  created () {
+    this.mixins_query.date = this.$moment().format('YYYY-MM') + '-01';
+    this.date = this.$moment().format('YYYY-MM');
+    this.getData();
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import '../style.scss';
+.size-color {
+    color: #fff;
+}
+</style>

+ 94 - 0
commandCenter/src/views/operationalServices/assembly/satisfaction.vue

@@ -0,0 +1,94 @@
+<template>
+  <div class="modelBlock">
+    <div class="model-title">
+      <div class="model-title-text">服务满意度趋势</div>
+      <div class="model-title-right">
+        <el-select
+          v-model="mixins_query.type"
+          placeholder="所有服务"
+          clearable
+          class="saveColumn-select"
+          @change="getData"
+        >
+          <el-option
+            label="投诉建议"
+            :value="1"
+          ></el-option>
+          <el-option
+            label="运维工单"
+            :value="2"
+          ></el-option>
+        </el-select>
+        <el-date-picker
+          value-format="yyyy"
+          v-model="date"
+          type="year"
+          placeholder="选择年"
+          class="saveColumn-select"
+          @change="changeTime"
+          :clearable="false"
+        >
+        </el-date-picker>
+      </div>
+    </div>
+    <div class="model-content">
+      <zz-echart
+        :option="clientOptions"
+        class="chart"
+      ></zz-echart>
+    </div>
+  </div>
+</template>
+<script>
+import { columnOptionsChart } from './indexOptionChart';
+let dataArr = [0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0];
+export default {
+  data () {
+    return {
+      mixins_query: {
+        communityId: '',
+        date: '',
+        type: ''
+      },
+      date: '',
+      clientOptions: columnOptionsChart('(分)', [], [{ data: dataArr, name: '服务满意度' }], [], 10)
+    };
+  },
+  methods: {
+    getData () {
+      this.$http.get('/sc-community/statisticServiceTrends', this.mixins_query).then(({ data, msg, status }) => {
+        if (status == 0 && !!data) {
+          let timeDay = [],
+            datas = [];
+          data.map((item) => {
+            timeDay.push(item.date);
+            datas.push(item.data);
+          });
+          this.clientOptions = columnOptionsChart('(分)', timeDay, [{ data: datas, name: '服务满意度' }], [], 10);
+        }
+      });
+    },
+    changeTime (v) {
+      this.mixins_query.date = v + '-01-01';
+      this.getData();
+    }
+  },
+  created () {
+    this.date = this.$moment().format('YYYY');
+    this.mixins_query.date = this.$moment().format('YYYY') + '-01-01';
+    this.getData();
+  }
+};
+</script>
+<style scoped lang="scss">
+@import '../style.scss';
+.model-title {
+    .model-title-right {
+        .saveColumn-select {
+            &:not(:first-child) {
+                margin-left: rem(20);
+            }
+        }
+    }
+}
+</style>

+ 96 - 0
commandCenter/src/views/operationalServices/assembly/scoringOperationPersonnel.vue

@@ -0,0 +1,96 @@
+<template>
+  <div class="modelBlock">
+    <div class="model-title">
+      <div class="model-title-text">运维人员评分系统</div>
+      <div class="model-title-right">
+        <el-date-picker
+          value-format="yyyy-MM"
+          v-model="date"
+          type="month"
+          placeholder="选择月"
+          class="saveColumn-select"
+          @change="changeTime"
+          :clearable="false"
+        >
+        </el-date-picker>
+      </div>
+    </div>
+    <div class="model-content">
+      <zz-echart
+        :option="clientOptions"
+        class="chart"
+      ></zz-echart>
+    </div>
+  </div>
+</template>
+<script>
+import { columnOptionsChartName } from './indexOptionChart.js';
+export default {
+  data () {
+    return {
+      date: "",
+      mixins_query: {
+        communityId: '',
+        date: ''
+      },
+      clientOptions: columnOptionsChartName(
+        '(个)',
+        ['name1', 'name2', 'name3'],
+        [
+          {
+            name: 'name1',
+            data: 0
+          },
+          {
+            name: 'name2',
+            data: 0
+          },
+          {
+            name: 'name3',
+            data: 0
+          }
+        ],
+        [],
+        10
+      )
+    };
+  },
+  created () {
+    this.mixins_query.date = this.$moment().format('YYYY-MM') + '-01';
+    this.date = this.$moment().format('YYYY-MM');
+    this.getData();
+  },
+  mounted () { },
+  computed: {},
+  methods: {
+    getData () {
+      this.$http
+        .get('/sc-community-web/statisticWorkOrderEvaluate', this.mixins_query)
+        .then(({ status, data, msg }) => {
+          if (status == 0) {
+            debugger
+            let name = [];
+            let Resdate = [];
+            for (let i = 0; i < data.length; i++) {
+              name.push(data[i].name)
+              Resdate.push({
+                name: data[i].name,
+                data: data[i].evaluation
+              })
+            }
+
+            this.clientOptions = columnOptionsChartName('(个)', name, Resdate, [], 10);
+          }
+        })
+        .catch((err) => { });
+    },
+    changeTime (v) {
+      this.mixins_query.date = v + '-01';
+      this.getData();
+    },
+  }
+};
+</script>
+<style scoped lang="scss">
+@import '../style.scss';
+</style>

+ 140 - 0
commandCenter/src/views/operationalServices/assembly/todayTask.vue

@@ -0,0 +1,140 @@
+<template>
+  <div class="modelBlock">
+    <div class="model-title">
+      <div class="model-title-text">社区总体情况统计</div>
+    </div>
+    <div class="model-contents">
+      <!-- @click="$router.push({ path: item.path })" -->
+      <!-- <div class="number">{{ houseData[item.fontObj] }}</div>
+        <div class="text">{{ item.name }}</div> -->
+      <div
+        class="blockmuen"
+        :style="item.style"
+        v-for="(item, index) in blockArr"
+        :key="index"
+      >
+        <div v-if="index== 1 ? true :index ==0 ? true :flase ">
+          <span
+            class="text"
+            style="margin-right: 20px;"
+          >{{item.name}}</span>
+          <span
+            class="number"
+            style="font-size: 30px; position: relative;
+    top: 4px;"
+          >{{item.resData}}</span>
+        </div>
+        <div v-else>
+          <div
+            class="number"
+            style="font-size: 20px;
+    margin-bottom: 10px;"
+          >{{item.resData}}</div>
+          <div class="text">{{item.name}}</div>
+        </div>
+
+      </div>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+
+  data () {
+    return {
+      houseData: [],
+      blockArr: [
+        {
+          style: 'background: linear-gradient(135deg, #488fff 0%, #65dcff 100%);width: 100%; grid-area: 1/1 / span 1 / span 2; height:80px',
+          name: '工单',
+          resData: ''
+        },
+        {
+          style: 'background: linear-gradient(315deg, #884DD2 0%, #DF63CC  100%);width: 100%; grid-area: 1/3 / span 1 / span 2;height:80px',
+          name: '投诉',
+          resData: ''
+        },
+        {
+          style: 'background: linear-gradient(135deg, #5EEDCC 0%, #24C3F1 100%);',
+          name: '已完成',
+          resData: ''
+        },
+        {
+          style: 'background: linear-gradient(135deg, #F0646C 0%, #F4994E 100%);',
+          name: '未完成',
+          resData: ''
+        },
+        {
+          style: 'background: linear-gradient(135deg, #5EEDCC  0%, #24C3F1 100%);',
+          name: '已处理',
+          resData: ''
+        },
+        {
+          style: 'background: linear-gradient(135deg, #F0646C 0%, #F4994E 100%);',
+          name: '未处理',
+          resData: ''
+        }
+      ],
+      mixins_query: {
+        communityId: '',
+        date: ''
+      }
+    };
+  },
+  methods: {
+    // 获取房屋信息
+    getData () {
+      this.$http.get('/sc-community-web/statisticTodayTask', this.mixins_query).then(({ data, msg, status }) => {
+        if (status == 0) {
+          this.blockArr[0].resData = data.workOrder.total;
+          this.blockArr[1].resData = data.feedback.total;
+          this.blockArr[2].resData = data.workOrder.completeTotal;
+          this.blockArr[3].resData = data.workOrder.unfinishedTotal;
+          this.blockArr[4].resData = data.feedback.completeTotal;
+          this.blockArr[5].resData = data.feedback.unfinishedTotal;
+        }
+      });
+    }
+  },
+  created () {
+    var date = new Date();
+    let year = date.getFullYear();
+    let month = (date.getMonth() + 1) < 10 ? '0' + (date.getMonth() + 1) : (date.getMonth() + 1);
+    let resdate = date.getDate();
+    this.mixins_query.date = year + '-' + month + '-' + resdate;
+    this.getData();
+  }
+};
+</script>
+<style lang="scss" scoped>
+@import '../style.scss';
+.modelBlock {
+    height: 280px;
+    .model-contents {
+        width: 100%;
+        height: 25%;
+        margin: 5% 0;
+        display: grid;
+        row-gap: rem(20);
+        column-gap: rem(20);
+        grid-template-columns: repeat(4, minmax(0, 1fr));
+        grid-template-rows: 1fr 1fr;
+        .blockmuen {
+            border-radius: rem(10);
+            box-sizing: border-box;
+            padding-left: rem(20);
+            padding-top: rem(20);
+            // cursor: pointer;
+            .number {
+                font-size: rem(30);
+            }
+        }
+    }
+    .number {
+        color: #ffffff;
+    }
+    .text {
+        color: #ffffff;
+    }
+}
+</style>

+ 109 - 0
commandCenter/src/views/operationalServices/index.vue

@@ -0,0 +1,109 @@
+<template>
+  <div class="index-content">
+    <div class="contentShow">
+      <div class="index-task">
+        <today-task></today-task>
+      </div>
+      <div class="index-satisfaction list_1-2_2-2">
+        <satisfaction></satisfaction>
+      </div>
+      <div class="index-task">
+        <completion-maintenance-order></completion-maintenance-order>
+      </div>
+
+      <div class="index-task mar-top">
+        <distribution-suggestion></distribution-suggestion>
+      </div>
+      <div class="index-suggestions list_2-2_2-2 mar-top">
+        <complaints-and-suggestions></complaints-and-suggestions>
+      </div>
+      <div class="index-task mar-top">
+        <order-classification></order-classification>
+      </div>
+
+      <div class="maintenance list_3-1_3-2 mar-top">
+        <operation-maintenance-personnel></operation-maintenance-personnel>
+      </div>
+      <div class="personnel list_3-3_3-2 mar-top">
+        <scoring-operation-personnel></scoring-operation-personnel>
+      </div>
+    </div>
+  </div>
+</template>
+
+
+
+<script>
+import index from './assembly/index';
+export default {
+  mixins: [index],
+}
+</script>
+
+
+
+<style lang="scss" scoped>
+@import '@assets/css/public-style.scss';
+@import '@views/communityAssets/style.scss';
+
+@import '@assets/css/public-style.scss';
+$BackColor: #171f32;
+.list_border {
+    border: 1px solid $BackColor;
+    border-radius: 4px;
+}
+.mr10 {
+    margin: rem(10);
+}
+@mixin moveHover {
+    box-shadow: inset 0px 1px 50px 0px rgba(14, 174, 255, 0.5);
+    border: 1px dashed #1396dc;
+}
+.moveHover {
+    box-shadow: inset 0px 1px 50px 0px rgba(14, 174, 255, 0.5);
+    border: 1px dashed #1396dc;
+}
+
+.contentShow {
+    width: 100%;
+    height: calc(100% - 90px);
+    border-radius: 4px;
+    padding: 20px;
+    display: grid;
+    grid-template-columns: 2fr 2fr 2fr 2fr;
+    grid-template-rows: 1fr 1fr 1fr;
+    gap: 0px;
+    position: absolute;
+    top: 90px;
+}
+.index-task {
+    background: #171f32;
+    border-radius: 4px;
+}
+.list_1-2_2-2 {
+    grid-area: 1/2 / span 1 / span 2;
+    background: #171f32;
+    border-radius: 4px;
+    margin: 0 20px;
+}
+.list_2-2_2-2 {
+    grid-area: 2/2 / span 1 / span 2;
+    background: #171f32;
+    border-radius: 4px;
+    margin: 0 20px;
+}
+.mar-top {
+    margin-top: 20px;
+}
+.list_3-1_3-2 {
+    grid-area: 3/1 / span 3 / span 2;
+    background: #171f32;
+    border-radius: 4px;
+    margin-right: 20px;
+}
+.list_3-3_3-2 {
+    grid-area: 3/3 / span 3 / span 2;
+    background: #171f32;
+    border-radius: 4px;
+}
+</style>

+ 84 - 0
commandCenter/src/views/operationalServices/style.scss

@@ -0,0 +1,84 @@
+$name: index-content;
+.#{$name} {
+    height: 100%;
+    width: 100%;
+    position: relative;
+    overflow-y: auto;
+    min-height: 800px;
+}
+
+@import '@assets/css/public-style.scss';
+.modelBlock {
+    height: 100%;
+    padding: rem(15) rem(20) rem(20);
+    background: #171f32;
+    position: relative;
+    .model-title {
+        line-height: rem(30);
+        display: flex;
+        justify-content: space-between;
+        padding-bottom: rem(15);
+        border-bottom: 1px solid rgba(224, 225, 227, 0.2);
+        .saveColumn-select {
+            width: rem(100);
+            /deep/ .el-input__inner {
+                background: transparent;
+                color: white;
+                padding-right: rem(20);
+                border-color: rgba(255, 255, 255, 0.2);
+            }
+        }
+        .model-title-text {
+            color: white;
+        }
+        .buttons {
+            width: rem(120);
+            padding-left: rem(10);
+            box-sizing: border-box;
+            background: rgba(0, 0, 0, 0.1);
+            border-radius: 4px;
+            border: 1px solid rgba(255, 255, 255, 0.2);
+            cursor: pointer;
+
+            span.triangle {
+                margin-top: rem(10);
+                float: right;
+                margin-right: rem(5);
+                border: 4px solid transparent;
+                border-left: 4px solid rgba(255, 255, 255, 0.5);
+            }
+        }
+    }
+    .model-content {
+        height: calc(100% - #{rem(45)});
+        display: flex;
+        justify-content: space-between;
+        font-size: 12px;
+        position: relative;
+        .totals {
+            position: absolute;
+            right: rem(10);
+            top: rem(26);
+            width: rem(120);
+            height: rem(40);
+            background: linear-gradient(90deg, rgba(14, 174, 255, 0.5) 0%, rgba(14, 174, 255, 0) 100%);
+            border-radius: 5px;
+            font-size: 20px;
+            padding: rem(8) rem(10);
+            display: flex;
+            justify-content: space-between;
+            .numbers {
+                font-size: 12px;
+                opacity: 0.5;
+                line-height: rem(32);
+            }
+        }
+    }
+}
+.no-permission {
+    position: absolute;
+    top: 50%;
+    left: 50%;
+    transform: translate(-50%, -50%);
+    font-size: 12px;
+}