Browse Source

Signed-off-by: Caner <40012261+Canees@users.noreply.github.com>

Caner 3 years ago
parent
commit
8f687e65e6
1 changed files with 240 additions and 0 deletions
  1. 240 0
      src/utils/FormAnalyticalServer.js

+ 240 - 0
src/utils/FormAnalyticalServer.js

@@ -0,0 +1,240 @@
+import X2js from 'x2js'
+import XLSX from 'xlsx'
+import axios from 'axios'
+/**
+ * 围岩表格解析服务
+ * 来源以模板为准
+ */
+class FormAnalyticalServer {
+  constructor () {
+    console.warn('该服务需要特定数据模板')
+    this.XLSX = XLSX
+    this.X2js = new X2js()
+    this.Axios = axios
+  }
+
+  /**
+   *  钻进参数xml解析
+   *  @param {File} file file
+   *  @return srcData
+   */
+  async CountdrillingParameterObj (file) {
+    const url = window.URL.createObjectURL(file)
+    const res = await this.Axios.get(url)
+    const jsonObj = this.X2js.xml2js(res)
+    const xmlData = jsonObj.Workbook.Worksheet.Table.Row
+    let srcData = []
+    for (const i in xmlData) {
+      let rowData = xmlData[i].Cell
+      let arr = []
+      for (const j in rowData) {
+        if (rowData[j].Data && rowData[j].Data.__text) {
+          arr.push(rowData[j].Data.__text)
+        }
+      }
+      srcData.push(arr)
+    }
+    return srcData
+  }
+
+  /**
+   * 地质素描EXCEL解析
+   * @param {File} file file
+   * @return geologicalSketchObj
+   */
+  async CountGeologicalSketchObj (file) {
+    const data = await this.XLSX2JSON(file)
+    const mileageTime = new Date(data[0]['__EMPTY_9']).getTime() / 1000
+    const date = new Date(data[23]['__EMPTY_5']).getTime() / 1000
+    const geologicalSketchObj = {
+      tunnelName: data[0]['__EMPTY'], // 隧道
+      workArea: data[0]['__EMPTY_2'], // 工区
+      workFace: data[0]['__EMPTY_4'], // 工作面
+      mileage: data[0]['__EMPTY_6'], // 断面里程
+      mileageTime: mileageTime || '', // 时间
+      tunnelNumber: data[1]['__EMPTY'], // 项目编号
+      faceSize: {
+        width: data[2]['__EMPTY_2'], // 开挖宽度
+        height: data[2]['__EMPTY_4'], // 开挖高度
+        faceNum: data[2]['__EMPTY_6'], // 开挖面积
+        methods: data[2]['__EMPTY_8'], // 开挖方法
+        support: data[2]['__EMPTY_10'] // 超前支护类型
+      },
+      lithology: data[3]['__EMPTY_1'], // 地层岩性
+      choose1: data[4]['__EMPTY_1'], // 风化程度
+      choose2: data[5]['__EMPTY_1'], // 岩石强度(MPa)
+      choose12: data[6]['__EMPTY_1'], // 岩体结构类型
+      choose3: data[7]['__EMPTY_1'], // 主要结构面组数
+      choose4: data[8]['__EMPTY_1'], // 结构面平均间距(m)
+      choose5: data[9]['__EMPTY_1'], // 结构面发育程度
+      choose6: data[10]['__EMPTY_1'], // 裂隙宽度(mm)
+      choose7: data[11]['__EMPTY_1'], // 裂隙充填物
+      choose13: data[12]['__EMPTY_1'], // 结构面粗糙程度
+      choose8: data[13]['__EMPTY_1'], // 结合程度
+      choose9: data[14]['__EMPTY_1'], // 完整程度
+      choose10: data[15]['__EMPTY_1'], // 地下水状态
+      choose11: data[17]['__EMPTY_1'], // 地应力状态
+      mainStructural: {
+        text1: data[16]['__EMPTY_2'], // 主要结构面走向
+        text2: data[16]['__EMPTY_4'], // 主要结构面倾角
+        text3: data[16]['__EMPTY_6'], // 与洞轴线夹角
+        text4: data[16]['__EMPTY_8'] // 备注
+      }, // 主要结构面产状及与洞轴线夹角
+      grade: data[18]['__EMPTY_1'], // 围岩亚级划分
+      stability: data[19]['__EMPTY_1'], // 掌子面稳定性划分
+      describeText: data[20]['__EMPTY_1'], // 描述
+      personCompany: {
+        tabulation: data[22]['__EMPTY_1'], // 制表
+        review: data[22]['__EMPTY_5'], // 复核
+        supervisor: data[22]['__EMPTY_9'], // 监理工程师
+        company: data[23]['__EMPTY_1'], // 施工单位
+        date: date || '' // 日期
+      }
+    }
+    return geologicalSketchObj
+  }
+
+  /**
+   * 围岩设计等级excel解析
+   * @param {File} file file
+   * @return DesignDb
+   */
+  async CountDesign (file) {
+    const data = await this.XLSX2JSON(file)
+    let DesignDb = []
+    for (let j = 0; j < data.length; j++) {
+      const el = data[j]
+      DesignDb.push({
+        workFace: el['工作面'],
+        workArea: el['工区'],
+        startMileage: el['开始里程'],
+        endMileage: el['结束里程'],
+        supportingDesign: el['洞身支护设计级别'],
+        type: el['类型'],
+        designRock: el['设计围岩级别'],
+        forepolingDesign: el['超前支护设计级别'],
+        tunnel: el['隧道']
+      })
+    }
+    return DesignDb
+  }
+
+  /**
+   * EXCEL2JSON
+   * @param {FILE} FILE
+   * @return JSON
+   */
+  async XLSX2JSON (FILE) {
+    const reader = new FileReader()
+    reader.readAsBinaryString(FILE)
+    const JSON = await new Promise((resolve, reject) => {
+      reader.onload = e => {
+        let wb = this.XLSX.read(e.target.result, {
+          type: 'binary'
+        }) // 读取完成的数据
+        // 转成json header解析第一行标题,只解析最后一个标签
+        const lastexcel = wb.SheetNames[wb.SheetNames.length - 1]
+        let data = this.XLSX.utils.sheet_to_json(wb.Sheets[lastexcel], { dateNF: 'yyyy/mm/dd', raw: false })
+        resolve(data)
+      }
+    })
+    return JSON
+  }
+  /**
+   * 导出excel
+   * @param fileName 保存文件名
+   * @param table table表格DOM
+   */
+  outfile (fileName, table) {
+    try {
+      let sheet1 = XLSX.utils.table_to_sheet(table, { raw: true })
+      let blob2 = this.sheets2book2blob([sheet1])
+      this.openDownloadDialog(blob2, `${fileName}.xlsx`)
+    } catch (error) {
+      console.error('导出错误')
+    }
+  }
+  /**
+   * sheet转blob
+   * @param params sheet参数arr|obj
+   */
+  sheets2book2blob (params) {
+    if (params && params.length > 0) {
+      let workbook = {
+        SheetNames: [],
+        Sheets: {}
+      }
+      // 参数两种模式纯arr || arrobj
+      for (let k = 0; k < params.length; k++) {
+        const el = params[k]
+        if (el.db && el.name) {
+          workbook.SheetNames.push(el.name)
+          workbook.Sheets[el.name] = el.db
+        } else {
+          workbook.SheetNames.push(`sheet${k}`)
+          workbook.Sheets[`sheet${k}`] = el
+        }
+      }
+      // 生成excel的配置项
+      let wopts = {
+        bookType: 'xlsx', // 要生成的文件类型
+        bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
+        type: 'binary'
+      }
+      let wbout = XLSX.write(workbook, wopts)
+      let blob = new Blob([this.s2ab(wbout)], { type: 'application/octet-stream' })
+
+      return blob
+    } else {
+      console.error('参数错误(need arr and arr obj)')
+    }
+  }
+  /**
+   * 字符串转ArrayBuffer
+   * @param s 字符串
+   */
+  s2ab (s) {
+    let buf = new ArrayBuffer(s.length)
+    let view = new Uint8Array(buf)
+    for (let i = 0; i !== s.length; ++i) view[i] = s.charCodeAt(i) & 0xff
+    return buf
+  }
+  /**
+   * 下载
+   * @param url 文件blob
+   * @param fileName 文件名
+   */
+  openDownloadDialog (url, fileName) {
+    if (typeof url === 'object' && url instanceof Blob) {
+      url = URL.createObjectURL(url) // 创建blob地址
+    }
+    let aLink = document.createElement('a')
+    aLink.href = url
+    aLink.download = fileName || '' // HTML5新增的属性,指定保存文件名,可以不要后缀,注意,file:///模式下不会生效
+    let event
+    if (window.MouseEvent) event = new MouseEvent('click')
+    else {
+      event = document.createEvent('MouseEvents')
+      event.initMouseEvent(
+        'click',
+        true,
+        false,
+        window,
+        0,
+        0,
+        0,
+        0,
+        0,
+        false,
+        false,
+        false,
+        false,
+        0,
+        null
+      )
+    }
+    aLink.dispatchEvent(event)
+  }
+}
+
+export default new FormAnalyticalServer()