408249787 2 years ago
parent
commit
711e16f18e
2 changed files with 633 additions and 4 deletions
  1. 1 1
      src/utils/install.js
  2. 632 3
      src/views/statisticView/9.vue

+ 1 - 1
src/utils/install.js

@@ -18,7 +18,7 @@ import iconfont from '@/components/IconSelector/iconfont.js'
 import ImportForm from '@/components/custom/ImportForm'
 const MyIcon = Icon.createFromIconfontCN({
   // scriptUrl: iconfont // //at.alicdn.com/t/font_1314041_9qgpnn1vvko.js在 iconfont.cn 上生成
-  scriptUrl: '//at.alicdn.com/t/font_3266072_h6bz457pnli.js'
+  scriptUrl: '//at.alicdn.com/t/font_3266072_7es9xsm5jnp.js'
 })
 
 export default {

+ 632 - 3
src/views/statisticView/9.vue

@@ -1,15 +1,644 @@
 <template>
-  <div>
-    dfdsf
+  <div class="view-container">
+    <div class="top">
+      <div class="top-left">
+        <div class="top-left-top">
+          <div class="title">年入库备件价值占比</div>
+          <div style="display:flex; justify-content:space-between;padding-right: 40px; position:relative">
+            <div id="chart1"></div>
+            <div style="position:absolute;top:0;left:60px;color: #C3CAD9;">备件价值:<span style="color:white;font-size:24px;">432,452¥</span></div>
+            <div style="width: 474px;height: 196px;">
+              <table>
+                <thead>
+                  <tr style="display: flex;justify-content: space-between; background:RGBA(22, 38, 81, 1);">
+                    <th class="list-header " style="width:232px">备件名称</th>
+                    <th class="list-header">备件价值</th>
+                    <th class="list-header">价值占比</th>
+                  </tr>
+                </thead>
+                <tbody>
+                  <tr v-for="(list,i) in list1" :key="i" style="display: flex;justify-content: space-between;">
+                    <td class="list-header" style="width:232px;">{{ list.year }}</td>
+                    <td class="list-header" :style="color[i]">{{ list.sales }}</td>
+                    <td class="list-header" style="">{{ list.date }}</td>
+                  </tr>
+                </tbody>
+              </table>
+            </div>
+          </div>
+        </div>
+        <div class="top-left-bottom">
+          <div class="title">出入库类型数量占比</div>
+          <div style="display:flex; justify-content: space-between; padding: 0 30px; align-items: center; position: relative;">
+            <div>
+              <div id="chart2"></div>
+              <div style="position: absolute;left:100px;bottom:0px;">入库类型占比</div>
+            </div>
+            <a-divider style="height: 200px;background-color: rgba(153, 204, 255, 0.1);" type="vertical" />
+            <div>
+              <div id="chart22"></div>
+              <div style="position: absolute;right:200px;bottom:0px;">出库类型占比</div>
+            </div>
+          </div>
+        </div>
+      </div>
+      <div class="top-right">
+        <div class="top-right-top">
+          <div class="title">年出入库备件价值统计</div>
+          <div style="display:flex; justify-content: space-around; color:#8A92A2;padding-bottom:30px;">
+            <div style="display:flex; align-items: center;  width: 250px;height: 75px; background:#1C3058;border: 1px solid rgba(153, 204, 255, 0.2);">
+              <my-icon style="font-size:42px;padding: 0 24px;" type="icon-rukuguanli" />
+              <div style="text-align:center; ">
+                <div style="font-size:14px;">入库备件价值</div>
+                <div style="font-size:24px; color:#fff;">444444</div>
+              </div>
+            </div>
+            <div style="display:flex; align-items: center;  width: 250px;height: 75px; background:#1C3058;border: 1px solid rgba(153, 204, 255, 0.2);">
+              <my-icon style="font-size:42px;padding: 0 24px;" type="icon-zhibiao" />
+              <div style="text-align:center; ">
+                <div style="font-size:14px;">仓库总备件价值</div>
+                <div style="font-size:24px; color:#fff;">444444</div>
+              </div>
+            </div>
+            <div style="display:flex; align-items: center;  width: 250px;height: 75px; background:#1C3058;border: 1px solid rgba(153, 204, 255, 0.2);">
+              <my-icon style="font-size:42px;padding: 0 24px;" type="icon-chukuguanli" />
+              <div style="text-align:center; ">
+                <div style="font-size:14px;">出库备件价值</div>
+                <div style="font-size:24px; color:#fff;">444444</div>
+              </div>
+            </div>
+          </div>
+          <div id="chart4"></div>
+        </div>
+        <div class="top-right-bottom">
+          <div
+            style="width: 24px;height: 52px;font-size: 24px;padding:24px">通知</div>
+          <div style="width:730px;height:113px;padding: 25px  0">
+            <a-list :split="false" size="small" :data-source="information">
+              <a-list-item style="color:#B9BFD6;padding:0 30px; " slot="renderItem" slot-scope="item">
+                <a-list-item-meta>
+                  <div slot="title" style="color:red" :href="item.href">
+                    <my-icon style="color: #fff; font-size: 16px;" type="icon-laba" />
+                    {{ item.name }}
+                  </div>
+                </a-list-item-meta>
+                <div style="color:red">
+                  {{ item.time }}
+                </div>
+              </a-list-item>
+            </a-list>
+          </div>
+        </div>
+      </div>
+    </div>
+    <div class="bottom">
+      <div class="bottom-left">
+        <div class="title">出入库备件数量统计</div>
+        <div style="display:flex;justify-content: space-between;">
+          <div style="width: 33%;height:220px;">
+            <div style="padding:0 50px 20px 50px;display: flex; justify-content: space-between;font-size: 16px;">
+              <div>入库备件数量统计</div>
+              <div>入库总数:<span style="color:#228FFE; font-weight: bold;">33333</span></div>
+            </div>
+            <div id="chart3"></div>
+          </div>
+          <div style="width: 33%;height:220px;">
+            <div style="padding:0 50px 20px 50px;display: flex; justify-content: space-between;font-size: 16px;">
+              <div>入库备件数量统计</div>
+              <div>入库总数:<span style="color:#00D98B; font-weight: bold;">33333</span></div>
+            </div>
+            <div id="chart33"></div>
+          </div>
+          <div style="width: 33%;height:220px;">
+            <div style="padding:0 50px 20px 50px;display: flex; justify-content: space-between;font-size: 16px;">
+              <div>入库备件数量统计</div>
+              <div>入库总数:<span style="color:#F45E23; font-weight: bold;">33333</span></div>
+            </div>
+            <div id="chart333"></div>
+          </div>
+        </div>
+      </div>
+      <div class="bottom-right">
+        <div class="title">仓库核心数据</div>
+        <div style="padding: 10px 30px;">
+          <div style="padding:16px 0;">备件预警数据</div>
+          <div>
+            <table>
+              <tbody>
+                <tr v-for="(list,i) in list2" :key="i" style="display: flex;justify-content: space-between;">
+                  <td class="list-header" style="width:145px;">{{ list.year }}</td>
+                  <td class="list-header" style="width:145px;">{{ list.sales }}</td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </div>
+        <div style="padding:0 30px;">
+          <div style="padding:16px 0;">备件关键数据</div>
+          <div>
+            <table>
+              <tbody>
+                <tr v-for="(list,i) in list3" :key="i" style="display: flex;justify-content: space-between;">
+                  <td class="list-header" style="width:145px;">{{ list.year }}</td>
+                  <td class="list-header" style="width:145px;">{{ list.sales }}</td>
+                </tr>
+              </tbody>
+            </table>
+          </div>
+        </div>
+      </div>
+    </div>
   </div>
 </template>
 
 <script>
+import { Chart, registerShape, registerTheme } from '@antv/g2'
 export default {
+  data () {
+    return {
+      information: [
+        {
+          name: '项目管理通知',
+          time: '2022-4-7'
+        },
+        {
+          name: '项目管理通知',
+          time: '2022-4-7'
+        },
+        {
+          name: '项目管理通知',
+          time: '2022-4-7'
+        }
 
+      ],
+      list1: [
+        { year: '人工费用', sales: 382, date: '16%' },
+        { year: '备件费用', sales: 522, date: '16%' },
+        { year: '材料费用', sales: 612, date: '16%' },
+        { year: '备件费用', sales: 522, date: '16%' }
+      ],
+      list2: [
+        { year: '备件预警类别', sales: 382 },
+        { year: '备件预警数量', sales: 522 },
+        { year: '备件预警价值', sales: 612 }
+      ],
+      list3: [
+        { year: '备件领用总价值', sales: 382 },
+        { year: '采购入库总价值', sales: 522 }
+      ],
+      color: [
+        { color: '#E93C49' },
+        { color: '#FF6123' },
+        { color: '#E9AF00' },
+        { color: '#02B47B' }
+      ],
+      chart1: [{ value: 77.5 }],
+      chart2: [
+        { day: '采购入库', percent: 30, value: 300 },
+        { day: '闲置入库', percent: 20, value: 200 },
+        { day: '调拨入库', percent: 20, value: 200 },
+        { day: '其他入库', percent: 50, value: 500 }
+      ],
+      chart22: [
+        { day: '领用出库', percent: 30, value: 300 },
+        { day: '调拨出库', percent: 20, value: 200 },
+        { day: '报废出库', percent: 20, value: 200 },
+        { day: '其他出库', percent: 50, value: 500 }
+      ],
+      chart3: [
+        { day: '1月', percent: 6000 },
+        { day: '2月', percent: 4000 },
+        { day: '3月', percent: 5000 },
+        { day: '4月', percent: 6000 },
+        { day: '5月', percent: 7000 },
+        { day: '6月', percent: 6000 }
+      ],
+      chart4: [
+        { month: 'Jan', city: '出库备件价值', temperature: 70500 },
+        { month: 'Jan', city: '仓库总备件价值', temperature: 39050 },
+        { month: 'Jan', city: '入库备件价值', temperature: 40509 },
+        { month: 'Feb', city: '出库备件价值', temperature: 69500 },
+        { month: 'Feb', city: '仓库总备件价值', temperature: 42500 },
+        { month: 'Feb', city: '入库备件价值', temperature: 42500 },
+
+        { month: 'Mar', city: '出库备件价值', temperature: 90550 },
+        { month: 'Mar', city: '仓库总备件价值', temperature: 57500 },
+        { month: 'Mar', city: '入库备件价值', temperature: 70507 },
+
+        { month: 'Apr', city: '出库备件价值', temperature: 34550 },
+        { month: 'Apr', city: '仓库总备件价值', temperature: 89550 },
+        { month: 'Apr', city: '入库备件价值', temperature: 30550 },
+
+        { month: 'May', city: '出库备件价值', temperature: 68054 },
+        { month: 'May', city: '仓库总备件价值', temperature: 110590 },
+        { month: 'May', city: '入库备件价值', temperature: 40509 },
+
+        { month: 'Jun', city: '出库备件价值', temperature: 21505 },
+        { month: 'Jun', city: '仓库总备件价值', temperature: 65502 },
+        { month: 'Jun', city: '入库备件价值', temperature: 105002 },
+
+        { month: 'Jul', city: '出库备件价值', temperature: 25052 },
+        { month: 'Jul', city: '仓库总备件价值', temperature: 47050 },
+        { month: 'Jul', city: '入库备件价值', temperature: 47005 },
+
+        { month: 'Aug', city: '出库备件价值', temperature: 26055 },
+        { month: 'Aug', city: '仓库总备件价值', temperature: 86065 },
+        { month: 'Aug', city: '入库备件价值', temperature: 45656 },
+
+        { month: 'Sep', city: '出库备件价值', temperature: 23453 },
+        { month: 'Sep', city: '仓库总备件价值', temperature: 144542 },
+        { month: 'Sep', city: '入库备件价值', temperature: 144532 },
+
+        { month: 'Oct', city: '出库备件价值', temperature: 55183 },
+        { month: 'Oct', city: '仓库总备件价值', temperature: 54103 },
+        { month: 'Oct', city: '入库备件价值', temperature: 87103 },
+
+        { month: 'Nov', city: '出库备件价值', temperature: 76619 },
+        { month: 'Nov', city: '仓库总备件价值', temperature: 67676 },
+        { month: 'Nov', city: '入库备件价值', temperature: 74126 },
+
+        { month: 'Dec', city: '出库备件价值', temperature: 95666 },
+        { month: 'Dec', city: '仓库总备件价值', temperature: 46668 },
+        { month: 'Dec', city: '入库备件价值', temperature: 66788 }
+
+      ]
+    }
+  },
+  mounted () {
+    this.getChart()
+  },
+  methods: {
+    getChart () {
+      this.getChart1('chart1', this.chart1)
+      this.getChart2('chart2', this.chart2)
+      this.getChart2('chart22', this.chart22)
+      this.getChart3('chart3', this.chart3, '#228FFE')
+      this.getChart3('chart33', this.chart3, '#00D98B')
+      this.getChart3('chart333', this.chart3, '#F45E23')
+      this.getChart4('chart4', this.chart4)
+    },
+    getChart1 (id, data) {
+      registerShape('point', 'pointer', {
+        draw (cfg, container) {
+          const group = container.addGroup()
+          const center = this.parsePoint({ x: 0, y: 0 }) // 获取极坐标系下画布中心点
+          // 绘制指针
+          group.addShape('line', {
+            attrs: {
+              x1: center.x,
+              y1: center.y,
+              x2: cfg.x,
+              y2: cfg.y,
+              stroke: cfg.color,
+              lineWidth: 5,
+              lineCap: 'round'
+            }
+          })
+          group.addShape('circle', {
+            attrs: {
+              x: center.x,
+              y: center.y,
+              r: 9.75,
+              stroke: cfg.color,
+              lineWidth: 4.5,
+              fill: '#fff'
+            }
+          })
+
+          return group
+        }
+      })
+
+      const chart = new Chart({
+        container: id,
+        autoFit: true,
+        height: 300,
+        width: 300,
+        padding: [40, 0, 0, 0]
+      })
+      chart.data(data)
+      chart.scale('value', {
+        min: 0,
+        max: 100,
+        tickInterval: 100
+      })
+      chart.coordinate('polar', {
+        startAngle: (-10 / 8) * Math.PI,
+        endAngle: (2 / 8) * Math.PI,
+        radius: 0.9
+      })
+
+      chart.axis('100', false)
+      chart.axis('value', {
+        line: null,
+        label: {
+          formatter: (val) => {
+            return ''
+          }
+        },
+        subTickLine: {
+          count: 4,
+          length: -15
+        },
+        tickLine: {
+          length: -15
+        },
+        grid: null
+      })
+      chart.legend(false)
+      chart
+        .line()
+        .position('value*1')
+        .color('#0B1A48')
+
+      // 绘制仪表盘背景
+      chart.annotation().arc({
+        top: false,
+        start: [0, 1],
+        end: [100, 1],
+        style: {
+          // 底灰色
+          stroke: '#CBCBCB',
+          lineWidth: 7,
+          lineDash: null
+        }
+      })
+
+      // 绘制指标
+      chart.annotation().arc({
+        start: [0, 1],
+        end: [data[0].value, 1],
+        style: {
+          stroke: '#00D98B',
+          lineWidth: 7,
+          lineDash: null
+        }
+      })
+      // 绘制指标数字
+      chart.annotation().text({
+        position: ['50%', '85%'],
+        content: '价值占比',
+        style: {
+          fontSize: 14,
+          fill: '#545454',
+          textAlign: 'center'
+        }
+      })
+      chart.annotation().text({
+        position: ['50%', '50%'],
+        content: `${data[0].value} %`,
+        style: {
+          fontSize: 36,
+          fill: '#00D98B',
+          textAlign: 'center'
+        },
+        offsetY: 15
+      })
+
+      chart.render()
+    },
+    getChart2 (id, data) {
+      registerTheme('myTheme', {
+        columnWidthRatio: 0.1,
+        colors10: ['#0091F1', '#FDB628', '#00E4EC', '#EB6F49', '#9C24F0 ', '#00FF00', '#9661BC', '#F6903D', '#008685', '#F08BB4']
+      })
+      const chart = new Chart({
+        container: id,
+        autoFit: true,
+        height: 300,
+        width: 330
+      })
+      chart.data(data)
+      chart.scale('percent', {
+        formatter: (val) => {
+          val = val * 100 + '%'
+          return val
+        }
+      })
+      chart.legend('day', {
+        position: 'right',
+        offsetY: -50,
+        itemName: {
+          style: {
+            fill: '#C3CAD9',
+            fontSize: 14
+          }
+        }
+      })
+      chart.coordinate('theta', {
+        radius: 0.75,
+        innerRadius: 0.8
+      })
+      chart.tooltip({
+        showTitle: false,
+        showMarkers: false,
+        itemTpl: '<li class="g2-tooltip-list-item"><span style="background-color:{color};" class="g2-tooltip-marker"></span>{name}: {value}</li>'
+      })
+      // 辅助文本
+
+      chart
+        .interval()
+        .adjust('stack')
+        .position('percent')
+        .color('day')
+        .label('percent', (percent) => {
+          return {
+            style: {
+              fill: '#fff'
+            },
+            content: (data) => {
+              return percent + '%'
+            }
+          }
+        })
+        .tooltip('day*percent', (item, percent) => {
+          percent = percent + '%'
+          return {
+            name: item,
+            value: percent
+          }
+        })
+
+      chart.interaction('element-active')
+      chart.theme('myTheme')
+      chart.render()
+    },
+    getChart3 (id, data, color) {
+      const chart = new Chart({
+        container: id,
+        width: 450,
+        height: 160,
+        appendPadding: [0, 0, 0, 50]
+      })
+      chart.data(data)
+      chart.scale({
+
+        percent: {
+          min: 0,
+          max: 10000,
+          range: [0, 1]
+        }
+      })
+
+      chart.tooltip({
+        showCrosshairs: true,
+        shared: true
+      })
+
+      chart.line().position('day*percent').shape('smooth')
+      chart.point().position('day*percent')
+      chart.theme({ 'styleSheet': { 'brandColor': color } })
+      chart.render()
+    },
+    getChart4 (id, data) {
+      registerTheme('myTheme', {
+        columnWidthRatio: 1,
+        colors10: ['#228FFE', '#00D98B', '#F45E23', '#EB6F49', '#9C24F0 ', '#00FF00', '#9661BC', '#F6903D', '#008685', '#F08BB4']
+      })
+      const chart = new Chart({
+        container: id,
+        autoFit: true,
+        height: 400
+      })
+
+      chart.data(data)
+      chart.scale({
+        month: {
+          range: [0, 1]
+        },
+        temperature: {
+          nice: true
+        }
+      })
+
+      chart.tooltip({
+        showCrosshairs: true,
+        shared: true
+      })
+
+      chart.axis('temperature', {
+        label: {
+          formatter: (val) => {
+            return val
+          }
+        }
+      })
+
+      chart
+        .line()
+        .position('month*temperature')
+        .color('city')
+        .shape('smooth')
+      chart.theme('myTheme')
+
+      chart.render()
+    }
+  }
 }
 </script>
 
-<style>
+<style lang="less" scoped>
+.view-container {
+width:1920px;
+height:1080px;
+color:white;
+font-family: Microsoft YaHei;
+background-color: RGBA(0, 7, 73, 0.8);
+padding:15px;
+}
+.view-container::after {
+  content: "";
+  width:1920px;
+  height:1080px;
+  background: url(../../assets/bgView.png);
+  top: 0;
+  left: 0;
+  bottom: 0;
+  right: 0;
+  position: absolute;
+  z-index: -1;
+}
+.top{
+  display: flex;
+  width: 100%;
+  justify-content:space-between;
+  .top-left{
+    .top-left-top{
+      width: 810px;
+height: 316px;
+background: #0B1A48;
+border-radius: 5px;
+margin-bottom: 15px;
+    }
+    .top-left-bottom{
+      width: 810px;
+height: 394px;
+background: #0B1A48;
+border-radius: 5px;
+    }
+  }
+  .top-right{
+    .top-right-top{
+      padding:0 50px;
+      width: 1065px;
+height: 597px;
+background: #0B1A48;
+border-radius: 5px;
+margin-bottom: 15px;
 
+    }
+    .top-right-bottom{
+      display: flex;
+      justify-content: space-between;
+      width: 699px;
+height: 113px;
+background: #0B1A48;
+border-radius: 5px;
+    }
+  }
+}
+.bottom{
+    position: relative;
+  display: flex;
+  width: 100%;
+  margin-top: 15px;
+  justify-content:space-between;
+  .bottom-left{
+    width: 1524px;
+height: 310px;
+background: #0B1A48;
+border-radius: 5px;
+  }
+  .bottom-right{
+    position: absolute;
+    bottom: 0;
+    right: 0;
+    width: 351px;
+height: 438px;
+background: #0B1A48;
+border-radius: 5px;
+  }
+}
+.title{
+  width: 100%;
+  font-size: 24px;
+  padding: 15px;
+  text-align: center;
+  color: #D9EFFF;
+}
+.list-header{
+     margin:0;
+     padding: 0 10px;
+      width: 120px;
+height: 41px;
+font-size: 14px;
+color: #C3CAD9;
+font-weight: 400;
+font-family: Microsoft YaHei;
+display: flex;
+justify-content: center;
+align-items: center;
+   }
+   table,table tr th, table tr td { border:1px solid rgba(197, 196, 202, 0.1); }
+ table { border-collapse: collapse;}
 </style>