|
@@ -0,0 +1,243 @@
|
|
|
|
|
+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
|
|
|
|
|
+ const srcData = []
|
|
|
|
|
+ for (const i in xmlData) {
|
|
|
|
|
+ const rowData = xmlData[i].Cell
|
|
|
|
|
+ const 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)
|
|
|
|
|
+ const 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) => {
|
|
|
|
|
+ const wb = this.XLSX.read(e.target.result, {
|
|
|
|
|
+ type: 'binary'
|
|
|
|
|
+ }) // 读取完成的数据
|
|
|
|
|
+ // 转成json header解析第一行标题,只解析最后一个标签
|
|
|
|
|
+ const lastexcel = wb.SheetNames[wb.SheetNames.length - 1]
|
|
|
|
|
+ const 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 {
|
|
|
|
|
+ const sheet1 = XLSX.utils.table_to_sheet(table, { raw: true })
|
|
|
|
|
+ const blob2 = this.sheets2book2blob([ sheet1 ])
|
|
|
|
|
+ this.openDownloadDialog(blob2, `${fileName}.xlsx`)
|
|
|
|
|
+ } catch (error) {
|
|
|
|
|
+ console.error('导出错误')
|
|
|
|
|
+ }
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * sheet转blob
|
|
|
|
|
+ * @param params sheet参数arr|obj
|
|
|
|
|
+ * @returns
|
|
|
|
|
+ */
|
|
|
|
|
+ sheets2book2blob(params) {
|
|
|
|
|
+ let blob = null
|
|
|
|
|
+ if (params && params.length > 0) {
|
|
|
|
|
+ const 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的配置项
|
|
|
|
|
+ const wopts = {
|
|
|
|
|
+ bookType: 'xlsx', // 要生成的文件类型
|
|
|
|
|
+ bookSST: false, // 是否生成Shared String Table,官方解释是,如果开启生成速度会下降,但在低版本IOS设备上有更好的兼容性
|
|
|
|
|
+ type: 'binary'
|
|
|
|
|
+ }
|
|
|
|
|
+ const wbout = XLSX.write(workbook, wopts)
|
|
|
|
|
+ blob = new Blob([ this.s2ab(wbout) ], { type: 'application/octet-stream' })
|
|
|
|
|
+ }
|
|
|
|
|
+ return blob
|
|
|
|
|
+ }
|
|
|
|
|
+
|
|
|
|
|
+ /**
|
|
|
|
|
+ * 字符串转ArrayBuffer
|
|
|
|
|
+ * @param s 字符串
|
|
|
|
|
+ */
|
|
|
|
|
+ s2ab(s) {
|
|
|
|
|
+ const buf = new ArrayBuffer(s.length)
|
|
|
|
|
+ const 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地址
|
|
|
|
|
+ }
|
|
|
|
|
+ const 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()
|