Procházet zdrojové kódy

Merge branch 'master' of http://120.26.64.82:3000/BFFE/CABaggageData2.0

zhaoke před 2 roky
rodič
revize
4ba5fee21e

+ 14 - 8
public/configLoader.js

@@ -1,9 +1,15 @@
-const config = document.createElement('script')
-config.id = 'configJS'
-config.src = 'config.js'
-config.type = 'text/javascript'
-document.head.appendChild(config)
-setInterval(function () {
-  document.head.removeChild(document.getElementById('configJS'))
+if (!window.configLoadLoop) {
+  const config = document.createElement('script')
+  config.id = 'configJS'
+  config.type = 'text/javascript'
+  config.src = './config.js?t=' + new Date().getTime()
   document.head.appendChild(config)
-}, 60 * 1000)
+  window.configLoadLoop = setInterval(function () {
+    document.head.removeChild(document.getElementById('configJS'))
+    const config = document.createElement('script')
+    config.id = 'configJS'
+    config.type = 'text/javascript'
+    config.src = './config.js?t=' + new Date().getTime()
+    document.head.appendChild(config)
+  }, 60 * 1000)
+}

+ 17 - 9
src/utils/table.js

@@ -173,25 +173,31 @@ export function exportToExcel(table, tableName, fileName, headerRowNumber = 1) {
     })
     // 生成要导出的xlsx数据,raw: true表示不使用excel的格式解析,输出为纯文本,sheet设置xlsx这一页的标题
     const tableBook = XLSX.utils.table_to_book(table, { raw: true, sheet: tableName })
-    // console.log(tableBook)
-    // return
     // 计算每一列的单元格的最大宽度(包含表头),单元格的key为'A12'、'AA2'等,和excel里一致
     const xlsxDatas = tableBook.Sheets[tableName]
     const columnWidths = []
     for (const cellName in xlsxDatas) {
       if (!['!rows', '!cols', '!fullref', '!ref', '!merges'].includes(cellName)) {
         const { columnIndex, rowIndex } = devideGroup(cellName)
-        const cellTextLength = xlsxDatas[cellName].v.split('').reduce((pre, curr) => {
-          const letterSize = curr.charCodeAt(0) > 255 ? 2 : 1
-          return pre + letterSize
-        }, 0)
-        if ((!columnWidths[columnIndex] && cellTextLength > 0) || cellTextLength > columnWidths[columnIndex]) {
-          columnWidths[columnIndex] = cellTextLength
+        const cellWidth = Math.max(
+          ...xlsxDatas[cellName].v
+            .toString()
+            .split('\n')
+            .map(cellRow =>
+              cellRow.split('').reduce((pre, curr) => {
+                const letterSize = curr.charCodeAt(0) > 255 ? 2 : 1
+                return pre + letterSize
+              }, 0)
+            )
+        )
+        if ((!columnWidths[columnIndex] && cellWidth > 0) || cellWidth > columnWidths[columnIndex]) {
+          columnWidths[columnIndex] = cellWidth
         }
         let cellStyle = {
           alignment: {
             horizontal: 'center',
-            vertical: 'center'
+            vertical: 'center',
+            wrapText: true
           }
         }
         if (rowIndex < headerRowNumber) {
@@ -220,6 +226,8 @@ export function exportToExcel(table, tableName, fileName, headerRowNumber = 1) {
               }
             }
           }
+        } else {
+          cellStyle.alignment.horizontal = 'left'
         }
         xlsxDatas[cellName].s = cellStyle
       }

+ 2 - 2
src/views/baggageManagement/components/arrival/index.vue

@@ -150,7 +150,7 @@
           <el-form-item v-is="['is_columnSettings']">
             <img
               class="btn-img btn-shadow"
-              src="../../../../assets/baggage/ic_setting.png"
+              src="@/assets/baggage/ic_setting.png"
               title="列设置"
               @click="show"
             >
@@ -158,7 +158,7 @@
           <el-form-item v-is="['dm_dt_columnSettings']">
             <img
               class="btn-img btn-shadow"
-              src="../../../../assets/baggage/ic_export.png"
+              src="@/assets/baggage/ic_export.png"
               title="导出"
               @click="exportHandler('table', '航站进港列表')"
             >

+ 133 - 14
src/views/baggageManagement/components/baggage/index.vue

@@ -84,9 +84,9 @@
               <span class="step-name">{{ item.nodeName }}</span>
             </div>
             <div class="step-info">
-              <!-- <div class="step-status">{{ item.status }}</div> -->
+              <div :class="statusClasses(item.status)">{{ item.status }}</div>
               <span class="step-time">{{ item.processingTime }}</span>
-              <!-- <div class="step-location">{{ item.location }}</div> -->
+              <div class="step-location">{{ item.locationId }}</div>
             </div>
           </div>
         </div>
@@ -94,13 +94,13 @@
       <div class="btns">
         <img
           class="btn-square btn-shadow"
-          src="../../../../assets/baggage/ic_export.png"
+          src="@/assets/baggage/ic_export.png"
           title="导出"
           @click="exportHandler('table', '行李节点列表')"
         >
         <img
           class="btn-square btn-shadow"
-          src="../../../../assets/baggage/ic_setting.png"
+          src="@/assets/baggage/ic_setting.png"
           title="列设置"
           @click="show"
         >
@@ -157,7 +157,7 @@
         <div class="btns">
           <img
             class="btn-square btn-shadow"
-            src="../../../../assets/baggage/ic_export.png"
+            src="@/assets/baggage/ic_export.png"
             title="导出"
             @click="exportMessageToExcel"
           >
@@ -235,6 +235,9 @@ import { myQuery } from '@/api/dataIntegration'
 import { BaggageMessageQuery } from '@/api/flight'
 import tableColsMixin from '../../mixins/tableCols'
 import { throttledExportToExcel } from '@/utils/table'
+import * as XLSX from 'xlsx'
+import XLSX_STYLE from 'xlsx-style'
+import FileSaver from 'file-saver'
 
 export default {
   name: 'BaggageView',
@@ -348,12 +351,9 @@ export default {
         }
       ],
       baggageBasicInfo: {},
-      dialogVisibledele: false,
-      active: 2,
       infoBtn: '',
       infoRadios: ['跟踪信息', '跟踪报文'],
       messageList: [],
-      checkList: [],
       stepNodes: [],
       tableCols: [
         {
@@ -404,6 +404,19 @@ export default {
         return this.stepNodes[index].processingTime && this.stepNodes[index + 1].processingTime
       }
     },
+    statusClasses() {
+      return function (status) {
+        const classes = ['step-status']
+        if (typeof status === 'string') {
+          if (status.includes('正常') || status.includes('通过')) {
+            classes.push('step-status-normal')
+          } else {
+            classes.push('step-status-abnormal')
+          }
+        }
+        return classes
+      }
+    },
     formattedBaggageInfo() {
       return function (prop) {
         const value = this.baggageBasicInfo[prop]
@@ -481,6 +494,9 @@ export default {
     this.basicInfoHeight = this.$refs['basicInfo'].offsetHeight
     this.$refs['table']?.doLayout()
   },
+  beforeDestroy() {
+    this.stopLoopAll()
+  },
   methods: {
     startQueryDetails() {
       this.queryDetails()
@@ -608,11 +624,102 @@ export default {
     },
     exportHandler(refName, tableName) {
       const table = this.$refs[refName].$el.cloneNode(true)
-      const fileName = `${tableName}-${this.queryData.bagSN}-${this.queryData.flightNO}-${this.queryData.flightDate}.xlsx`
+      const { bagSN, flightNO, flightDate } = this.queryData
+      const fileName = `${tableName}-${bagSN}-${flightNO}-${flightDate}.xlsx`
       throttledExportToExcel(table, tableName, fileName)
     },
     exportMessageToExcel() {
-      this.$message.info('开发中')
+      const xlsxDatas = [['Date & Time', 'Message']]
+      xlsxDatas.push(
+        ...this.messageList.map(message => [
+          message.date,
+          message.dataContent.replaceAll(/[\r\n]{2,}/g, '\n').replaceAll('\\', '')
+        ])
+      )
+      const columnWidths = []
+      xlsxDatas.forEach(row => {
+        // 计算每一列宽度,考虑换行
+        row.forEach((cell, columnIndex) => {
+          const cellWidth = Math.max(
+            ...cell
+              .toString()
+              .split('\n')
+              .map(cellRow =>
+                cellRow.split('').reduce((pre, curr) => {
+                  const letterSize = curr.charCodeAt(0) > 255 ? 2 : 1
+                  return pre + letterSize
+                }, 0)
+              )
+          )
+          if ((!columnWidths[columnIndex] && cellWidth > 0) || cellWidth > columnWidths[columnIndex]) {
+            columnWidths[columnIndex] = cellWidth
+          }
+        })
+      })
+      // 生成表格数据
+      const sheet = XLSX.utils.aoa_to_sheet(xlsxDatas)
+      // 添加列宽度
+      sheet['!cols'] = columnWidths.map(width => ({
+        wch: width + 2
+      }))
+      // 表格对齐、添加边框
+      const borderStyle = {
+        style: 'medium',
+        color: {
+          rgb: 'FFFFFF'
+        }
+      }
+      const reg = /^[A-Z]+([\d]+$)/
+      for (const key in sheet) {
+        const match = reg.test(key)
+        if (match) {
+          const rowIndex = reg.exec(key)[1]
+          let cellStyle = {
+            alignment: {
+              horizontal: 'center',
+              vertical: 'center',
+              wrapText: true
+            }
+          }
+          if (Number(rowIndex) === 1) {
+            cellStyle = {
+              ...cellStyle,
+              border: {
+                top: borderStyle,
+                right: borderStyle,
+                bottom: borderStyle,
+                left: borderStyle
+              },
+              font: {
+                color: {
+                  rgb: 'FFFFFF'
+                }
+              },
+              fill: {
+                fgColor: {
+                  rgb: '3366FF'
+                }
+              }
+            }
+          } else {
+            cellStyle.alignment.horizontal = 'left'
+          }
+          sheet[key].s = cellStyle
+        }
+      }
+      // 表格数据转换
+      const workBook = XLSX.utils.book_new()
+      XLSX.utils.book_append_sheet(workBook, sheet, '行李原始报文')
+      const tableWrite = XLSX_STYLE.write(workBook, {
+        bookType: 'xlsx',
+        bookSST: true,
+        type: 'buffer',
+        cellStyles: true
+      })
+      // 下载表格
+      const { bagSN, flightNO, flightDate } = this.queryData
+      const fileName = `行李原始报文-${bagSN}-${flightNO}-${flightDate}.xlsx`
+      FileSaver.saveAs(new Blob([tableWrite], { type: 'application/octet-stream' }), fileName)
     },
     // 行李详情基础信息
     queryBaggageBasicInfo(dataContent) {
@@ -714,7 +821,7 @@ export default {
       try {
         const result = await this.queryBaggageTrack(this.selectedAirline.split(','))
         this.resetStepNodes()
-        result.forEach(({ nodeCode, nodeName, processingTime }) => {
+        result.forEach(({ nodeCode, nodeName, processingTime, locationId, status }) => {
           const replaceIndex = this.stepNodes.findIndex(
             stepNode => stepNode.nodeCode === nodeCode || isSameStep(stepNode.nodeCode, nodeCode)
           )
@@ -722,7 +829,9 @@ export default {
             this.stepNodes.splice(replaceIndex, 1, {
               nodeCode,
               nodeName,
-              processingTime: processingTime.replace('T', '\n')
+              processingTime: processingTime.replace('T', '\n'),
+              locationId,
+              status
             })
           }
         })
@@ -878,7 +987,7 @@ export default {
         width: 80px;
         height: 100%;
         text-align: center;
-        font-size: 12px;
+        font-size: 14px;
         display: flex;
         flex-direction: column;
         align-items: center;
@@ -899,9 +1008,19 @@ export default {
         .step-info {
           margin-top: 15px;
           color: #101116;
-          line-height: 1;
+          line-height: 22px;
+          .step-status {
+            &-normal {
+              color: #4ab36f;
+            }
+            &-abnormal {
+              color: #e9af4b;
+            }
+          }
           .step-time {
             white-space: pre-line;
+            font-size: 12px;
+            line-height: 20px;
           }
         }
         &.active-item .step-circle {

+ 2 - 2
src/views/baggageManagement/components/departure/index.vue

@@ -150,7 +150,7 @@
           <el-form-item v-is="['dm_dt_columnSettings']">
             <img
               class="btn-img btn-shadow"
-              src="../../../../assets/baggage/ic_setting.png"
+              src="@/assets/baggage/ic_setting.png"
               title="列设置"
               @click="show"
             >
@@ -158,7 +158,7 @@
           <el-form-item v-is="['dm_dt_columnSettings']">
             <img
               class="btn-img btn-shadow"
-              src="../../../../assets/baggage/ic_export.png"
+              src="@/assets/baggage/ic_export.png"
               title="导出"
               @click="exportHandler('table', '航站离港列表')"
             >

+ 2 - 2
src/views/baggageManagement/components/departureC/index.vue

@@ -142,7 +142,7 @@
           <el-form-item v-is="['dm_dt_columnSettings']">
             <img
               class="btn-img btn-shadow"
-              src="../../../../assets/baggage/ic_setting.png"
+              src="@/assets/baggage/ic_setting.png"
               title="列设置"
               @click="show"
             >
@@ -150,7 +150,7 @@
           <el-form-item v-is="['dm_dt_columnSettings']">
             <img
               class="btn-img btn-shadow"
-              src="../../../../assets/baggage/ic_export.png"
+              src="@/assets/baggage/ic_export.png"
               title="导出"
               @click="exportHandler('table', '航站离港列表')"
             >

+ 3 - 3
src/views/baggageManagement/components/flight/index.vue

@@ -278,7 +278,7 @@
           <span class="manageTitle">航班容器列表</span>
           <img
             class="btn-square btn-shadow"
-            src="../../../../assets/baggage/ic_export.png"
+            src="@/assets/baggage/ic_export.png"
             title="导出"
             @click="exportHandler('containerTable', '航班容器列表')"
           >
@@ -390,13 +390,13 @@
           <TimeZoneSelector />
           <img
             class="btn-square btn-shadow"
-            src="../../../../assets/baggage/ic_export.png"
+            src="@/assets/baggage/ic_export.png"
             title="导出"
             @click="exportHandler('flightBaggageTable', '航班行李列表')"
           >
           <img
             class="btn-square btn-shadow"
-            src="../../../../assets/baggage/ic_setting.png"
+            src="@/assets/baggage/ic_setting.png"
             title="列设置"
             @click="show"
           >

+ 2 - 2
src/views/baggageManagement/components/transferArrival/index.vue

@@ -190,7 +190,7 @@
           <el-form-item v-is="['ti_columnSettings']">
             <img
               class="btn-img btn-shadow"
-              src="../../../../assets/baggage/ic_setting.png"
+              src="@/assets/baggage/ic_setting.png"
               title="列设置"
               @click="show"
             >
@@ -198,7 +198,7 @@
           <el-form-item v-is="['dm_dt_columnSettings']">
             <img
               class="btn-img btn-shadow"
-              src="../../../../assets/baggage/ic_export.png"
+              src="@/assets/baggage/ic_export.png"
               title="导出"
               @click="exportHandler('table', '航站中转进港列表')"
             >

+ 2 - 2
src/views/baggageManagement/components/transferDeparture/index.vue

@@ -188,7 +188,7 @@
           <el-form-item v-is="['td_columnSettings']">
             <img
               class="btn-img btn-shadow"
-              src="../../../../assets/baggage/ic_setting.png"
+              src="@/assets/baggage/ic_setting.png"
               title="列设置"
               @click="show"
             >
@@ -196,7 +196,7 @@
           <el-form-item v-is="['dm_dt_columnSettings']">
             <img
               class="btn-img btn-shadow"
-              src="../../../../assets/baggage/ic_export.png"
+              src="@/assets/baggage/ic_export.png"
               title="导出"
               @click="exportHandler('table', '航站中转进港列表')"
             >

+ 21 - 15
src/views/statisticsCharts/views/nodeStatisticsCharts.vue

@@ -591,17 +591,21 @@ export default {
                   rowIndex === 0 ? `${cell.slice(0, 2)}扫描率` : `${cell ? ((cell / totalcell) * 100).toFixed(2) : 0}%`
                 row.splice(columnIndex + 1, 0, newCell)
               }
-              // 计算每一列宽度
+              // 计算每一列宽度,考虑换行
               row.forEach((cell, columnIndex) => {
-                const cellTextLength = cell
-                  .toString()
-                  .split('')
-                  .reduce((pre, curr) => {
-                    const letterSize = curr.charCodeAt(0) > 255 ? 2 : 1
-                    return pre + letterSize
-                  }, 0)
-                if ((!columnWidths[columnIndex] && cellTextLength > 0) || cellTextLength > columnWidths[columnIndex]) {
-                  columnWidths[columnIndex] = cellTextLength
+                const cellWidth = Math.max(
+                  ...cell
+                    .toString()
+                    .split('\n')
+                    .map(cellRow =>
+                      cellRow.split('').reduce((pre, curr) => {
+                        const letterSize = curr.charCodeAt(0) > 255 ? 2 : 1
+                        return pre + letterSize
+                      }, 0)
+                    )
+                )
+                if ((!columnWidths[columnIndex] && cellWidth > 0) || cellWidth > columnWidths[columnIndex]) {
+                  columnWidths[columnIndex] = cellWidth
                 }
               })
             })
@@ -621,14 +625,15 @@ export default {
             for (const key in sheet) {
               const match = reg.test(key)
               if (match) {
-                const columnIndex = reg.exec(key)[1]
+                const rowIndex = reg.exec(key)[1]
                 let cellStyle = {
                   alignment: {
                     horizontal: 'center',
-                    vertical: 'center'
+                    vertical: 'center',
+                    wrapText: true
                   }
                 }
-                if (Number(columnIndex) === 1) {
+                if (Number(rowIndex) === 1) {
                   cellStyle = {
                     ...cellStyle,
                     border: {
@@ -648,12 +653,13 @@ export default {
                       }
                     }
                   }
+                } else {
+                  cellStyle.alignment.horizontal = 'left'
                 }
                 sheet[key].s = cellStyle
               }
             }
-            // console.log(sheet)
-            // return
+            // 表格数据转换
             const workBook = XLSX.utils.book_new()
             XLSX.utils.book_append_sheet(workBook, sheet, '扫描节点与位置分析')
             const tableWrite = XLSX_STYLE.write(workBook, {