Browse Source

添加导出Excel

zhangyu 5 years ago
parent
commit
5f429a3963
4 changed files with 458 additions and 31 deletions
  1. 4 2
      package.json
  2. 209 0
      src/data/mapTable.js
  3. 103 0
      src/utils/JOSNToExcel.js
  4. 142 29
      src/views/ledger/report/index.vue

+ 4 - 2
package.json

@@ -37,6 +37,7 @@
         "css-loader": "^0.28.0",
         "extract-text-webpack-plugin": "^3.0.0",
         "file-loader": "^1.1.4",
+        "file-saver": "^2.0.2",
         "friendly-errors-webpack-plugin": "^1.6.1",
         "html-webpack-plugin": "^2.30.1",
         "less": "^3.9.0",
@@ -62,7 +63,8 @@
         "webpack": "^3.6.0",
         "webpack-bundle-analyzer": "^2.9.0",
         "webpack-dev-server": "^2.9.1",
-        "webpack-merge": "^4.1.0"
+        "webpack-merge": "^4.1.0",
+        "xlsx": "^0.15.1"
     },
     "engines": {
         "node": ">= 6.0.0",
@@ -73,4 +75,4 @@
         "last 2 versions",
         "not ie <= 8"
     ]
-}
+}

+ 209 - 0
src/data/mapTable.js

@@ -0,0 +1,209 @@
+export const State = {
+  '-5': '已撕码',
+  '-4': '现场未找到',
+  '-3': '现场已找到-隐蔽工程未贴码',
+  '-2': '现场已找到-距离太远未贴码',
+  '-1': '现场已找到-只验证未贴码',
+  '0': '现场已找到-正常贴码',
+  '1': '岗位转资产,待现场验证',
+  '2': '撕码任务',
+  '3': '换码任务'
+}
+
+export const Family = {
+  "AHA": "空气源热泵",
+  "CLA": "吊顶",
+  "WGA": "风力发电装置",
+  "HEA": "换热器",
+  "WBA": "防水板",
+  "MAA": "手动报警按钮",
+  "SBA": "气体灭火启动瓶",
+  "CDA": "水加药装置",
+  "PAA": "燃气调压箱",
+  "SEA": "火灾探测器",
+  "DPA": "位移传感器",
+  "WTB": "水箱",
+  "SDB": "防火排烟阀",
+  "TCA": "伴热电缆",
+  "CRA": "门禁读卡器",
+  "ESA": "扶梯",
+  "OHA": "室外消火栓",
+  "TLC": "坐便器",
+  "DGA": "柴油发电机",
+  "SUA": "供水机组",
+  "CPB": "控制面板",
+  "HSA": "高压开关柜",
+  "FTA": "泡沫储罐组",
+  "TUA": "全程水处理仪",
+  "VDB": "图像传感器",
+  "SAA": "分体空调",
+  "AHB": "空调机组",
+  "DSB": "显示屏",
+  "APA": "空气净化器",
+  "FCB": "变频器",
+  "TUC": "直饮水处理机组",
+  "PNA": "嵌板",
+  "PSB": "巡更棒",
+  "IBA": "伴热保温器",
+  "TPA": "温度传感器",
+  "SKA": "洗碗槽",
+  "SPE": "蹲便器",
+  "EHA": "电热水器",
+  "STA": "自助终端机",
+  "PSD": "停车位",
+  "EXA": "交换机",
+  "WSA": "盥洗盆",
+  "EEA": "电度传感器",
+  "VMA": "监视器",
+  "FLA": "流量传感器",
+  "AAA": "抗浮锚杆",
+  "VDA": "真空脱气机",
+  "SDA": "软化水装置",
+  "ARA": "扶手",
+  "STC": "化粪池",
+  "CBB": "组合式传感器",
+  "OTA": "冷却塔",
+  "RCA": "雨水收集设备",
+  "SUB": "喷灌机组",
+  "ELB": "应急照明灯具",
+  "CBA": "燃煤锅炉",
+  "BGA": "气体灭火瓶组",
+  "SNA": "喷头",
+  "HDB": "干手机",
+  "CMA": "摄像头",
+  "ELA": "直梯",
+  "APB": "油烟净化器",
+  "HDA": "加湿器",
+  "CPA": "充电桩",
+  "PVA": "预作用报警阀组",
+  "AVA": "调节阀",
+  "BPA": "母线插接箱",
+  "DOA": "除味装置",
+  "FEB": "广播前端设备",
+  "PLB": "桩",
+  "CTC": "帘",
+  "STB": "蓄冷热槽",
+  "FCA": "风机盘管",
+  "IHA": "即时加热器",
+  "IUA": "室内机",
+  "PPA": "水泵",
+  "HFA": "硬件防火墙",
+  "XXX": "其他",
+  "TFA": "变压器",
+  "FNA": "风机",
+  "GHB": "燃气热水器",
+  "RVA": "减压阀",
+  "LSB": "漏电探测器",
+  "GLA": "车位引导灯",
+  "IOA": "风口",
+  "CPC": "集水坑",
+  "MFA": "消声器",
+  "CPE": "组件",
+  "GBA": "燃气锅炉",
+  "SDC": "声音传感器",
+  "SPC": "扬声器",
+  "KLA": "龙骨",
+  "CFA": "定压补水装置",
+  "MPA": "机械车位",
+  "EBA": "电锅炉",
+  "SNB": "气体灭火喷头",
+  "LPA": "液化石油气瓶",
+  "FHA": "地板采暖设备",
+  "CUA": "控制箱",
+  "BPC": "地埋管",
+  "OSA": "隔油池",
+  "DSA": "直流屏",
+  "OUA": "室外机",
+  "PFA": "人流量传感器",
+  "TSA": "水箱消毒器",
+  "FGA": "速通门",
+  "HBA": "消火栓箱",
+  "FUA": "新风机组",
+  "ALA": "声光报警器",
+  "CCA": "离心式冷水机组",
+  "WVA": "湿式报警阀组",
+  "HTB": "热量传感器",
+  "CVA": "燃气切断阀",
+  "SED": "强电线路",
+  "GHA": "地源热泵",
+  "CTA": "浓度传感器",
+  "FBA": "燃油锅炉",
+  "PDA": "车位检测器",
+  "EDA": "电梯基坑",
+  "SPD": "速度传感器",
+  "RSA": "中继台",
+  "DVA": "干式报警阀组",
+  "HAA": "辅热设备",
+  "RTA": "路由器",
+  "WEA": "弱电线路",
+  "MTA": "电机",
+  "DRA": "硬盘录像机",
+  "SEC": "入侵报警探测器",
+  "SPB": "潜污泵",
+  "LPB": "联动琴台",
+  "EIA": "疏散指示灯牌",
+  "WMA": "消防水炮设备",
+  "SPA": "太阳能电池板",
+  "PTA": "压力罐",
+  "ATA": "信号放大天线",
+  "PCA": "水泵接合器",
+  "DCA": "分集水器",
+  "CFC": "泳池循环过滤机组",
+  "SEB": "燃气探测器",
+  "RHA": "湿度传感器",
+  "HTA": "主机",
+  "ETA": "末端试水装置",
+  "ECA": "灭火剂容器",
+  "GTA": "进出闸机",
+  "WTA": "对讲机",
+  "ILA": "保温层",
+  "APC": "无线AP点位",
+  "GSA": "气体管道",
+  "IPA": "综合保护装置",
+  "GDA": "梁",
+  "PLA": "播放器",
+  "RDA": "散热器",
+  "ETB": "电梯曳引机",
+  "ORA": "餐饮除油成套设备",
+  "RLA": "继电器",
+  "EPA": "预埋件",
+  "ACA": "吸收式冷水机组",
+  "TLB": "电话",
+  "FAA": "地板空调器",
+  "LTA": "灯具",
+  "FRA": "防火卷帘门",
+  "FEA": "前端设备",
+  "SCA": "螺杆式冷水机组",
+  "PSC": "压力传感器",
+  "USA": "紫外线消毒器",
+  "BFA": "生物质炊暖炉",
+  "TLA": "工具",
+  "LUA": "污废水一体式提升机组",
+  "CPD": "巡更通讯座",
+  "ACB": "热风幕",
+  "FEC": "灭火器",
+  "SVA": "安全阀",
+  "LSA": "低压开关柜",
+  "PCB": "静压箱",
+  "CAA": "定风量箱",
+  "OVA": "通断阀",
+  "VRA": "变频多联机",
+  "ACC": "空压机",
+  "BPB": "备用电源",
+  "WHA": "水源热泵",
+  "CVB": "止回阀",
+  "FDA": "滤毒除湿机",
+  "LQA": "液体管道",
+  "BDA": "主体",
+  "RWA": "坡道",
+  "DWA": "低压配电抽屉",
+  "CSA": "垫层",
+  "CTB": "涂层",
+  "URA": "小便器",
+  "VAA": "变风量箱",
+  "SCB": "太阳能集热器",
+  "PSA": "稳压设备",
+  "TUB": "中水处理机组",
+  "BTA": "浴缸",
+  "CFB": "水景循环过滤机组"
+}

+ 103 - 0
src/utils/JOSNToExcel.js

@@ -0,0 +1,103 @@
+import { saveAs } from 'file-saver'
+import XLSX from 'xlsx'
+
+const jsontoExcel = {
+  downloadExl: function (header, data, fileName) {
+    // var keys = Object.keys(data[0]);
+    let copyData = JSON.parse(JSON.stringify(data))
+    let firstRow = {};
+    let keys = header.map((item) => {
+      this.setDataForKey(firstRow, item.fieldName, item.headerName);
+      return item.fieldName
+    });
+    // header.forEach(function (item) {
+    //   firstRow[item] = item;
+    // });
+    copyData.unshift(firstRow);
+
+    let content = {};
+
+    // 把json格式的数据转为excel的行列形式
+    let sheetsData = copyData.map((item, rowIndex) => {
+      return keys.map((key, columnIndex) => {
+        return Object.assign({}, {
+          value: this.dataForKey(item, key),
+          // value: item[key],
+          position: (columnIndex > 25 ? this.getCharCol(columnIndex) : String.fromCharCode(65 + columnIndex)) + (rowIndex + 1),
+        });
+      });
+    }).reduce(function (prev, next) {
+      return prev.concat(next);
+    });
+
+    sheetsData.forEach((item) => {
+      content[item.position] = {
+        v: item.value
+      };
+    });
+
+    //设置区域,比如表格从A1到D10,SheetNames:标题,
+    let coordinate = Object.keys(content);
+    let workBook = {
+      SheetNames: ["Sheet1"],
+      Sheets: {
+        "Sheet1": Object.assign({}, content, { "!ref": coordinate[0] + ":" + coordinate[coordinate.length - 1] }),
+      }
+    };
+    //这里的数据是用来定义导出的格式类型
+    var excelData = XLSX.write(workBook, { bookType: "xlsx", bookSST: false, type: "binary" });
+    var blob = new Blob([this.string2ArrayBuffer(excelData)], { type: "" });
+    saveAs(blob, `${fileName}.xlsx`);
+  },
+  //字符串转字符流
+  string2ArrayBuffer: function (s) {
+    var buf = new ArrayBuffer(s.length);
+    var view = new Uint8Array(buf);
+    for (var i = 0; i != s.length; ++i) view[i] = s.charCodeAt(i) & 0xFF;
+    return buf;
+  },
+  // 将指定的自然数转换为26进制表示。映射关系:[0-25] -> [A-Z]。
+  getCharCol: function (n) {
+    let s = "",
+      m = 0
+    while (n > 0) {
+      m = n % 26 + 1
+      s = String.fromCharCode(m + 64) + s
+      n = (n - m) / 26
+    }
+    return s
+  },
+  //根据key值去对象中取对应的值
+  dataForKey: function (data, key) {
+    let arr = key.split(".")
+    if (arr && arr[0]) {
+      for (let i = 0; i < arr.length; i++) {
+        if (arr[i] && data[arr[i]]) {
+          data = data[arr[i]]
+        } else {
+          return ''
+        }
+      }
+      return data
+    }
+  },
+  //根据key值去设置对象的值
+  setDataForKey: function (data, key, value) {
+    let arr = key.split(".")
+    if (arr && arr[0]) {
+      for (let i = 0; i < arr.length; i++) {
+        if (!(arr[i] && data[arr[i]])) {
+            data[arr[i]] = {}
+        }
+        if (value !== undefined) {
+            if (i == arr.length - 1) {
+                data[arr[i]] = value
+            }
+        }
+        data = data[arr[i]]
+      }
+    }
+  }
+}
+
+export default jsontoExcel

+ 142 - 29
src/views/ledger/report/index.vue

@@ -1,36 +1,149 @@
 <template>
-    <div>
-      <das-board>
-        <template v-slot:plan>
-          <span>{{plan?plan:"yyyy-mm-dd"}}</span>
-        </template>
-        <template v-slot:finish>
-          <span>{{finish?finish:"yyyy-mm-dd"}}</span>
-        </template>
-        <template v-slot:onLine>
-          <span>{{onLine?onLine:"yyyy-mm-dd"}}</span>
-        </template>
-        <template v-slot:explain>
-          <span>{{explain?explain:"yyyy-mm-dd"}}</span>
-        </template>
-      </das-board>
-    </div>
+  <div>
+    <el-row style="margin-top: 30px;">
+      <span>请选择要导出的模板:</span>
+      <el-select v-model="value" placeholder="请选择">
+        <el-option v-for="item in options" :key="item.value" :label="item.label" :value="item.value"></el-option>
+      </el-select>
+      <el-button @click="handleClickDownload" type="primary" style="margin-left: 15px;">导出Excel</el-button>
+    </el-row>
+  </div>
 </template>
 
 <script>
-import dasBoard from "@/views/dasboard/index";
+import jsontoExcel from "@/utils/JOSNToExcel"
+import { State, Family } from "@/data/mapTable"
+import { getSpaceName, getGraphyId, getEquipmentFamily, countEquip } from "@/api/scan/request"
+import { mapGetters, mapActions } from "vuex"
+
 export default {
-    components: {
-      dasBoard
-    },
-    data() {
-        return {
-          plan: "2019-10-30",
-          finish: "2019-10-30",
-          onLine: "2019-10-30",
-          explain: "照岗位和资产数据统计报告"
+  data() {
+    return {
+      json: '',
+      value: '',
+      options: [{
+        value: 'header1',
+        label: '已建立关联的设备资产'
+      }, {
+        value: 'header2',
+        label: '未关联资产的设备'
+      }, {
+        value: 'header3',
+        label: '未关联设备的资产'
+      }],
+      header1: [{
+        fieldName: "Building.BuildLocalName",
+        headerName: "建筑"
+      }, {
+        fieldName: "Floor.FloorLocalName",
+        headerName: "楼层"
+      }, {
+        fieldName: "EquipCategory.EquipName",
+        headerName: "设备类"
+      }, {
+        fieldName: "EquipLocalName",
+        headerName: "设备本地名称"
+      }, {
+        fieldName: "EquipLocalID",
+        headerName: "设备本地编码"
+      }, {
+        fieldName: "EquipID",
+        headerName: "设备id"
+      }, {
+        fieldName: "BIMID",
+        headerName: "设备BIMID"
+      }, {
+        fieldName: "Property.Family",
+        headerName: "资产设备族"
+      }, {
+        fieldName: "Property.EquipLocalName",
+        headerName: "资产本地名称"
+      }, {
+        fieldName: "Property.EquipLocalID",
+        headerName: "资产本地编码"
+      }, {
+        fieldName: "Property.EquipID",
+        headerName: "资产id"
+      }, {
+        fieldName: "Property.CreateTime",
+        headerName: "资产创建时间"
+      }, {
+        fieldName: "Property.CodeType",
+        headerName: "资产现场验证状态"
+      }],
+      header2: [{
+        fieldName: "Building.BuildLocalName",
+        headerName: "建筑"
+      }, {
+        fieldName: "Floor.FloorLocalName",
+        headerName: "楼层"
+      }, {
+        fieldName: "EquipCategory.EquipName",
+        headerName: "设备类"
+      }, {
+        fieldName: "EquipLocalName",
+        headerName: "设备本地名称"
+      }, {
+        fieldName: "EquipLocalID",
+        headerName: "设备本地编码"
+      }, {
+        fieldName: "EquipID",
+        headerName: "设备id"
+      }, {
+        fieldName: "BIMID",
+        headerName: "设备BIMID"
+      }],
+      header3: [{
+          fieldName: "Building.BuildLocalName",
+          headerName: "建筑"
+        }, {
+          fieldName: "Floor.FloorLocalName",
+          headerName: "楼层"
+        }, {
+          fieldName: "EquipFamilyList.0.FamilyName",
+          headerName: "资产设备族"
+        }, {
+          fieldName: "EquipLocalName",
+          headerName: "资产本地名称"
+        }, {
+          fieldName: "EquipLocalID",
+          headerName: "资产本地编码"
+        }, {
+          fieldName: "EquipID",
+          headerName: "资产id"
+        }, {
+          fieldName: "CreateTime",
+          headerName: "资产创建时间"
+        }, {
+          fieldName: "CodeType",
+          headerName: "资产现场验证状态"
         }
-    },
-    mounted() {}
+      ]
+    }
+  }, 
+  methods:{
+    handleClickDownload () {
+      if (this.value == 'header1') {
+        let json = JSON.parse(this.json).Content.map((item) => {
+          item.Property.CodeType = State[item.Property.CodeType]
+          item.Property.Family = Family[item.Property.Family]
+          return item
+        })
+        jsontoExcel.downloadExl(this.header1, json, '已建立关联的资产设备')
+      } else if (this.value == 'header2') {
+        let json = JSON.parse(this.json).Content
+        jsontoExcel.downloadExl(this.header2, json, '未关联资产的设备')
+      } else if (this.value == 'header3') {
+        let json = JSON.parse(this.json).Content.map((item) => {
+          item.CodeType = State[item.CodeType]
+          return item
+        })
+        jsontoExcel.downloadExl(this.header3, json, '未关联设备的资产')
+      }
+    }
+  }
 }
-</script>
+</script>
+
+<style scoped>
+</style>