Browse Source

Merge branch 'dev'

haojianlong 5 years ago
parent
commit
1e287eb262
62 changed files with 1986 additions and 421 deletions
  1. 3 3
      package.json
  2. 13 0
      src/api/model/file.js
  3. 14 0
      src/api/topo/index.js
  4. BIN
      src/assets/image/model/arrowBlue.png
  5. BIN
      src/assets/image/model/arrowGray.png
  6. BIN
      src/assets/image/model/arrowGreen.png
  7. BIN
      src/assets/image/model/columnBlue.png
  8. BIN
      src/assets/image/model/columnGray.png
  9. BIN
      src/assets/image/model/columnGreen.png
  10. BIN
      src/assets/image/model/delModelBlue.png
  11. BIN
      src/assets/image/model/delModelGray.png
  12. BIN
      src/assets/image/model/downJsonBlue.png
  13. BIN
      src/assets/image/model/downJsonGray.png
  14. BIN
      src/assets/image/model/downJsonGreen.png
  15. BIN
      src/assets/image/model/downModelBlue.png
  16. BIN
      src/assets/image/model/downModelGray.png
  17. BIN
      src/assets/image/model/downModelGreen.png
  18. BIN
      src/assets/image/model/rightDownBlue.png
  19. BIN
      src/assets/image/model/rightDownGray.png
  20. BIN
      src/assets/image/model/rightDownGreen.png
  21. BIN
      src/assets/image/model/upJsonBlue.png
  22. BIN
      src/assets/image/model/upJsonGray.png
  23. BIN
      src/assets/image/model/upJsonGreen.png
  24. BIN
      src/assets/image/model/upModelBlue.png
  25. BIN
      src/assets/image/model/upModelGray.png
  26. BIN
      src/assets/image/model/upModelGreen.png
  27. BIN
      src/assets/image/model/waitingAnlBlue.png
  28. BIN
      src/assets/image/model/waitingAnlGray.png
  29. BIN
      src/assets/image/model/waitingAnlGreen.png
  30. BIN
      src/assets/image/model/waitingManageBlue.png
  31. BIN
      src/assets/image/model/waitingManageGray.png
  32. BIN
      src/assets/image/model/waitingManageGreen.png
  33. BIN
      src/assets/style/iconfont/iconfont.eot
  34. BIN
      src/assets/style/iconfont/iconfont.ttf
  35. BIN
      src/assets/style/iconfont/iconfont.woff
  36. 4 0
      src/components/config_point/location_flag.vue
  37. 20 2
      src/components/config_point/step3_edit/index.vue
  38. 44 152
      src/components/dialogs/list/batchDialog.vue
  39. 78 36
      src/components/dialogs/list/filesDialog.vue
  40. 4 2
      src/components/dialogs/list/picDialog.vue
  41. 28 22
      src/components/dialogs/list/uploadImgDialog.vue
  42. 8 3
      src/components/ledger/details/detail/exhibitionBaseInformation.vue
  43. 53 0
      src/components/ledger/details/detail/exhibitionEnergyT.vue
  44. 220 96
      src/components/ledger/handsontables/device.vue
  45. 69 56
      src/components/ledger/lib/uploadFiles.vue
  46. 22 12
      src/components/model/file/floorTable.vue
  47. 135 0
      src/components/model/file/nodeDialog.vue
  48. 86 0
      src/components/model/file/pathCard.vue
  49. 7 0
      src/router/system.js
  50. 0 1
      src/utils/scan/tools.js
  51. BIN
      src/views/business_space/dataUtil/1.jpg
  52. BIN
      src/views/business_space/dataUtil/2.jpg
  53. BIN
      src/views/business_space/dataUtil/3.jpg
  54. 237 16
      src/views/business_space/dataUtil/topology.vue
  55. 55 4
      src/views/ledger/facility/details/index.vue
  56. 6 5
      src/views/ledger/report/index.vue
  57. 2 2
      src/views/ledger/spacelist/spaceDetail/index.vue
  58. 873 0
      src/views/model/file/pathcontrol/index.vue
  59. 1 1
      src/views/point/config_point/steps/step1.vue
  60. 1 5
      src/views/ready/buildfloor/addFloor/index.vue
  61. 1 3
      src/views/ready/buildfloor/index.vue
  62. 2 0
      src/views/relation/data/index.vue

+ 3 - 3
package.json

@@ -20,10 +20,10 @@
   },
   "dependencies": {
     "@saga-web/base": "2.1.9",
-    "@saga-web/cad-engine": "2.0.548",
+    "@saga-web/cad-engine": "2.0.560",
     "@saga-web/draw": "2.1.75",
-    "@saga-web/graphy": "2.1.45",
-    "@saga-web/topology": "1.0.53",
+    "@saga-web/graphy": "2.1.47",
+    "@saga-web/topology": "1.0.77",
     "axios": "^0.18.0",
     "echarts": "^4.1.0",
     "el-cascader-multi": "^1.1.8",

+ 13 - 0
src/api/model/file.js

@@ -2,6 +2,7 @@ import httputils from '@/api/scan/httpUtil'
 import { Message } from 'element-ui';
 import axios from 'axios'
 const baseUrl = '/modelapi';
+const revitUrl = '/schedulerapi';
 
 let api = {
     // 新建模型文件夹
@@ -329,4 +330,16 @@ export function querySyncLogCount(param, success) {
 export function queryFileByModelId(param, success) {
     let url = `${baseUrl}/model-file/query`;
     httputils.postJson(url, param, success)
+}
+
+// 模型流程监控
+export function modelPathControl(param, success) {
+    let url = `${baseUrl}/model-monitor/query`;
+    httputils.postJson(url, param, success)
+}
+
+// 模型流程监控-获取待分配模型数量
+export function unassignQuery(param, success) {
+    let url = `${revitUrl}/task/query`;
+    httputils.postJson(url, param, success)
 }

+ 14 - 0
src/api/topo/index.js

@@ -0,0 +1,14 @@
+import httputils from '@/api/scan/httpUtil'
+const baseUrl = '/api';
+
+// 创建拓扑图
+export function topoCreate(param, success) {
+  let url = `${baseUrl}/datacenter/topo/create`;
+  httputils.postJson(url, param, success)
+}
+
+// 查询拓扑图
+export function topoQuery(param, success) {
+  let url = `${baseUrl}/datacenter/topo/query`;
+  httputils.postJson(url, param, success)
+}

BIN
src/assets/image/model/arrowBlue.png


BIN
src/assets/image/model/arrowGray.png


BIN
src/assets/image/model/arrowGreen.png


BIN
src/assets/image/model/columnBlue.png


BIN
src/assets/image/model/columnGray.png


BIN
src/assets/image/model/columnGreen.png


BIN
src/assets/image/model/delModelBlue.png


BIN
src/assets/image/model/delModelGray.png


BIN
src/assets/image/model/downJsonBlue.png


BIN
src/assets/image/model/downJsonGray.png


BIN
src/assets/image/model/downJsonGreen.png


BIN
src/assets/image/model/downModelBlue.png


BIN
src/assets/image/model/downModelGray.png


BIN
src/assets/image/model/downModelGreen.png


BIN
src/assets/image/model/rightDownBlue.png


BIN
src/assets/image/model/rightDownGray.png


BIN
src/assets/image/model/rightDownGreen.png


BIN
src/assets/image/model/upJsonBlue.png


BIN
src/assets/image/model/upJsonGray.png


BIN
src/assets/image/model/upJsonGreen.png


BIN
src/assets/image/model/upModelBlue.png


BIN
src/assets/image/model/upModelGray.png


BIN
src/assets/image/model/upModelGreen.png


BIN
src/assets/image/model/waitingAnlBlue.png


BIN
src/assets/image/model/waitingAnlGray.png


BIN
src/assets/image/model/waitingAnlGreen.png


BIN
src/assets/image/model/waitingManageBlue.png


BIN
src/assets/image/model/waitingManageGray.png


BIN
src/assets/image/model/waitingManageGreen.png


BIN
src/assets/style/iconfont/iconfont.eot


BIN
src/assets/style/iconfont/iconfont.ttf


BIN
src/assets/style/iconfont/iconfont.woff


+ 4 - 0
src/components/config_point/location_flag.vue

@@ -97,6 +97,10 @@
                     this.$message("请确定输入字符不为空")
                     return false
                 }
+                let flag = this.queryLocaltionArr.map(item => item.Name).indexOf(param.Name) > -1;
+                if (flag) {
+                    return this.$message.warning('已添加过此标签');
+                }
                 addLocaltionFlag(param,res => {
                     this.queryData()
                     this.$message.success("添加成功")

+ 20 - 2
src/components/config_point/step3_edit/index.vue

@@ -131,7 +131,8 @@ export default {
       formulaHandleShow: {},
       splitHandleShow: {},
       dictionaryData: [],
-      typeList: []
+      typeList: [],
+      pointToRelationID: {}, //保存信息点->relationid map
     }
   },
   props: {
@@ -253,6 +254,10 @@ export default {
           //设备-部件-空间
           eachData.EquipmentTypeCode = temp[1]
           eachData.EquipmentType = tempNames[1]
+          let key = `${eachData.TypeCode}-${eachData.EquipmentTypeCode}-${eachData.InfomationPointCode}`
+          if (this.pointToRelationID[key]) {
+            eachData.Id = this.pointToRelationID[key]
+          }
         } else if (temp.length == 4) {
           eachData.SpecialtyCode = temp[1]
           eachData.Specialty = tempNames[1]
@@ -260,6 +265,15 @@ export default {
           eachData.System = tempNames[2]
           eachData.EquipmentTypeCode = eachData.SystemCode  //为了配置从动参取值存储
           eachData.EquipmentType = eachData.System
+          let key = `${eachData.TypeCode}-${eachData.SpecialtyCode}-${eachData.SystemCode}-${eachData.InfomationPointCode}`
+          if (this.pointToRelationID[key]) {
+            eachData.Id = this.pointToRelationID[key]
+          }
+        } else if (temp.length == 2) {
+          let key = `${eachData.TypeCode}-${eachData.InfomationPointCode}`
+          if (this.pointToRelationID[key]) {
+            eachData.Id = this.pointToRelationID[key]
+          }
         }
         let type = t.DataRuleType;
         updateParams.data.Content[0].EquipmentMark = eachData.EquipmentMark
@@ -491,15 +505,19 @@ export default {
       if (length) {
         var data = val.RelationList[0]
         let dict = [data.SpecialtyCode, data.SystemCode, data.EquipmentTypeCode]
-        //回显字典
+        //回显字典--并保存信息点->relationid map
+        this.pointToRelationID = {}
         let tempArr = val.RelationList.map(t => {
           let eachData = [];
           if (t.TypeCode == 'Eq' || t.TypeCode == 'Ec' || t.TypeCode == 'Sp') {
             eachData = [t.TypeCode, t.EquipmentTypeCode, t.InfomationPointCode]
+            this.pointToRelationID[`${t.TypeCode}-${t.EquipmentTypeCode}-${t.InfomationPointCode}`] = t.Id
           } else if (t.TypeCode == 'Sy') {
             eachData = [t.TypeCode, t.SpecialtyCode, t.SystemCode, t.InfomationPointCode]
+            this.pointToRelationID[`${t.TypeCode}-${t.SpecialtyCode}-${t.SystemCode}-${t.InfomationPointCode}`] = t.Id
           } else {
             eachData = [t.TypeCode, t.InfomationPointCode]
+            this.pointToRelationID[`${t.TypeCode}-${t.InfomationPointCode}`] = t.Id
           }
           return eachData;
         })

+ 44 - 152
src/components/dialogs/list/batchDialog.vue

@@ -44,7 +44,7 @@
               :key="index"
           >
             <span @click="fourVendors(city.code)"> {{city.name}}:</span>
-            <span>{{city.rname}}</span>
+            <span :title="city.rname">{{city.rname | filterImgNames}}</span>
           </el-checkbox>
         </el-checkbox-group>
       </section>
@@ -61,105 +61,20 @@
         </el-radio-group>
         <div style="margin: 15px "></div>
         <div class="checkbox">
-          <p>
+          <p v-for="(item,index) in newEnclosure">
             <el-checkbox
-                v-model="videoModel.archive"
-                @change="multiple('archive')"
-            > <!--设备文档-->
-              {{information.archive.name}}
+              v-model="form[item.Path]"
+            >
+            <span  @click="multiple(item.Path)">{{item.InfoPointName}}</span>
             </el-checkbox>
             <span
-                class="text-color"
-                v-for="item in information.archive.Archive"
-            >{{item.Name | filterImgName}}</span>
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.checkReport"
-                @change="multiple('checkReport')"
-            ><!--安装质检报告-->
-              {{information.checkReport.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.checkReport.CheckReport"
-            >{{item.Name | filterImgName}}</span>
-
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.drawing"
-                @change="multiple('drawing')"
-            ><!--设备图纸-->
-              {{information.drawing.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.drawing.Drawing"
-            >{{item.Key | filterImgName}}</span>
-
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.installDrawing"
-                @change="multiple('installDrawing')"
-            ><!--安装图纸-->
-              {{information.installDrawing.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.installDrawing.InstallDrawing"
-            >{{item.Key | filterImgName}}</span>
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.installPic"
-                @change="multiple('installPic')"
-            ><!--安装照片-->
-              {{information.installPic.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.installPic.InstallPic"
-            >{{item.Key | filterImgName}}</span>
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.insuranceFile"
-                @change="multiple('insuranceFile')"
-            ><!--保险文件-->
-              {{information.insuranceFile.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.insuranceFile.InsuranceFile"
-            >{{item.Name | filterImgName}}</span>
+              class="text-color"
+              v-for="i in item.value"
+            >{{i.Name | filterImgName}}</span>
 
           </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.pic"
-                @change="multiple('pic')"
-            ><!--设备照片-->
-              {{information.pic.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.pic.Pic"
-            >{{item.Key | filterImgName}}</span>
-          </p>
-          <p>
-            <el-checkbox
-                v-model="videoModel.nameplate"
-                @change="multiple('nameplate')"><!--设备铭牌照片-->
-              {{information.nameplate.name}}
-            </el-checkbox>
-            <span
-                class="text-color"
-                v-for="item in information.nameplate.Nameplate"
-            >{{item.Key | filterImgName}}</span>
-          </p>
         </div>
+
       </section>
       <el-button
           class="next-step"
@@ -222,13 +137,14 @@
 
 <script>
   import myPagination from "@/components/ledger/lib/myPagination"
-
+  import tools from "@/utils/buildfloor/tools";
   export default {
     name: "batchDialog",
-    props: ['firmName', 'allObject', 'page', 'information'],
+    props: ['firmName', 'allObject', 'page', 'information','newEnclosure'],
     components: {myPagination},
     data() {
       return {
+        form:{},
         batchDialog: false,//dialog
         active: 0,//进度条
         checkAll: false,//全选
@@ -275,7 +191,15 @@
       information() {
         return this.information
       },
-
+      newEnclosure:{
+        immediate:true,
+        handler(val){
+          this.newEnclosure = val
+        }
+      }
+    },
+    created() {
+      this.$forceUpdate()
     },
     computed: {
       newFirm() {
@@ -308,11 +232,18 @@
     },
     filters: {
       filterImgName(value) {
-        if (value.length > 16) {
+        if (value && value.length > 16) {
           return value.substring(0, 12) + '...'
         } else {
           return value
         }
+      } ,
+      filterImgNames(value) {
+        if (value && value.length > 16) {
+          return value.substring(0, 16) + '...'
+        } else {
+          return value
+        }
       }
     },
     methods: {
@@ -450,58 +381,32 @@
         }
 
         // this.information 多选信息
-        let {archive, checkReport, drawing, installDrawing, installPic, insuranceFile, nameplate, pic} = this.information
-        let multiple = {
-          InsuranceDoc: insuranceFile.InsuranceFile.length || this.videoModel.insuranceFile ? {
-            InsuranceFile: (insuranceFile.InsuranceFile.length && this.videoModel.insuranceFile) ? insuranceFile.InsuranceFile : undefined
-          } : undefined,
-          PhotoDoc: archive.Archive.length || drawing.Drawing.length || nameplate.Nameplate.length || pic.Pic.length ? {
-            Archive: (archive.Archive.length && this.videoModel.archive) ? archive.Archive : undefined,
-            Drawing: (drawing.Drawing.length && this.videoModel.drawing) ? drawing.Drawing : undefined,
-            Nameplate: (nameplate.Nameplate.length && this.videoModel.nameplate) ? nameplate.Nameplate : undefined,
-            Pic: (pic.Pic.length && this.videoModel.pic) ? pic.Pic : undefined
-          } : undefined,
-          Siteinstall: installPic.InstallPic.length || installDrawing.InstallDrawing.length || checkReport.CheckReport.length ? {
-            InstallPic: (installPic.InstallPic.length && this.videoModel.installPic) ? installPic.InstallPic : undefined,
-            InstallDrawing: (installDrawing.InstallDrawing.length && this.videoModel.installDrawing) ? installDrawing.InstallDrawing : undefined,
-            CheckReport: (checkReport.CheckReport.length && this.videoModel.checkReport) ? checkReport.CheckReport : undefined
-          } : undefined
-        }
-        let LedgerParam = {}
+        let valuable = [], newValuable  = []
+        valuable = this.newEnclosure.filter(i=>this.form[i.Path] && i.value ).forEach(({ InfoPointCode, value }) => newValuable[InfoPointCode] = value);
+        // console.log( newValuable,'多选信息')
         if (this.radio === 1) { //组装数据,根据是覆盖该是增量,1是增量
           //    1:单选数据
           let arr1 = this.deepCopy(arr).map(item => ({
             ...Id,
             ...item,
             LedgerParam: {...single}
-
           }))
-          //    2:多选数据
-          let {InsuranceDoc, PhotoDoc, Siteinstall} = multiple
           let arr2 = this.deepCopy(arr).map(item => ({
             ...item,
-            ...InsuranceDoc,
-            ...PhotoDoc,
-            ...Siteinstall
-            // LedgerParam: {...multiple}
+            ...newValuable
           }))
           this.$emit('upDataDevice', 1, arr1, arr2)
-
         }
         if (this.radio === 2) {
-          let {InsuranceDoc, PhotoDoc, Siteinstall} = multiple
-          LedgerParam = {
-            ...single,
-            ...PhotoDoc,
-            ...Siteinstall
-          };
+          let param = {}
+          this.newEnclosure.forEach(({Path,value})=>param[Path] = value)
+          param =  tools.formatData(param)
           let arr3 = this.deepCopy(arr).map(item => ({
             ...Id,
             ...item,
-            LedgerParam: {...LedgerParam}
+            ...param
           }))
           this.$emit('upDataDevice', 2, arr3)
-
         }
         this.closeDialog()
       },
@@ -521,26 +426,13 @@
         this.onlySelect = []
         // this.deviceList = []
         this.radio = 1 //返回到默认增量
-        // this.multipleSelection = [] //清空实例内容
-        this.videoModel = {
-          archive: false,
-          checkReport: false,
-          drawing: false,
-          installDrawing: false,
-          insuranceFile: false,
-          installPic: false,
-          nameplate: false,
-          pic: false
+        //清空附件信息
+        for(let i in this.form)  {
+          this.form[i] = false
         }
-        let {archive, checkReport, drawing, installDrawing, installPic, insuranceFile, nameplate, pic} = this.information
-        archive.Archive = []
-        checkReport.CheckReport = []
-        drawing.Drawing = []
-        installDrawing.InstallDrawing = []
-        installPic.InstallPic = []
-        insuranceFile.InsuranceFile = []
-        nameplate.Nameplate = []
-        pic.Pic = []
+          this.newEnclosure.map(i=>{
+          this.$set(i,'value',[])
+        })
       },
       handleSelectionChange(val) {
         this.multipleSelection = val
@@ -549,7 +441,7 @@
         this.$emit('getAllData')
       },
       multiple(val) {
-        this.$emit('multiple', val)
+        this.$emit('multiples',val)
       },
 
       deepCopy(obj) {

+ 78 - 36
src/components/dialogs/list/filesDialog.vue

@@ -19,29 +19,29 @@
     </el-dialog>
 </template>
 <script>
-    import uploadFiles from "@/components/ledger/lib/uploadFiles";
+  import uploadFiles from "@/components/ledger/lib/uploadFiles";
 
-    export default {
-        components: {
-            uploadFiles
-        },
-        props: {
-            dialog: {
-                type: Object,
-                default: function () {
-                    return {
-                        uploadFiles: false
-                    };
-                }
-            },
-            keysArr: {
-                type: Array,
-                default: function () {
-                    return []
-                }
-            },
-            read: {
-                type: Boolean,
+  export default {
+    components: {
+      uploadFiles
+    },
+    props: {
+      dialog: {
+        type: Object,
+        default: function () {
+          return {
+            uploadFiles: false
+          };
+        }
+      },
+      keysArr: {
+        type: Array,
+        default: function () {
+          return []
+        }
+      },
+      read: {
+        type: Boolean,
                 default: false
             },
             firmDataType: {
@@ -68,20 +68,62 @@
             changeItem(file) {
                 if (this.firmDataType === 'dialog') {
                     let info = this.infoType;
-                    switch (info) {
-                        case 'archive':
-                            this.information.archive.Archive = file
-                            this.$emit("changeFile", this.information, this.firmDataType)
-                            break
-                        case 'checkReport':
-                            this.information.checkReport.CheckReport = file
-                            this.$emit("changeFile", this.information, this.firmDataType)
-                            break
-                        case 'insuranceFile':
-                            this.information.insuranceFile.InsuranceFile = file
-                            this.$emit("changeFile", this.information, this.firmDataType)
-                            break
-                    }
+                  switch (info) {
+                    case 'archive':
+                      this.information.archive.Archive = file
+                      this.$emit("changeFile", this.information, this.firmDataType)
+                      break
+                    case 'checkReport':
+                      this.information.checkReport.CheckReport = file
+                      this.$emit("changeFile", this.information, this.firmDataType)
+                      break
+                    case 'insuranceFile':
+                      this.information.insuranceFile.InsuranceFile = file
+                      this.$emit("changeFile", this.information, this.firmDataType)
+                      break;
+                    case 'LedgerParam.InsuranceDoc.InsuranceFile': //保险文件
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.PhotoDoc.Archive': //设备文档
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.Siteinstall.CheckReport': //安装质检报告
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.OperationMainte.MaintainManual': //维修保养手册
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.SupplyPurchase.ApproachingAcceptance': //进场验收单
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.SupplyPurchase.AcceptanceReport': //验收报告
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.PhotoDoc.OperationManual': //操作说明书
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.EquipManufactor.OriginalCertificate': //原厂证明
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.EquipManufactor.TestReport': //检测报告
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.PhotoDoc.ProductCertification': //产品合格证
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.Siteinstall.InstallInstruction': //安装说明书
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.PhotoDoc.Drawing': //设备图纸
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.Siteinstall.InstallDrawing': //安装图纸
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                    case 'LedgerParam.SupplyPurchase.SupplierContract': //供应合同
+                      this.$emit("changeFile", info, this.firmDataType,file)
+                      break
+                  }
                 } else {
                     this.$emit("changeFile", file, this.firmDataType)
 

+ 4 - 2
src/components/dialogs/list/picDialog.vue

@@ -107,8 +107,10 @@
         let panoramas = this.panoramaArr
         this.changeKeys = picsArr.concat(videos).concat(videoPics).concat(panoramas)
         if (this.firmDataType === 'dialog') {
-          this.information.pic.Pic = this.changeKeys
-          this.$emit("change", this.information, this.firmDataType)
+          // this.information.pic.Pic = this.changeKeys
+          // this.$emit("change", this.information, this.firmDataType)
+          // this.$emit("change", this.information, this.firmDataType, this.changeKeys)
+          this.$emit("change", this.infoType, this.firmDataType, this.changeKeys)
         } else {
           this.$emit("change", this.changeKeys)
 

+ 28 - 22
src/components/dialogs/list/uploadImgDialog.vue

@@ -10,19 +10,19 @@
   </el-dialog>
 </template>
 <script>
-    import uploadImgs from "@/components/ledger/lib/uploadImgs";
+  import uploadImgs from "@/components/ledger/lib/uploadImgs";
 
-    export default {
-        components: {
-            uploadImgs
-        },
-        props: {
-            dialog: {
-                type: Object,
-                default: function () {
-                    return {
-                        uploadImgs: true
-                    };
+  export default {
+    components: {
+      uploadImgs
+    },
+    props: {
+      dialog: {
+        type: Object,
+        default: function () {
+          return {
+            uploadImgs: true
+          };
                 }
             },
             keysArr: {
@@ -66,16 +66,22 @@
                     break
                 case 'installDrawing':
                     this.information.installDrawing.InstallDrawing = file
-                    this.$emit('changeFile', this.information, this.firmDataType)
-                    break
-                case 'nameplate':
-                    this.information.nameplate.Nameplate = file
-                    this.$emit('changeFile', this.information, this.firmDataType)
-                    break
-                case 'drawing':
-                    this.information.drawing.Drawing = file
-                    this.$emit('changeFile', this.information, this.firmDataType)
-                    break
+                  this.$emit('changeFile', this.information, this.firmDataType)
+                  break
+              case 'nameplate':
+                this.information.nameplate.Nameplate = file
+                this.$emit('changeFile', this.information, this.firmDataType)
+                break
+              case 'drawing':
+                this.information.drawing.Drawing = file
+                this.$emit('changeFile', this.information, this.firmDataType)
+                break
+              case 'LedgerParam.Siteinstall.InstallPic':
+                this.$emit("changeFile", info, this.firmDataType, file)
+                break
+              case 'LedgerParam.PhotoDoc.Nameplate':
+                this.$emit("changeFile", info, this.firmDataType, file)
+                break
             }
         } else {
             this.$emit("changeFile", file)

+ 8 - 3
src/components/ledger/details/detail/exhibitionBaseInformation.vue

@@ -41,10 +41,15 @@
         <p style="border-bottom: 1px solid #eee;padding:2px 0 4px 0;'">{{value.InfoPointName}}</p>
         <div v-for="(pic,index) in value.Value">
           <div>图纸名称:{{pic.Name}}
-              <el-button style="" type="text" size="mini" @click="downloadFile(pic.Key)">下载</el-button>
+<!--              <el-button style="" type="text" size="mini" @click="downloadFile(pic.Key)">下载</el-button>-->
+            <a
+              style="cursor: pointer;color: #409eff"
+              :href="`/image-service/common/file_get/${pic.Key}?systemId=dataPlatform`"
+              :download="pic.Name"
+            >下载</a>
           </div>
         </div>
-        <el-button slot="reference" type="text">{{value.Value? '有':'-'}}</el-button>
+        <el-button slot="reference" type="text">{{value.Value.length >0 ? '有':'-'}}</el-button>
       </el-popover>
       <el-popover
         v-else-if="Array.isArray(value.Value) && value.InputMode=='N2'"
@@ -56,7 +61,7 @@
         <div style="text-align: center; margin: 0">
           <el-button type="text" size="mini" @click="handleCopy(value.Value)">复制</el-button>
         </div>
-        <el-button slot="reference" type="text">{{value.Value ? '有' :'-'}}</el-button>
+        <el-button slot="reference" type="text">{{value.Value.length >0  ? '有' :'-'}}</el-button>
       </el-popover>
       <el-popover
         v-else-if="value.Value && value.Value.length  && `${value.InfoPointName}:${value.Value}`.length>21 "

+ 53 - 0
src/components/ledger/details/detail/exhibitionEnergyT.vue

@@ -0,0 +1,53 @@
+<template>
+  <div class="exhibition-energy">
+    <div class="title">
+      <section v-for="(val,key,i) in exhibitionEnergy.list">
+        <h4 class="base">{{key}}</h4>
+        <div class="table-dynamic" v-for="(value,keys,index) in val.paths">
+            <div class="table-title"> {{value.InfoPointName}}:</div>
+          <p :style="{'color':value.value? '' :'#F56C6C'}">{{value.value? `表号功能号:${value.value} `:'未维护'}}</p>
+          <p>{{value.data ? value.data :value.error}} {{value.Unit}}</p>
+          <p>{{value.receivetime ? formatDate(value.receivetime):'--'}}</p>
+        </div>
+      </section>
+    </div>
+  </div>
+</template>
+
+<script>
+  export default {
+    name: "exhibitionEnergy",
+    props: ['exhibitionEnergy'],
+    methods:{
+      formatDate(str) {
+        return str ? str.substr(0,4)+"-"+str.substr(4,2)+"-"+str.substr(6,2)+" "+str.substr(8,2) + ":" +str.substr(10,2) + ":"+str.substr(12,2) :'--'
+      }
+    }
+  }
+</script>
+
+<style scoped lang="less">
+  .exhibition-energy {
+    .base {
+      margin: 10px;
+      font-weight: 600;
+      text-indent: 10px;
+      border-bottom: 1px dashed #eee;
+    }
+
+    .table-dynamic {
+      height: 85px;
+      width: 100%;
+      margin: 5px 0;
+      padding-left: 20px;
+      box-sizing: border-box;
+    }
+
+    .table-title {
+      float: left;
+      max-width: 200px;
+      width: 100px;
+      height: 85px;
+    }
+  }
+</style>

+ 220 - 96
src/components/ledger/handsontables/device.vue

@@ -124,15 +124,16 @@
     </el-dialog>
     <!--      维护信息弹窗-->
     <batchDialog
-        ref="batchDialogs"
-        @code="fourVendors"
-        :firmName="firmName"
-        :allObject="allObject"
-        :page="batchPage"
-        :information="information"
-        @getAllData="getAllData"
-        @multiple="multiple"
-        @upDataDevice="upDataDevice"
+      ref="batchDialogs"
+      @code="fourVendors"
+      :firmName="firmName"
+      :allObject="allObject"
+      :page="batchPage"
+      :information="information"
+      :newEnclosure="newEnclosure"
+      @getAllData="getAllData"
+      @multiples="multiples"
+      @upDataDevice="upDataDevice"
     />
   </div>
 </template>
@@ -344,7 +345,8 @@
           }
 
         },
-        infoType: ''
+        infoType: '',
+        newEnclosure:[]
       };
     },
     methods: {
@@ -380,6 +382,8 @@
             })
             this.getTableData()
             this.getAllData()
+          //  信息维护
+          this.newEnclosure = res.Content.filter(i=>i.InputMode =='F2')
           });
         }
       },
@@ -911,62 +915,162 @@
             break;
         }
       },
-      multiple(val) {
+      forValue(arr, val) {
+        let enclosure = []
+        arr && arr.length && arr.map(i => {
+          if (i.Path == val) {
+            enclosure = i.value
+          }
+        })
+        return enclosure
+      },
+      multiples(val) {
         this.firmDataType = 'dialog'
         switch (val) {
-          //设备文档--安装质检报告--保险文件
-          case 'archive':
-            let adata = this.information.archive.Archive;
-            this.filesArr = adata ? adata : [];
-            this.infoType = 'archive';
+          case 'LedgerParam.InsuranceDoc.InsuranceFile': //保险文件
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
             this.myDialog.uploadFiles = true;
             break;
-          case 'checkReport':
-            let cdata = this.information.checkReport.CheckReport;
-            this.filesArr = cdata ? cdata : [];
-            this.infoType = 'checkReport'
+          case 'LedgerParam.PhotoDoc.Archive': //设备文档
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
             this.myDialog.uploadFiles = true;
             break;
-          case 'insuranceFile':
-            let idata = this.information.insuranceFile.InsuranceFile;
-            this.filesArr = idata ? idata : [];
-            this.infoType = 'insuranceFile';
+          case 'LedgerParam.Siteinstall.CheckReport': //安装质检报告
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
             this.myDialog.uploadFiles = true;
             break;
-          //安装照片--安装图纸--设备铭牌照片--设备图纸
-          case 'installPic':
-            let insData = this.information.installPic.InstallPic;
-            this.imgsArr = insData ? insData : [];
-            this.infoType = 'installPic';
-            this.myDialog.uploadImgs = true;
+          case 'LedgerParam.OperationMainte.MaintainManual': //维修保养手册
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
             break;
-          case 'installDrawing':
-            let drawData = this.information.installDrawing.InstallDrawing;
-            this.imgsArr = drawData ? drawData : [];
-            this.infoType = 'installDrawing';
-            this.myDialog.uploadImgs = true;
+          case 'LedgerParam.SupplyPurchase.ApproachingAcceptance': //进场验收单
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.SupplyPurchase.AcceptanceReport': //验收报告
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.PhotoDoc.OperationManual': //操作说明书
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.EquipManufactor.OriginalCertificate': //原厂证明
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.EquipManufactor.TestReport': //检测报告
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.PhotoDoc.ProductCertification': //产品合格证
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.Siteinstall.InstallInstruction': //安装说明书
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.PhotoDoc.Drawing': //设备图纸
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+          case 'LedgerParam.Siteinstall.InstallDrawing': //安装图纸
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
+            break;
+            case 'LedgerParam.SupplyPurchase.SupplierContract': //供应合同
+            this.filesArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val;
+            this.myDialog.uploadFiles = true;
             break;
-          case 'nameplate':
-            let nDate = this.information.nameplate.Nameplate;
-            this.imgsArr = nDate ? nDate : [];
-            this.infoType = 'nameplate';
+          case 'LedgerParam.Siteinstall.InstallPic':
+            this.imgsArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val
             this.myDialog.uploadImgs = true;
             break;
-          case 'drawing':
-            let dDate = this.information.drawing.Drawing;
-            this.imgsArr = dDate ? dDate : [];
-            this.infoType = 'drawing';
+          case 'LedgerParam.PhotoDoc.Nameplate':
+            this.imgsArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val
             this.myDialog.uploadImgs = true;
             break;
           //设备照片
-          case 'pic':
-            let picData = this.information.pic.Pic;
-            this.picsArr = picData ? picData : [];
-            this.infoType = 'pic';
+          case 'LedgerParam.PhotoDoc.Pic':
+            this.picsArr = this.forValue(this.newEnclosure, val) ? this.forValue(this.newEnclosure, val) : [];
+            this.infoType = val
             this.myDialog.pic = true;
             break;
         }
       },
+      // multiple(val) {
+      //   this.firmDataType = 'dialog'
+      //   switch (val) {
+      //     //设备文档--安装质检报告--保险文件
+      //     case 'archive':
+      //       let adata = this.information.archive.Archive;
+      //       this.filesArr = adata ? adata : [];
+      //       this.infoType = 'archive';
+      //       this.myDialog.uploadFiles = true;
+      //       break;
+      //     case 'checkReport':
+      //       let cdata = this.information.checkReport.CheckReport;
+      //       this.filesArr = cdata ? cdata : [];
+      //       this.infoType = 'checkReport'
+      //       this.myDialog.uploadFiles = true;
+      //       break;
+      //     case 'insuranceFile':
+      //       let idata = this.information.insuranceFile.InsuranceFile;
+      //       this.filesArr = idata ? idata : [];
+      //       this.infoType = 'insuranceFile';
+      //       this.myDialog.uploadFiles = true;
+      //       break;
+      //     //安装照片--安装图纸--设备铭牌照片--设备图纸
+      //     case 'installPic':
+      //       let insData = this.information.installPic.InstallPic;
+      //       this.imgsArr = insData ? insData : [];
+      //       this.infoType = 'installPic';
+      //       this.myDialog.uploadImgs = true;
+      //       break;
+      //     case 'installDrawing':
+      //       let drawData = this.information.installDrawing.InstallDrawing;
+      //       this.imgsArr = drawData ? drawData : [];
+      //       this.infoType = 'installDrawing';
+      //       this.myDialog.uploadImgs = true;
+      //       break;
+      //     case 'nameplate':
+      //       let nDate = this.information.nameplate.Nameplate;
+      //       this.imgsArr = nDate ? nDate : [];
+      //       this.infoType = 'nameplate';
+      //       this.myDialog.uploadImgs = true;
+      //       break;
+      //     case 'drawing':
+      //       let dDate = this.information.drawing.Drawing;
+      //       this.imgsArr = dDate ? dDate : [];
+      //       this.infoType = 'drawing';
+      //       this.myDialog.uploadImgs = true;
+      //       break;
+      //     //设备照片
+      //     case 'pic':
+      //       let picData = this.information.pic.Pic;
+      //       this.picsArr = picData ? picData : [];
+      //       this.infoType = 'pic';
+      //       this.myDialog.pic = true;
+      //       break;
+      //   }
+      // },
       //获取到了正确的信息
       getInfors(infos, row, el) {
           let val = this.hot.colToProp(row.col);
@@ -1280,58 +1384,78 @@
       }
 
     },
-    //修改关联的资产
-    changeProperty(val) {
-      this.setDataToMain(val.PropertyId, 'PropertyId', this.row);
-      this.setDataToMain(val.LinkEquipLocalName, 'LinkEquipLocalName', this.row);
-    },
-    //上传文件弹窗触发事件
-    fileChange(keys, type) {
-      if (type === 'dialog') {
-        this.information = keys
-      } else {
-        this.setDataToMain(keys, this.messKey, this.row);
-      }
-    },
-    //上传图片弹窗触发事件
-    imgChange(keys, type) {
-      if (type === 'dialog') {
-        this.information = keys
-      } else {
-        this.setDataToMain(keys, this.messKey, this.row);
+      //修改关联的资产
+      changeProperty(val) {
+        this.setDataToMain(val.PropertyId, 'PropertyId', this.row);
+        this.setDataToMain(val.LinkEquipLocalName, 'LinkEquipLocalName', this.row);
+      },
+      //上传文件弹窗触发事件
+      fileChange(keys, type, file) {
+        if (type === 'dialog') {
+          // this.information = keys
+          this.newEnclosure.forEach(i => {
+            if (i.Path == keys) {
+              this.$set(i, 'value', file)
+            }
+            return i
+          })
 
-      }
-    },
-    //关联系统更改
-    changeSystemType(data) {
-      tools.setDataForKey(this.tableData[this.row], "LinkSystem", data)
-    },
-    //设备图片弹窗改变事件
-    changePics(keys, type) {
-      if (type === 'dialog') {
-        this.information = keys
-      } else {
-        this.setDataToMain(keys, this.messKey, this.row);
-      }
-    },
-    utilToKey(key, name, data, messName) {
-      if (key == name) {
-        this.setDataToMain(data[key], messName, this.row)
-      }
-    },
-    //判断是否有值,有值赋值
-    setDataToMain(data, key, row) {
-      if (!!data && data != '--') {
-        if (!!this.tableData[row]) {
-          tools.setDataForKey(this.tableData[row], key, data);
-          this.handleUpdataTable([[row, key, null, data]], "edit");
         } else {
-          this.tableData[row] = {};
-          tools.setDataForKey(this.tableData[row], key, data);
+          this.setDataToMain(keys, this.messKey, this.row);
+        }
+        this.$forceUpdate()
+      },
+      //上传图片弹窗触发事件
+      imgChange(keys, type, file) {
+        if (type === 'dialog') {
+          // this.information = keys
+          this.newEnclosure.forEach(i => {
+            if (i.Path == keys) {
+              this.$set(i, 'value', file)
+            }
+            return i
+          })
+        } else {
+          this.setDataToMain(keys, this.messKey, this.row);
+
+        }
+      },
+      //关联系统更改
+      changeSystemType(data) {
+        tools.setDataForKey(this.tableData[this.row], "LinkSystem", data)
+      },
+      //设备图片弹窗改变事件
+      changePics(keys, type,file) {
+        if (type === 'dialog') {
+          // this.information = keys
+          this.newEnclosure.forEach(i => {
+            if (i.Path == keys) {
+              this.$set(i, 'value', file)
+            }
+            return i
+          })
+        } else {
+          this.setDataToMain(keys, this.messKey, this.row);
+        }
+      },
+      utilToKey(key, name, data, messName) {
+        if (key == name) {
+          this.setDataToMain(data[key], messName, this.row)
+        }
+      },
+      //判断是否有值,有值赋值
+      setDataToMain(data, key, row) {
+        if (!!data && data != '--') {
+          if (!!this.tableData[row]) {
+            tools.setDataForKey(this.tableData[row], key, data);
+            this.handleUpdataTable([[row, key, null, data]], "edit");
+          } else {
+            this.tableData[row] = {};
+            tools.setDataForKey(this.tableData[row], key, data);
+          }
+        } else {
+          tools.setDataForKey(this.tableData[row], key, "");
         }
-      } else {
-        tools.setDataForKey(this.tableData[row], key, "");
-      }
     },
     //    批量信息维护
     Batch() {

+ 69 - 56
src/components/ledger/lib/uploadFiles.vue

@@ -8,7 +8,7 @@
   isShow: 图片的显示
  -->
 <template>
-  <div id="saga-upload">
+  <div id="saga-upload" v-loading="loading">
     <div id="uploadFile">
       <el-upload
           class="upload-file"
@@ -27,7 +27,7 @@
             slot="tip"
             class="el-upload__tip"
             v-if="!readOnly"
-        >请上传文件
+        >请上传文件,且不大于50M
         </div>
       </el-upload>
 
@@ -85,7 +85,8 @@
     data() {
       return {
         filesArr: [],
-        isShow: Boolean
+        isShow: Boolean,
+        loading:false
       };
     },
     created() {
@@ -148,61 +149,73 @@
 
         let file = item.file;
         // try sending
-        let reader = new FileReader();
-
-        let vm = this;
-
-        let fileType = file.name.split(".");
-        let type = fileType[fileType.length - 1];
-        let key = "&key=" + fileType[0] + file.uid + "." + type
-        let CreateTime = tools.formatDate(new Date(file.lastModified))
-        reader.onloadstart = function () {
-          // 这个事件在读取开始时触发
-        };
-        reader.onprogress = function (p) {
-          // 这个事件在读取进行中定时触发
-        };
-
-        reader.onload = function () {
-          // 这个事件在读取成功结束后触发
-        };
-        reader.onloadend = function () {
-          // 这个事件在读取结束后,无论成功或者失败都会触发
-          if (reader.error) {
-          } else {
-            // document.getElementById("bytesRead").textContent = file.size;
-            // 构造 XMLHttpRequest 对象,发送文件 Binary 数据
-            var xhr = new XMLHttpRequest();
-            xhr.open(
-              /* method */
-              "POST",
-              /* target url */
-              "/image-service/common/file_upload?systemId=dataPlatform&secret=9e0891a7a8c8e885&overwrite=true" + key
-              /*, async, default to true */
-            );
-            //xhr.overrideMimeType("application/octet-stream");
-            xhr.send(reader.result);
-            xhr.onreadystatechange = function () {
-              if (xhr.readyState == 4) {
-                console.log(xhr)
-                if (xhr.status == 200) {
-                  let fileObject = {
-                    Key: key.split("=")[1],
-                    Type: type,
-                    Name: file.name,
-                    CreateTime,
-                    SystemId: 'dataPlatform'
+        let size = item.file.size;
+        if( size > 50*1024*1024 ) { //文件大于50M
+          this.$message.error('文件不可大于50M,请重新上传')
+          return false
+        }
+        else {
+          let reader = new FileReader();
+          let vm = this;
+          let fileType = file.name.split(".");
+          let type = fileType[fileType.length - 1];
+          let key = "&key=" + fileType[0] + file.uid + "." + type
+          let CreateTime = tools.formatDate(new Date(file.lastModified))
+          reader.onloadstart = function () {
+            // 这个事件在读取开始时触发
+          };
+          reader.onprogress = function (p) {
+            // 这个事件在读取进行中定时触发
+            let value = (p.loaded / size) * 100;
+            console.log(p.loaded,size,value,'loaded')
+          };
+
+          reader.onload = function () {
+
+            // 这个事件在读取成功结束后触发
+          };
+          reader.onloadend = function () {
+
+            this.loading = false
+            // 这个事件在读取结束后,无论成功或者失败都会触发
+            if (reader.error) {
+            } else {
+              // document.getElementById("bytesRead").textContent = file.size;
+              // 构造 XMLHttpRequest 对象,发送文件 Binary 数据
+              var xhr = new XMLHttpRequest();
+              xhr.open(
+                /* method */
+                "POST",
+                /* target url */
+                "/image-service/common/file_upload?systemId=dataPlatform&secret=9e0891a7a8c8e885&overwrite=true" + key
+                /*, async, default to true */
+              );
+              //xhr.overrideMimeType("application/octet-stream");
+              xhr.send(reader.result);
+              xhr.onreadystatechange = function () {
+                if (xhr.readyState == 4) {
+                  console.log(xhr)
+                  if (xhr.status == 200) {
+                    let fileObject = {
+                      Key: key.split("=")[1],
+                      Type: type,
+                      Name: file.name,
+                      CreateTime,
+                      SystemId: 'dataPlatform'
+                    }
+                    vm.filesArr.push(fileObject);
+                    this.loading =false
+                    vm.$emit("change", vm.filesArr, vm.defined);
+                  } else {
+                    this.$message.error(res.data.ResultMsg)
                   }
-                  vm.filesArr.push(fileObject);
-                  vm.$emit("change", vm.filesArr, vm.defined);
-                } else {
-                  this.$message.error(res.data.ResultMsg)
                 }
-              }
-            };
-          }
-        };
-        reader.readAsArrayBuffer(file);
+              };
+            }
+          };
+          reader.readAsArrayBuffer(file);
+        }
+
       }
     },
     watch: {

+ 22 - 12
src/components/model/file/floorTable.vue

@@ -3,10 +3,14 @@
     <el-table ref="filterTable" :data="tableData" style="width: 100%" height="100%" :header-cell-style="{background:'#d9d9d9',color:'#2b2b2b'}">
       <el-table-column prop="FloorName" label="模型文件" width="180">
         <template slot-scope="scope">
-          <i v-if="scope.row.Status == 4" class="iconfont icon-yun--tianchong" style="color:#67C23A;cursor:pointer;fontSize:18px;" title="模型校验完成..."></i>
-          <i v-else-if="scope.row.Status == 31" class="iconfont icon-yun--tianchong1" style="color:#F56C6C;cursor:pointer;fontSize:18px;" title="同步到数据中心出问题..."></i>
-          <i v-else-if="scope.row.Status == 21" class="iconfont icon-yun--tianchong1" style="color:#F56C6C;cursor:pointer;fontSize:18px;" title="模型数据导出出问题..."></i>
-          <i v-else class="iconfont icon-yun--tianchong2" style="color:#E6A23C;cursor:pointer;fontSize:18px;" title="模型校验进行中..."></i>
+          <i v-if="scope.row.Status == 4" class="iconfont icon-yun--tianchong" style="color:#67C23A;cursor:pointer;fontSize:18px;" title="模型校验完成..."
+            @click="toPathControl(scope.row)"></i>
+          <i v-else-if="scope.row.Status == 31" class="iconfont icon-yun--tianchong1" style="color:#F56C6C;cursor:pointer;fontSize:18px;"
+            title="同步到数据中心出问题..." @click="toPathControl(scope.row)"></i>
+          <i v-else-if="scope.row.Status == 21" class="iconfont icon-yun--tianchong1" style="color:#F56C6C;cursor:pointer;fontSize:18px;"
+            title="模型数据导出出问题..." @click="toPathControl(scope.row)"></i>
+          <i v-else class="iconfont icon-yun--tianchong2" style="color:#E6A23C;cursor:pointer;fontSize:18px;" title="模型校验进行中..."
+            @click="toPathControl(scope.row)"></i>
           <span style="margin-left: 10px">{{ scope.row.FloorName }}</span>
         </template>
       </el-table-column>
@@ -26,14 +30,9 @@
             <el-button title="替换模型" type="primary" size="mini" class="iconfont icon-replace" @click="repliaceModel(scope.row)"></el-button>
             <el-button title="查看版本日志" type="primary" size="mini" class="iconfont icon-Log" @click="queryModelLog(scope.row)"></el-button>
           </div>
-          <div
-            :class="['upLoad-loading']"
-            v-show="scope.row.Status != 4">
+          <div :class="['upLoad-loading']" v-show="scope.row.Status != 4">
             <div class="progress">
-              <el-progress
-                :text-inside="false"
-                :stroke-width="20" :percentage="100"
-                :color="scope.row.Status?'#909399':'#67C23A'"></el-progress>
+              <el-progress :text-inside="false" :stroke-width="20" :percentage="100" :color="scope.row.Status?'#909399':'#67C23A'"></el-progress>
             </div>
             <div class="progress-right">
               <span v-if="!scope.row.Status">上传中...</span>
@@ -121,7 +120,7 @@ export default {
     },
     // 下载模型文件
     downloadModel(item) {
-      let url = item.Url.match(/(\/image-service\S*)$/g)?item.Url.match(/(\/image-service\S*)$/g)[0]:''
+      let url = item.Url.match(/(\/image-service\S*)$/g) ? item.Url.match(/(\/image-service\S*)$/g)[0] : ''
       if (url) {
         let a = document.createElement("a");
         a.href = url;
@@ -144,6 +143,17 @@ export default {
           type: "error"
         });
       }
+    },
+    // 跳转至模型流程处理监控
+    toPathControl(row) {
+      this.$router.push({
+        path: '/model/path',
+        query: {
+          Id: row.CurrentModelId,
+          Size: row.Size,
+          OriginalName: row.OriginalName
+        }
+      })
     }
   },
   watch: {

+ 135 - 0
src/components/model/file/nodeDialog.vue

@@ -0,0 +1,135 @@
+<template>
+  <el-dialog :title="title" :visible.sync="dialogVisible" width="500px" id="nodeDialog">
+    <div class="node-des">
+      <p>节点检查说明</p>
+      <div class="gray-border">
+        <div v-if='checkType=="firstCheck"||checkType=="secondCheck"'>
+          <p>强制检查项</p>
+          <p v-for="(t,i) in check[checkType].checkList" :key='i'>
+            <i class="el-icon-check" v-if="!t.check"></i>
+            <i class="el-icon-close" v-else></i>
+            {{t.name}}
+          </p>
+          <p>非强制检查项</p>
+          <p v-for="(t,i) in check[checkType].notCheckList" :key='-i-1'>
+            <i class="el-icon-check" v-if="!t.check"></i>
+            <i class="el-icon-close" v-else></i>
+            {{t.name}}
+          </p>
+        </div>
+      </div>
+    </div>
+    <div class="result-des" v-if="0">
+      <p>处理结果</p>
+      <div class="gray-border"></div>
+    </div>
+    <div class="err-des">
+      <p>错误说明</p>
+      <div>{{errMsg}}</div>
+    </div>
+  </el-dialog>
+</template>
+<script>
+export default {
+  data() {
+    return {
+      dialogVisible: false,
+      title: '节点名称',
+      check: {
+        firstCheck: {
+          checkList: [
+            { name: '楼层平面图命名规范检查', check: false },
+            { name: '项目长度单位检查', check: false },
+          ],
+          notCheckList: [
+            { name: '楼层缺失检查', check: false },
+            { name: '构件范围检查', check: false },
+            { name: '设备族编码检查', check: false },
+            { name: '部件所在位置检查', check: false },
+            { name: '柱边界检查', check: false },
+            { name: '连接件检查', check: false },
+            { name: '系统类型名称检查', check: false },
+            { name: '未在空间中的设备', check: false },
+            { name: '管段检查', check: false },
+            { name: '管网及相关设备检查', check: false },
+            { name: 'Revit族参数完整性检查', check: false },
+            { name: 'xyz坐标重叠检查', check: false }
+          ],
+        },
+        secondCheck: {
+          checkList: [
+            { name: '楼层标高与楼层顺序号检查', check: false, value: 'LevelCheck' },
+            { name: '轴网检查', check: false, value: 'GridCheck' }
+          ],
+          notCheckList: [],
+        }
+      },
+      errMsg: '',
+      checkType: ''
+    };
+  },
+  methods: {
+    showDialog(msg, type) {
+      this.errMsg = msg.ErrorMsg || '';
+      this.checkType = type || '';
+      if (type) {
+        this.check[type].checkList.forEach(t => {
+          if (t.value && t.value == 'GridCheck') {
+            t.check = msg.GridCheck || false
+          }
+          if (t.value && t.value == 'LevelCheck') {
+            t.check = msg.LevelCheck || false
+          }
+        })
+      }
+      this.dialogVisible = true;
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#nodeDialog {
+  .node-des,
+  .result-des {
+    color: #89969f;
+    & > div {
+      min-height: 50px;
+      padding: 5px;
+      p {
+        font-size: 12px;
+        i {
+          margin: 0 5px 0 0;
+        }
+      }
+    }
+    & > p {
+      margin: 5px 0;
+    }
+  }
+  .err-des {
+    color: #ff6660;
+    & > div {
+      border: 1px solid #ff6660;
+      min-height: 50px;
+    }
+  }
+  .gray-border {
+    border: 1px solid #dedee0;
+  }
+  .red-border {
+    border: 1px solid #ff6660;
+  }
+  .el-icon-check {
+    font-size: 14px;
+    color: #4cba38;
+  }
+  .el-icon-close {
+    font-size: 14px;
+    color: #ff6660;
+  }
+  /deep/ .el-dialog__body {
+    max-height: 400px;
+    overflow-y: auto;
+  }
+}
+</style>

+ 86 - 0
src/components/model/file/pathCard.vue

@@ -0,0 +1,86 @@
+<template>
+  <div
+    :class="{'pathCard':true,'borderB':data.BeginTime&&!data.EndTime,'borderY':!data.EndTime&&!data.HasError&&data.HasRetry,'borderR':!data.EndTime&&data.HasError}"
+    @click="cardClick">
+    <div class="path-title">
+      <i v-if="!data.BeginTime" class="iconfont icon-iconfontgengduo" style="color:#333333"></i>
+      <i v-else-if="data.BeginTime&&!data.EndTime" class="iconfont icon-conduct" style="color:#409eff"></i>
+      <i v-else class="el-icon-success" style="color:#67C23A"></i>
+      {{title}}
+      <i v-if="data.HasError" class="iconfont icon-Error pos" style="color:#ff7c77"></i>
+      <i v-else-if="data.HasRetry" class="iconfont icon-trouble pos" style="color:#fcc636"></i>
+    </div>
+    <div class="path-content">
+      <slot></slot>
+      <p v-if="!isCustomize">耗时: {{data.TakeTime||'--'}}</p>
+      <p v-if="!isCustomize">开始时间: {{data.BeginTime||'--'}}</p>
+      <p v-if="!isCustomize">结束时间: {{data.EndTime||'--'}}</p>
+    </div>
+  </div>
+</template>
+<script>
+export default {
+  props: {
+    title: {
+      type: String,
+      default: '提示'
+    },
+    data: {
+      type: Object,
+      default: {}
+    },
+    isCustomize: {
+      type: Boolean,
+      default: false
+    }
+  },
+  data() {
+    return {
+    }
+  },
+  methods: {
+    cardClick() {
+      this.$emit('click', this.data, this.title);
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+.pathCard {
+  width: 296px;
+  height: 144px;
+  border: 1px solid transparent;
+  box-shadow: 0 2px 11px 0 rgba(0, 0, 0, 0.1);
+  border-radius: 4px;
+  &.borderY {
+    border-color: #fcc636;
+  }
+  &.borderR {
+    border-color: #ff7c77;
+  }
+  &.borderB {
+    border-color: #409eff;
+  }
+  .path-title {
+    position: relative;
+    background-color: #f3f5f6;
+    font-size: 14px;
+    padding: 5px 10px;
+    i {
+      margin-right: 5px;
+      &.pos {
+        position: absolute;
+        top: -1px;
+        right: 18px;
+        font-size: 24px;
+        line-height: 1;
+      }
+    }
+  }
+  .path-content {
+    font-size: 12px;
+    padding: 4px 10px 0;
+    color: #acb5bb;
+  }
+}
+</style>

+ 7 - 0
src/router/system.js

@@ -12,6 +12,7 @@ import buildUser from '@/views/ready/appuser'
 import repetitionGraphy from '@/views/ready/buildfloor/repetitionGraphy'
 /**模型管理 */
 import modelFile from '@/views/model/file'
+import pathControl from '@/views/model/file/pathcontrol'
 import modelReport from '@/views/model/report'
 import deleted from '@/views/model/report/deleted'
 import supplement from '@/views/model/report/supplement'
@@ -165,6 +166,12 @@ export default [{
                 meta: { keepAlive: false, breadcrumbs: [{ label: '模型管理', path: '/model/file' }, { label: '模型文件管理' }] }
             },
             {
+                path: 'path',
+                name: 'pathControl',
+                component: pathControl,
+                meta: { keepAlive: false, breadcrumbs: [{ label: '模型管理', path: '/model/file' }, { label: '模型文件管理', path: '/model/file' }, { label: '模型后台处理监控' }] }
+            },
+            {
                 path: 'report',
                 name: 'modelReport',
                 component: modelReport,

+ 0 - 1
src/utils/scan/tools.js

@@ -557,7 +557,6 @@ tools.setDataForKey = function (data, key, value) {
 tools.flattenKeys = function (obj) {
   if(obj == undefined) return
   let res = {}
-
   function isObject(val) {
     return typeof val === 'object' && !Array.isArray(val)
   }

BIN
src/views/business_space/dataUtil/1.jpg


BIN
src/views/business_space/dataUtil/2.jpg


BIN
src/views/business_space/dataUtil/3.jpg


File diff suppressed because it is too large
+ 237 - 16
src/views/business_space/dataUtil/topology.vue


+ 55 - 4
src/views/ledger/facility/details/index.vue

@@ -116,6 +116,7 @@
         exampleData: {}, //实例数据
         currentRadio: '1',//当前选中的select
         criterias: [], //动态参数
+        criteriasArray: [],
         selectRadio: {
           information: '设备信息点',
           initRadio: '1',
@@ -141,6 +142,7 @@
           title: '能耗信息',
           firstName:'',
           dynamic: [],
+          list: {}
         },
         exhibitionMaintain: {
           title: '维修/维保记录'
@@ -210,8 +212,6 @@
           let obj = this.deepCopy(values[1].Content[0]);
           obj = tools.flattenKeys(obj);
           this.instance = obj;
-          this.handleRadios(this.currentRadio)
-          this.handleEnclosure() //处理图片视频文件信息
           this.pointData.forEach(item => {
             if (item.InputMode == "L" || item.InputMode == "L1" || item.InputMode == "L2" || item.InputMode == "M") {
               let cur = tools.dataForKey(this.exampleData, item.Path);
@@ -224,7 +224,6 @@
               }
             }
           })
-
           let params = { //获取动态参数
             secret: this.secret,
             ProjId: this.projectId,
@@ -235,7 +234,20 @@
           let arr = []
           if (this.criterias.length) {
             BeatchQueryParam(params, res => {
+              this.criteriasArray = res.Content;
               arr = res.Content
+              arr && arr.length && arr.forEach(child => {
+                this.pointData.map(head => {
+                  if (head.InfoPointCode == child.code) {
+                    head.svalue = child.value;
+                    head.data = child.data || '--';
+                    head.receivetime = child.receivetime || '';
+                    head.error = child.error || ''
+                  }
+                  return head
+                })
+              })
+              /****************************delete****************************/
               arr && arr.length && arr.map(child => {
                 this.pointData.forEach(head => {
                   if (head.InfoPointCode == child.code) {
@@ -255,9 +267,12 @@
                   }
                 })
               })
+            /****************************delete****************************/
             })
 
           }
+          this.handleRadios(this.currentRadio);
+          this.handleEnclosure() //处理图片视频文件信息
         })
       },
       handleEnclosure() {
@@ -426,7 +441,8 @@
       },
       displayData(arr) {//对数据进行处理传给组件展示
         const result = {}
-        arr.forEach(i => {
+        const resultEnergy = {};
+        arr.map(i => {
           if (this.instance.hasOwnProperty(i.Path) && this.currentRadio != 2) {
             i.value = this.instance[i.Path]
           }
@@ -461,11 +477,45 @@
               }
             })
           }
+          // 动态信息点处理
           switch (i.InputMode) {
             case "L":
             case "L1":
             case "L2":
             case "M":
+              if (resultEnergy[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`]) {
+                resultEnergy[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`].paths.push({
+                  Path: i.Path,
+                  InfoPointName: i.InfoPointName,
+                  InfoPointCode: i.InfoPointCode,
+                  value: i.svalue,
+                  Visible: i.Visible,
+                  KeyWord: i.KeyWord,
+                  InputMode: i.InputMode,
+                  data: i.data,
+                  receivetime: i.receivetime,
+                  error: i.error,
+                  Unit: i.Unit,
+                  FirstName: i.FirstName,
+                })
+              } else {
+                resultEnergy[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`] = {
+                  paths: [{
+                    Path: i.Path,
+                    InfoPointName: i.InfoPointName,
+                    InfoPointCode: i.InfoPointCode,
+                    value: i.svalue,
+                    Visible: i.Visible,
+                    KeyWord: i.KeyWord,
+                    InputMode: i.InputMode,
+                    data: i.data,
+                    receivetime: i.receivetime,
+                    error: i.error,
+                    Unit: i.Unit,
+                    FirstName: i.FirstName,
+                  }]
+                }
+              }
               break;
             default:
               if (result[`${i.FirstName}${i.SecondName ? '/' + i.SecondName : ''}`]) {
@@ -498,6 +548,7 @@
         })
         this.exhibitionBaseInformation.information = result
         this.exhibitionCrux.allMessage = result
+        this.exhibitionEnergy.list = resultEnergy;
       },
       goBack() {
         this.$router.push({

+ 6 - 5
src/views/ledger/report/index.vue

@@ -513,13 +513,13 @@
           let res1 = response[1];
           let res2 = response[2];
           this.equipment.push({
-            title: '未关联资产',
+            title: '未关联设备',
             tips: '设备未关联资产数量',
             contentValueO: '已关联:',
             contentValueT: '未关联:',
             needCountO: this.equipCount - res.Count,
             needCountT: res.Count,
-            text: `总数${this.equipCount}`
+            text: `${res.Count}`
           })
 
           let text = this.toPercent(res1.Count / this.equipCount)
@@ -590,14 +590,15 @@
           let res0 = response[0];
           let res1 = response[1];
           let res2 = response[2];
+
           this.assets.push({
             title: '未关联资产',
             tips: '资产未关联设备数量',
             contentValueO: '已关联:',
             contentValueT: '未关联:',
-            text: `总数${this.assetsCount}`,
-            needCountO: this.assetsCount - res1.Count,
-            needCountT: res1.Count
+            text: `${res0.Count}`,
+            needCountO: this.assetsCount - res0.Count,
+            needCountT: res0.Count
           })
 
           let text = res1.Count / this.assetsCount;

+ 2 - 2
src/views/ledger/spacelist/spaceDetail/index.vue

@@ -3,7 +3,7 @@
     <div class="condition">
       <div class="header">
         <el-button style="float:left;" size="small" type="default" icon="el-icon-back" @click="goBack"></el-button>
-        <span>{{exampleData.RoomLocalName||exampleData.RoomName||''}}</span>
+        <span>{{exampleData ? exampleData.RoomLocalName||exampleData.RoomName :''}}</span>
       </div>
       <el-row class="spaceTypes">
         <div class="types">
@@ -221,7 +221,7 @@
             let cur = tools.dataForKey(this.exampleData, item.Path);
             if (cur) {
               this.criterias.push({
-                id: exampleData.EquipID,
+                id: this.exampleData.EquipID,
                 code: item.InfoPointCode
               })
             }

+ 873 - 0
src/views/model/file/pathcontrol/index.vue

@@ -0,0 +1,873 @@
+<template>
+  <div id="path-control" v-loading="loading">
+    <el-row class="title-time">
+      <div style="width:220px">
+        <span>模型总耗时:</span>
+        <span>{{allTakeTime}}</span>
+      </div>
+      <div style="width:250px">
+        <span>模型开始上传时间:</span>
+        <span>{{UploadState.BeginTime}}</span>
+      </div>
+      <div style="width:250px">
+        <span>模型处理完成时间:</span>
+        <span>{{SaveLog.EndTime}}</span>
+      </div>
+    </el-row>
+    <el-row class="path-pic">
+      <div id="path-container">
+        <div class="first-column column">
+          <el-row id="baseServer">
+            <div class="updown shadow-box">
+              <div style="background:#b8c5d0;height:20px;"></div>
+              <div style="text-align:center;margin-top: 15px">
+                <i class="el-icon-monitor" style="color:#b8c5d0;font-size:60px"></i>
+                <p style="margin-top:10px;color:#b8c5d0">上传下载功能</p>
+              </div>
+              <img v-if="!UploadState.BeginTime" class="status row-status" src="@/assets/image/model/arrowGray.png" />
+              <img v-else-if="UploadState.BeginTime&&!UploadState.EndTime" class="status row-status" src="@/assets/image/model/arrowBlue.png" />
+              <img v-else class="status row-status" src="@/assets/image/model/arrowGreen.png" />
+            </div>
+            <div class="shadow-box mid-transfer">
+              <div class="first-title">
+                <i class="el-icon-success" style="color:#67C23A"></i>模型中转站
+              </div>
+              <div class="first-content">
+                <p>模型文件存储于OSS服务器</p>
+              </div>
+              <img v-if="!SchedulerCheck.BeginTime" class="status row-waiting-manage" src="@/assets/image/model/waitingManageGray.png" />
+              <img v-else-if="SchedulerCheck.BeginTime&&!SchedulerCheck.EndTime" class="status row-waiting-manage"
+                src="@/assets/image/model/waitingManageBlue.png" />
+              <img v-else class="status row-waiting-manage" src="@/assets/image/model/waitingManageGreen.png" />
+
+              <img v-if="!UploadState.BeginTime" class="status up-model" src="@/assets/image/model/upModelGray.png" />
+              <img v-else-if="UploadState.BeginTime&&!UploadState.EndTime" class="status up-model" src="@/assets/image/model/upModelBlue.png" />
+              <img v-else class="status up-model" src="@/assets/image/model/upModelGreen.png" />
+
+              <!-- 调度器1 -->
+              <div class="path-tips shadow-box" style="top:67px;left:291px;" @click="getNodeDes"
+                v-if='SchedulerCheck.BeginTime&&!SchedulerCheck.EndTime'>
+                <i class="el-icon-error" v-if="SchedulerCheck.HasError"></i>
+                <i class="el-icon-warning" v-else-if="SchedulerCheck.HasRetry"></i>
+                <p>耗时: {{SchedulerCheck.TakeTime||'--'}}</p>
+                <!-- <p>平均上传速度: 1M/s</p> -->
+                <p>开始时间: {{SchedulerCheck.BeginTime||'--'}}</p>
+                <p v-if="!SchedulerCheck.EndTime">待分配模型数量: {{waitAssign}}</p>
+                <p v-else>结束时间: {{SchedulerCheck.EndTime||'--'}}</p>
+              </div>
+            </div>
+            <p style="float:left;width:100%;text-align:center;margin-top:73px;color:#acb5bb;font-size:12px;">本地电脑主机</p>
+          </el-row>
+          <!-- 上传模型文件 -->
+          <div class="path-tips shadow-box" style="top:189px;left:190px;" @click="getNodeDes">
+            <i class="el-icon-error" v-if="UploadState.HasError"></i>
+            <i class="el-icon-warning" v-else-if="UploadState.HasRetry"></i>
+            <p>耗时: {{UploadState.TakeTime||'--'}}</p>
+            <p>平均上传速度: {{UploadStateSpeed}}</p>
+            <p>开始时间: {{UploadState.BeginTime||'--'}}</p>
+            <p>结束时间: {{UploadState.EndTime||'--'}}</p>
+          </div>
+        </div>
+        <div class="second-column column">
+          <div>
+            <div id="ossServer" class="shadow-box">
+              <div style="background:#b8c5d0;height:20px;"></div>
+              <el-row class="server-content">
+                <div style="text-align:center;width:100px" class="sm-box">
+                  <i class="iconfont icon-OSSserver" style="color:#b8c5d0;font-size:50px;"></i>
+                  <p style="margin:18px 0 0;color:#b8c5d0;">oss服务器</p>
+                </div>
+                <el-row class="sm-box">
+                  <div class="image">
+                    <i class="iconfont icon-revit" style="color:#dee6ec;font-size:60px;background:#fff"></i>
+                  </div>
+                  <div class="fixed">
+                    <p :title="OriginalName">模型文件名称{{OriginalName}}</p>
+                    <p style="color:#8d9aa3">模型文件大小: {{(Size/1000/1024).toFixed(1)}}M</p>
+                    <p style="color:#8d9aa3">上传时间: {{UploadState.EndTime||'--'}}</p>
+                  </div>
+                </el-row>
+                <el-row class="sm-box">
+                  <div class="image">
+                    <i class="iconfont icon-json" style="color:#dee6ec;font-size:60px;background:#fff"></i>
+                  </div>
+                  <div class="fixed">
+                    <p>{{OriginalName}} json数据压缩包</p>
+                    <p style="color:#8d9aa3">文件大小: {{ModelExport.JsonzSize?(ModelExport.JsonzSize/1000/1024).toFixed(1)+'M':'--'}}</p>
+                    <p style="color:#8d9aa3">上传时间: {{ModelExport.JsonzEndTime||'--'}}</p>
+                  </div>
+                </el-row>
+              </el-row>
+              <!-- 下载模型文件1 -->
+              <img v-if="!UploadState.EndTime" class="status down-model" src="@/assets/image/model/downModelGray.png" />
+              <img v-else-if="UploadState.EndTime&&!SchedulerCheck.EndTime" class="status down-model" src="@/assets/image/model/downModelBlue.png" />
+              <img v-else class="status down-model" src="@/assets/image/model/downModelGreen.png" />
+              <!-- 下载模型文件2 -->
+              <img v-if="!SchedulerExport.BeginTime" class="status down-model-sec" src="@/assets/image/model/downModelGray.png" />
+              <img v-else-if="SchedulerExport.BeginTime&&!ModelExport.JsonzBeginTime" class="status down-model-sec"
+                src="@/assets/image/model/downModelBlue.png" />
+              <img v-else class="status down-model-sec" src="@/assets/image/model/downModelGreen.png" />
+              <!-- 存储json -->
+              <img v-if="!ModelExport.JsonzBeginTime" class="status up-json" src="@/assets/image/model/upJsonGray.png" />
+              <img v-else-if="ModelExport.JsonzBeginTime&&!ModelExport.JsonzEndTime" class="status up-json"
+                src="@/assets/image/model/upJsonBlue.png" />
+              <img v-else class="status up-json" src="@/assets/image/model/upJsonGreen.png" />
+              <!-- 下载json -->
+              <img v-if="!JsonAnalysis.BeginTime" class="status down-json" src="@/assets/image/model/downJsonGray.png" />
+              <img v-else-if="JsonAnalysis.BeginTime&&!JsonAnalysis.EndTime" class="status down-json" src="@/assets/image/model/downJsonBlue.png" />
+              <img v-else class="status down-json" src="@/assets/image/model/downJsonGreen.png" />
+            </div>
+          </div>
+          <el-row id="revitServer">
+            <pathCard class="revit-item" :title="'楼层模型检查'" @click="getNodeDes" :data="ModelCheck">
+              <p>共检查项: 14项</p>
+            </pathCard>
+            <pathCard class="revit-item" :title="'导出模型json数据并压缩存储'" @click="getNodeDes" :data="ModelExport"></pathCard>
+            <!-- 调度器2 -->
+            <img v-if="!SchedulerExport.BeginTime" class="status row-waiting-manage" src="@/assets/image/model/waitingManageGray.png" />
+            <img v-else-if="SchedulerExport.BeginTime&&!SchedulerExport.EndTime" class="status row-waiting-manage"
+              src="@/assets/image/model/waitingManageBlue.png" />
+            <img v-else class="status row-waiting-manage" src="@/assets/image/model/waitingManageGreen.png" />
+            <!-- 等待解析 -->
+            <img v-if="!JsonAnalysis.BeginTime" class="status waiting-anl" src="@/assets/image/model/waitingAnlGray.png" />
+            <img v-else-if="JsonAnalysis.BeginTime&&!JsonAnalysis.EndTime" class="status waiting-anl" src="@/assets/image/model/waitingAnlBlue.png" />
+            <img v-else class="status waiting-anl" src="@/assets/image/model/waitingAnlGreen.png" />
+            <!-- 未通过 -->
+            <img v-if="ModelCheck.Remove||ModelExport.Remove" class="status del-model" src="@/assets/image/model/delModelBlue.png" />
+            <img v-else class="status del-model" src="@/assets/image/model/delModelGray.png" />
+
+            <!-- 调度器2 -->
+            <div class="path-tips shadow-box" style="top:114px;left:329px;" @click="getNodeDes"
+              v-if="SchedulerExport.BeginTime&&!SchedulerExport.EndTime">
+              <i class="el-icon-error" v-if="SchedulerExport.HasError"></i>
+              <i class="el-icon-warning" v-else-if="SchedulerExport.HasRetry"></i>
+              <p>耗时: {{SchedulerExport.TakeTime||'--'}}</p>
+              <!-- <p>平均上传速度: 1M/s</p> -->
+              <p>开始时间: {{SchedulerExport.BeginTime||'--'}}</p>
+              <p v-if="!SchedulerExport.EndTime">待分配模型数量: {{waitAssign}}</p>
+              <p v-else>结束时间: {{SchedulerExport.EndTime}}</p>
+            </div>
+
+            <p style="float:left;width:100%;text-align:center;margin-top:83px;color:#acb5bb;font-size:12px;">revit本地服务器集群</p>
+          </el-row>
+          <!-- 下载模型文件1 -->
+          <div class="path-tips shadow-box up-model-tips" @click="getNodeDes">
+            <i class="el-icon-error" v-if="ModelCheck.HasError"></i>
+            <i class="el-icon-warning" v-else-if="ModelCheck.HasRetry"></i>
+            <p>耗时: {{ModelCheck.DownTakeTime||'--'}}</p>
+            <p>平均下载速度: {{ModelCheckSpeed}}</p>
+            <p>开始时间: {{UploadState.EndTime||'--'}}</p>
+            <p>结束时间: {{SchedulerCheck.EndTime||'--'}}</p>
+          </div>
+          <!-- 下载模型文件2 -->
+          <div class="path-tips shadow-box up-model-tips2" @click="getNodeDes">
+            <i class="el-icon-error" v-if="ModelExport.HasError"></i>
+            <i class="el-icon-warning" v-else-if="ModelExport.HasRetry"></i>
+            <p>耗时: {{ModelExport.DownTakeTime||'--'}}</p>
+            <p>平均下载速度: {{ModelExportSpeed||'--'}}</p>
+            <p>开始时间: {{SchedulerExport.BeginTime||'--'}}</p>
+            <p>结束时间: {{ModelExport.JsonzBeginTime||'--'}}</p>
+          </div>
+          <!-- 存储json -->
+          <div class="path-tips shadow-box up-json-tips" @click="getNodeDes">
+            <i class="el-icon-error" v-if="ModelExport.HasError"></i>
+            <i class="el-icon-warning" v-else-if="ModelExport.HasRetry"></i>
+            <p>耗时: {{ModelExport.JsonzTakeTime||'--'}}</p>
+            <p>平均上传速度: {{SaveJsonSpeed||'--'}}</p>
+            <p>开始时间: {{ModelExport.JsonzBeginTime||'--'}}</p>
+            <p>结束时间: {{ModelExport.JsonzEndTime||'--'}}</p>
+          </div>
+          <!-- 下载json压缩包 -->
+          <div class="path-tips shadow-box down-json-tips" @click="getNodeDes">
+            <i class="el-icon-error" v-if="JsonAnalysis.HasError"></i>
+            <i class="el-icon-warning" v-else-if="JsonAnalysis.HasRetry"></i>
+            <p>耗时: {{JsonAnalysis.TakeTime||'--'}}</p>
+            <p>平均下载速度: {{DownJsonSpeed||'--'}}</p>
+            <p>开始时间: {{JsonAnalysis.BeginTime||'--'}}</p>
+            <p>结束时间: {{JsonAnalysis.EndTime||'--'}}</p>
+          </div>
+          <div id="secondDel" class="delModel">
+            <i class="iconfont icon-delate" style="color:#89969F;font-size:30px;line-height:1;margin-left:-6px"></i>
+            <p>放弃文件</p>
+          </div>
+        </div>
+        <div class="third-column column">
+          <div>
+            <div id="webDatabase" class="shadow-box">
+              <div style="background:#b8c5d0;height:20px;"></div>
+              <div>
+                <div style="text-align:center;">
+                  <i class="iconfont icon-project-o" style="color:#dee6ec;font-size:40px"></i>
+                  <p style="color:#676767">web服务数据库</p>
+                </div>
+              </div>
+              <img v-if="1||!SaveData.BeginTime" class="status column-up" src="@/assets/image/model/columnGray.png" />
+              <!-- <img v-else-if="SaveData.BeginTime&&!SaveData.EndTime" class="status column-up" src="@/assets/image/model/columnBlue.png" />
+              <img v-else class="status column-up" src="@/assets/image/model/columnGreen.png" /> -->
+
+              <img v-if="1||!MultiFloorCheck.BeginTime" class="status right-down" src="@/assets/image/model/rightDownGray.png" />
+              <!-- <img v-else-if="MultiFloorCheck.BeginTime&&!MultiFloorCheck.EndTime" class="status right-down" src="@/assets/image/model/rightDownBlue.png" />
+              <img v-else class="status right-down" src="@/assets/image/model/rightDownGreen.png" /> -->
+            </div>
+          </div>
+          <el-row id="webServer">
+            <pathCard class="webServer-item" :title="'解压并解析json文件'" :data="JsonAnalysis" @click="getNodeDes"></pathCard>
+            <pathCard class="webServer-item" :title="'存储数据到模型web服务数据库'" :data="SaveData" @click="getNodeDes"></pathCard>
+            <pathCard class="webServer-item" :title="'建筑模型检查'" :data="MultiFloorCheck" @click="getNodeDes">
+              <p>共检查项: 2项</p>
+            </pathCard>
+            <pathCard class="webServer-item" :title="'处理模型数据格式'" :data="SyncDatacenter" @click="getNodeDes"></pathCard>
+
+            <img v-if="!SaveData.BeginTime" class="status path1 path" src="@/assets/image/model/arrowGray.png" />
+            <img v-else-if="SaveData.BeginTime&&!SaveData.EndTime" class="status path1 path" src="@/assets/image/model/arrowBlue.png" />
+            <img v-else class="status path1 path" src="@/assets/image/model/arrowGreen.png" />
+
+            <img v-if="!MultiFloorCheck.BeginTime" class="status path2 path" src="@/assets/image/model/arrowGray.png" />
+            <img v-else-if="MultiFloorCheck.BeginTime&&!MultiFloorCheck.EndTime" class="status path2 path" src="@/assets/image/model/arrowBlue.png" />
+            <img v-else class="status path2 path" src="@/assets/image/model/arrowGreen.png" />
+
+            <img v-if="!SyncDatacenter.BeginTime" class="status path3 path" src="@/assets/image/model/arrowGray.png" />
+            <img v-else-if="SyncDatacenter.BeginTime&&!SyncDatacenter.EndTime" class="status path3 path" src="@/assets/image/model/arrowBlue.png" />
+            <img v-else class="status path3 path" src="@/assets/image/model/arrowGreen.png" />
+
+            <img v-if="!SaveLog.BeginTime" class="status path4 path" src="@/assets/image/model/arrowGray.png" />
+            <img v-else-if="SaveLog.BeginTime&&!SaveLog.EndTime" class="status path4 path" src="@/assets/image/model/arrowBlue.png" />
+            <img v-else class="status path4 path" src="@/assets/image/model/arrowGreen.png" />
+
+            <img v-if="MultiFloorCheck.GridCheck||MultiFloorCheck.LevelCheck" class="status del-model" src="@/assets/image/model/delModelBlue.png" />
+            <img v-else class="status del-model" src="@/assets/image/model/delModelGray.png" />
+
+            <p style="float:left;width:100%;text-align:center;margin-top:83px;color:#acb5bb;font-size:12px;">模型web服务器</p>
+          </el-row>
+          <div id="thirdDel" class="delModel">
+            <i class="iconfont icon-delate" style="color:#89969F;font-size:30px;line-height:1;margin-left:-6px"></i>
+            <p>放弃文件</p>
+          </div>
+        </div>
+        <div class="forth-column column">
+          <div>
+            <div id="dataCenterDatabase" class="shadow-box">
+              <div style="background:#b8c5d0;height:20px;"></div>
+              <div>
+                <div style="text-align:center;">
+                  <i class="iconfont icon-project-o" style="color:#dee6ec;font-size:40px"></i>
+                  <p style="color:#676767">数据中心数据库</p>
+                </div>
+              </div>
+
+              <img v-if="1" class="status column-up" src="@/assets/image/model/columnGray.png" />
+              <!-- <img v-else-if="2" class="status column-up" src="@/assets/image/model/columnBlue.png" />
+              <img v-else class="status column-up" src="@/assets/image/model/columnGreen.png" /> -->
+            </div>
+          </div>
+          <el-row id="dataCenterServer">
+            <pathCard :title="'储存模型数据并记录增删日志'" @click="getNodeDes" :data="SaveLog"></pathCard>
+
+            <img v-if="1" class="status path1" src="@/assets/image/model/arrowGray.png" />
+            <!-- <img v-else-if="2" class="status path1" src="@/assets/image/model/arrowBlue.png" />
+            <img v-else class="status path1" src="@/assets/image/model/arrowGreen.png" /> -->
+
+            <p style="float:left;width:100%;text-align:center;margin-top:83px;color:#acb5bb;font-size:12px;">数据中心服务器 </p>
+          </el-row>
+        </div>
+        <div class="fifth-column column">
+          <pathCard class="finish-item" :title="'完成'" :data="SaveLog" :isCustomize="true">
+            <p>后续关系计算...</p>
+            <p>完成时间: {{SaveLog.EndTime||'--'}}</p>
+          </pathCard>
+        </div>
+      </div>
+    </el-row>
+    <nodeDialog ref="nodeDialog"></nodeDialog>
+  </div>
+</template>
+<script>
+import { mapGetters } from "vuex";
+import pathCard from "@/components/model/file/pathCard"
+import nodeDialog from "@/components/model/file/nodeDialog"
+import { modelPathControl, unassignQuery } from "@/api/model/file";
+import Bus from '@/utils/bus.js'
+export default {
+  components: {
+    pathCard,
+    nodeDialog
+  },
+  computed: {
+    ...mapGetters("layout", ["projectId"])
+  },
+  data() {
+    return {
+      loading: false, //
+      Id: '',
+      Size: 0,
+      OriginalName: '',
+      JsonAnalysis: {}, //解压并解析json文件
+      ModelCheck: {}, //楼层模型检查
+      ModelExport: {}, //导出模型json数据并压缩存储
+      MultiFloorCheck: {}, //建筑模型检查
+      Note: {}, //储存模型数据并记录增删日志
+      SaveData: {}, //存储数据到模型web服务数据库
+      SchedulerCheck: {}, //第一个等待调度器
+      SchedulerExport: {},//第二个等待调度器
+      UploadState: {}, //上传下载功能
+      finish: {},
+      SyncDatacenter: {}, //处理模型数据格式
+      SaveLog: {},// 储存模型数据并记录增删日志
+      timer: null, //定时器
+      timeout: null, //延时器
+      waitAssign: 0,
+      allTakeTime: '', //总耗时
+      UploadStateSpeed: '', // 上传模型文件平均速度
+      ModelCheckSpeed: '',//下载模型文件1平均速度
+      ModelExportSpeed: '',//下载模型文件2平均速度
+      SaveJsonSpeed: '',//存储json平均速度
+      DownJsonSpeed: '',//下载json平均速度
+    }
+  },
+  mounted() {
+    // Bus.$on('modelStatusChange', message => {
+    //   this.init()
+    // })
+  },
+  created() {
+    this.Id = this.$route.query.Id
+    this.Size = this.$route.query.Size
+    this.OriginalName = this.$route.query.OriginalName || '--'
+    this.init();
+  },
+  beforeDestroy() {
+    if (this.timer) {
+      clearInterval(this.timer);
+    }
+    if (this.timeout) {
+      clearTimeout(this.timeout);
+    }
+  },
+  methods: {
+    init() {
+      this.getMessage();
+      if (!this.SchedulerExport.EndTime) {
+        this.getUnassignNum();
+      }
+    },
+    // 弹窗
+    getNodeDes(data, title) {
+      let type = '';
+      if (title == '楼层模型检查') {
+        type = 'firstCheck'
+      } else if (title == '建筑模型检查') {
+        type = 'secondCheck'
+      }
+      this.$refs.nodeDialog.showDialog(data, type)
+    },
+    // 获取流转状态
+    getMessage() {
+      let pa = {
+        Filters: `Id="${this.Id}"`
+      }
+      modelPathControl(pa, res => {
+        if (res.Content.length) {
+          const data = res.Content[0];
+          if (data.SchedulerExport && data.SchedulerExport.BeginTime) {
+            if (data.ModelExport) {
+              data.ModelExport.BeginTime = data.SchedulerExport.BeginTime
+            }
+          }
+          this.updateData(data);
+          this.getSpeed();
+          this.interval(data);
+          if (!this.SaveLog.EndTime) {
+            if (this.timeout) {
+              clearTimeout(this.timeout);
+            }
+            this.timeout = setTimeout(() => {
+              this.init()
+            }, 30000)
+          }
+        } else {
+          this.$message.warning('暂无数据')
+        }
+      })
+    },
+    // 
+    getUnassignNum() {
+      let pa = {
+        Filters: `Status=0 or Status=1 or Status=2`
+      }
+      unassignQuery(pa, res => {
+        this.waitAssign = res.Total
+      })
+    },
+    // 定时器
+    interval(data) {
+      if (this.timer) {
+        clearInterval(this.timer);
+      }
+      this.timer = setInterval(() => {
+        this.updateData(data)
+        this.$forceUpdate()
+      }, 1000)
+    },
+    // 计算耗时
+    updateData(data) {
+      this.JsonAnalysis = this.formatTime(data.JsonAnalysis || {});
+      this.ModelCheck = this.formatTime(data.ModelCheck || {})
+      this.ModelExport = this.formatTime(data.ModelExport || {})
+      this.MultiFloorCheck = this.formatTime(data.MultiFloorCheck || {})
+      this.SaveData = this.formatTime(data.SaveData || {})
+      this.SchedulerCheck = this.formatTime(data.SchedulerCheck || {})
+      this.SchedulerExport = this.formatTime(data.SchedulerExport || {})
+      this.UploadState = this.formatTime(data.UploadState || {})
+      this.SyncDatacenter = this.formatTime(data.SyncDatacenter || {})
+      this.SaveLog = this.formatTime(data.SaveLog || {})
+      if (this.UploadState.BeginTime) {
+        let temp = { BeginTime: this.UploadState.BeginTime }
+        if (this.SaveLog.EndTime) {
+          temp.EndTime = this.SaveLog.EndTime
+        }
+        this.allTakeTime = this.formatTime(temp).TakeTime
+      }
+      if (this.UploadState.EndTime && !this.SchedulerCheck.EndTime) {
+        const sTime = new Date(this.UploadState.EndTime).getTime();
+        const eTime = new Date().getTime();
+        this.ModelCheck.DownTakeTime = this.msToStr(eTime - sTime);
+      } else if (this.UploadState.EndTime && this.SchedulerCheck.EndTime) {
+        const sTime = new Date(this.UploadState.EndTime).getTime();
+        const eTime = new Date(this.SchedulerCheck.EndTime).getTime();
+        this.ModelCheck.DownTakeTime = this.msToStr(eTime - sTime);
+      }
+      if (this.SchedulerExport.BeginTime && !this.ModelExport.JsonzBeginTime) {
+        const sTime = new Date(this.SchedulerExport.BeginTime).getTime();
+        const eTime = new Date().getTime();
+        this.ModelExport.DownTakeTime = this.msToStr(eTime - sTime);
+      } else if (this.SchedulerExport.BeginTime && this.ModelExport.JsonzBeginTime) {
+        const sTime = new Date(this.SchedulerExport.BeginTime).getTime();
+        const eTime = new Date(this.ModelExport.JsonzBeginTime).getTime();
+        this.ModelExport.DownTakeTime = this.msToStr(eTime - sTime);
+      }
+    },
+    // 设置速度
+    getSpeed() {
+      let sTime, eTime;
+      if (this.UploadState.BeginTime && this.UploadState.EndTime) {
+        sTime = new Date(this.UploadState.BeginTime).getTime();
+        eTime = new Date(this.UploadState.EndTime).getTime();
+        if (sTime != eTime) {
+          this.UploadStateSpeed = this.formatSpeed(this.Size / (eTime - sTime))
+        } else {
+          this.UploadStateSpeed = '--'
+        }
+      } else {
+        this.UploadStateSpeed = '--'
+      }
+      if (this.UploadState.EndTime && this.SchedulerCheck.EndTime) {
+        sTime = new Date(this.UploadState.EndTime).getTime();
+        eTime = new Date(this.SchedulerCheck.EndTime).getTime();
+        if (sTime != eTime) {
+          this.ModelCheckSpeed = this.formatSpeed(this.Size / (eTime - sTime))
+        } else {
+          this.ModelCheckSpeed = '--'
+        }
+      } else {
+        this.ModelCheckSpeed = '--'
+      }
+      if (this.SchedulerExport.BeginTime && this.ModelExport.JsonzBeginTime) {
+        sTime = new Date(this.SchedulerExport.BeginTime).getTime();
+        eTime = new Date(this.ModelExport.JsonzBeginTime).getTime();
+        if (sTime != eTime) {
+          this.ModelExportSpeed = this.formatSpeed(this.Size / (eTime - sTime))
+        } else {
+          this.ModelExportSpeed = '--'
+        }
+      } else {
+        this.ModelExportSpeed = '--'
+      }
+      if (this.ModelExport.JsonzBeginTime && this.ModelExport.JsonzEndTime) {
+        sTime = new Date(this.ModelExport.JsonzBeginTime).getTime();
+        eTime = new Date(this.ModelExport.JsonzEndTime).getTime();
+        if (sTime != eTime) {
+          this.SaveJsonSpeed = this.formatSpeed(this.ModelExport.JsonzSize / (eTime - sTime))
+        } else {
+          this.SaveJsonSpeed = '--'
+        }
+      } else {
+        this.SaveJsonSpeed = '--'
+      }
+      if (this.JsonAnalysis.BeginTime && this.JsonAnalysis.EndTime) {
+        sTime = new Date(this.JsonAnalysis.BeginTime).getTime();
+        eTime = new Date(this.JsonAnalysis.EndTime).getTime();
+        if (sTime != eTime) {
+          this.DownJsonSpeed = this.formatSpeed(this.ModelExport.JsonzSize / (eTime - sTime))
+        } else {
+          this.DownJsonSpeed = '--'
+        }
+      } else {
+        this.DownJsonSpeed = '--'
+      }
+    },
+    // 处理时间工具
+    formatTime(data) {
+      if (data.BeginTime && !data.EndTime) {
+        const sTime = new Date(data.BeginTime).getTime();
+        const eTime = new Date().getTime();
+        data.TakeTime = this.msToStr(eTime - sTime);
+      } else if (data.BeginTime && data.EndTime) {
+        const sTime = new Date(data.BeginTime).getTime();
+        const eTime = new Date(data.EndTime).getTime();
+        data.TakeTime = this.msToStr(eTime - sTime);
+      }
+      if (data.JsonzBeginTime && !data.JsonzEndTime) {
+        const sTime = new Date(data.JsonzBeginTime).getTime();
+        const eTime = new Date().getTime();
+        data.JsonzTakeTime = this.msToStr(eTime - sTime);
+      } else if (data.JsonzBeginTime && data.JsonzEndTime) {
+        const sTime = new Date(data.JsonzBeginTime).getTime();
+        const eTime = new Date(data.JsonzEndTime).getTime();
+        data.JsonzTakeTime = this.msToStr(eTime - sTime);
+      }
+      return data;
+    },
+    // 生成speed
+    formatSpeed(speed) {
+      if (speed > 1024) {
+        speed = (speed / 1024).toFixed(1);
+        return `${speed}MB/s`
+      } else {
+        return `${speed.toFixed(1)}KB/s`
+      }
+    },
+    msToStr(mss) {
+      let str = '';
+      const days = parseInt(mss / (1000 * 60 * 60 * 24));
+      const hours = parseInt((mss % (1000 * 60 * 60 * 24)) / (1000 * 60 * 60));
+      const minutes = parseInt((mss % (1000 * 60 * 60)) / (1000 * 60));
+      const seconds = ((mss % (1000 * 60)) / 1000).toFixed();
+      if (days > 0) {
+        str += `${days}天`
+      }
+      if (hours > 0) {
+        str += `${hours}小时`
+      }
+      if (minutes > 0) {
+        str += `${minutes}分钟`
+      }
+      if (seconds > 0) {
+        str += `${seconds}秒`
+      }
+      return str;
+    }
+  }
+};
+</script>
+<style lang="less" scoped>
+#path-control {
+  box-sizing: border-box;
+  padding: 10px;
+  border: 1px solid #e4e4e4;
+  background-color: #fff;
+  overflow: hidden;
+  .title-time {
+    padding: 10px;
+    border-bottom: 1px solid #e4e4e4;
+    & > div {
+      float: left;
+      font-size: 14px;
+    }
+    & > div + div {
+      margin-left: 20px;
+    }
+  }
+  .path-pic {
+    height: calc(100% - 50px);
+    overflow-x: auto;
+    #path-container {
+      position: relative;
+      height: 100%;
+      padding: 20px 0 0;
+      width: 4450px;
+      img.status {
+        position: absolute;
+      }
+      .column {
+        height: 100%;
+        position: relative;
+        float: left;
+        width: 1000px;
+        &.first-column {
+          width: 832px;
+          #baseServer {
+            border: 2px dashed #b8c5d0;
+            border-radius: 4px;
+            padding: 20px 20px 0;
+            margin: 389px 20px 0;
+            width: 584px;
+            height: 270px;
+            .updown {
+              position: relative;
+              width: 150px;
+              height: 150px;
+              float: left;
+              margin-right: 150px;
+            }
+            .mid-transfer {
+              position: relative;
+              width: 235px;
+              height: 90px;
+              float: left;
+              margin-top: 30px;
+            }
+          }
+          .first-title {
+            background-color: #f3f5f6;
+            font-size: 14px;
+            padding: 5px 10px;
+            i {
+              margin-right: 5px;
+            }
+          }
+          .first-content {
+            font-size: 12px;
+            padding: 10px;
+            color: #acb5bb;
+          }
+          .row-status {
+            left: 170px;
+            top: 70px;
+          }
+          .row-waiting-manage {
+            left: 264px;
+            top: 30px;
+          }
+          .up-model {
+            left: 95px;
+            bottom: 96px;
+          }
+        }
+        &.second-column {
+          #ossServer {
+            position: relative;
+            width: 780px;
+            margin: 0 auto;
+            .server-content {
+              padding: 20px 0;
+              .sm-box {
+                float: left;
+                padding: 0 10px;
+                line-height: 1;
+                & > div {
+                  float: left;
+                  font-size: 12px;
+                }
+                &:nth-child(1) {
+                  width: 100px;
+                  margin-right: 30px;
+                }
+                &:nth-child(2),
+                &:nth-child(3) {
+                  padding: 15px 20px;
+                  background: #eef2f6;
+                  border-radius: 4px;
+                  border: 2px dashed #b8c5d0;
+                }
+                &:nth-child(3) {
+                  margin-left: 40px;
+                }
+                .fixed {
+                  p {
+                    width: 167px;
+                    overflow: hidden;
+                    text-overflow: ellipsis;
+                    white-space: nowrap;
+                  }
+                }
+                .image {
+                  margin-right: 20px;
+                }
+                p {
+                  margin-bottom: 8px;
+                }
+              }
+            }
+            .down-model {
+              left: 82px;
+              top: 156px;
+            }
+            .down-model-sec {
+              left: 565px;
+              top: 156px;
+            }
+            .up-json {
+              left: 665px;
+              top: 156px;
+            }
+            .down-json {
+              top: 68px;
+              right: -460px;
+            }
+          }
+          #revitServer {
+            padding: 16px 16px 0;
+            border: 2px dashed #b8c5d0;
+            width: 890px;
+            height: 270px;
+            margin: 235px auto 0;
+            .revit-item {
+              float: left;
+              &:nth-child(1) {
+                margin-right: 255px;
+              }
+            }
+            .row-waiting-manage {
+              left: 300px;
+              top: 80px;
+              transform: scale(0.9);
+            }
+            .waiting-anl {
+              right: -263px;
+              top: 80px;
+            }
+            .del-model {
+              left: 91px;
+              top: 168px;
+            }
+          }
+          .up-model-tips {
+            left: -44px;
+            top: 202px;
+          }
+          .up-model-tips2 {
+            left: 439px;
+            top: 202px;
+          }
+          .up-json-tips {
+            left: 815px;
+            top: 202px;
+          }
+          .down-json-tips {
+            right: -336px;
+            top: 114px;
+          }
+          #secondDel {
+            margin: 48px 0 0 166px;
+          }
+        }
+        &.third-column {
+          width: 1544px;
+          margin-left: 200px;
+          #webDatabase {
+            width: 130px;
+            height: 144px;
+            margin-left: 500px;
+            .column-up {
+              top: 158px;
+              left: 565px;
+              transform: scale(1.1);
+            }
+            .right-down {
+              right: 560px;
+              top: 103px;
+            }
+          }
+          #webServer {
+            border: 2px dashed #b8c5d0;
+            margin-top: 241px;
+            padding: 16px 16px 0;
+            height: 270px;
+            .webServer-item {
+              float: left;
+              & + .webServer-item {
+                margin-left: 105px;
+              }
+            }
+            .path {
+              top: 95px;
+            }
+            .path1 {
+              left: 311px;
+            }
+            .path2 {
+              left: 715px;
+            }
+            .path3 {
+              left: 1117px;
+            }
+            .path4 {
+              left: 1520px;
+            }
+            .del-model {
+              right: 517px;
+              top: 168px;
+            }
+          }
+          #thirdDel {
+            margin: 48px 0 0 925px;
+          }
+        }
+        &.forth-column {
+          width: 335px;
+          margin-left: 70px;
+          margin-right: 87px;
+          #dataCenterDatabase {
+            width: 130px;
+            height: 144px;
+            margin: 0 auto;
+            .column-up {
+              top: 158px;
+              left: 165px;
+              transform: scale(1.1);
+            }
+          }
+          #dataCenterServer {
+            border: 2px dashed #b8c5d0;
+            margin-top: 240px;
+            padding: 16px 16px 0;
+            height: 270px;
+            .path1 {
+              top: 95px;
+              left: 311px;
+            }
+          }
+        }
+        &.fifth-column {
+          width: auto;
+          .finish-item {
+            margin-top: 403px;
+          }
+        }
+      }
+    }
+  }
+  .shadow-box {
+    box-shadow: 0 2px 6px 0 rgba(0, 0, 0, 0.2);
+    border-radius: 4px;
+  }
+  .path-tips {
+    position: absolute;
+    font-size: 12px;
+    width: 204px;
+    height: 93px;
+    padding: 10px;
+    i {
+      position: absolute;
+      font-size: 16px;
+      right: 10px;
+      &.el-icon-warning {
+        color: #fbc636;
+      }
+      &.el-icon-error {
+        color: #ff6660;
+      }
+    }
+  }
+  .delModel {
+    width: 76px;
+    height: 66px;
+    font-size: 12px;
+    text-align: center;
+    padding-top: 10px;
+    background: #eef2f6;
+    border: 2px solid #b8c5d0;
+    border-radius: 5px;
+  }
+}
+</style>

+ 1 - 1
src/views/point/config_point/steps/step1.vue

@@ -256,7 +256,7 @@
                     var blob = new Blob([res.data], {
                         type: 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;charset=utf-8'
                     });
-                    var fileName = res.headers['content-disposition'];
+                    var fileName = decodeURI(res.headers['content-disposition']);
                     if (fileName)
                         fileName = fileName.substring(fileName.indexOf('=') + 1);
                     if ('download' in document.createElement('a')) { // 非IE下载

+ 1 - 5
src/views/ready/buildfloor/addFloor/index.vue

@@ -5,7 +5,7 @@
     </el-row>
     <span slot="footer" class="dialog-footer">
       <el-button size="small" @click="dialogVisible=false">取消</el-button>
-      <el-button size="small" type="primary" @click="confirm" :disabled="disabled">确认</el-button>
+      <el-button size="small" type="primary" @click="confirm" >确认</el-button>
     </span>
   </el-dialog>
 </template>
@@ -36,7 +36,6 @@
         return {
           dialogVisible: false, //弹窗显示与隐藏
           floorData: {},
-          disabled: false
         };
       },
       methods: {
@@ -62,7 +61,6 @@
         handleClose() { },
         //创建
         confirm() {
-          this.disabled = true
           this.$refs.formItems.submitForm(this.save)
         },
         save() {
@@ -77,14 +75,12 @@
               this.$message.success('更新成功')
               this.$emit('refresh')
               this.dialogVisible = false;
-              this.disabled = false
             })
           } else {
             manageCreateFloor(Param, res => {
               this.$message.success('创建成功')
               this.$emit('refresh')
               this.dialogVisible = false;
-              this.disabled = false
             })
           }
         }

+ 1 - 3
src/views/ready/buildfloor/index.vue

@@ -374,17 +374,15 @@
         } else {
           // 删除建筑
           if (this.tableData && this.tableData.length) {
+            this.buildDisabled = false
             this.$message.error("当前建筑中包含楼层,不可删除");
             this.delDialogVis = false;
-            this.buildDisabled = false
           } else {
             let param = [{BuildId: this.curBuildId}];
             this.$message.success("删除成功");
             this.delDialogVis = false;
             objectDeleteBuild(param, res => {
-              this.$message.success("删除成功");
               this.buildDisabled = false
-              this.delDialogVis = false;
               this.handleBuildQuery()
               this.init()
             })

+ 2 - 0
src/views/relation/data/index.vue

@@ -10,10 +10,12 @@
             :disabled="isDisabled"
         >重新转换
         </el-button>
+        <el-tooltip content="编辑转换规则" placement="top">
         <span
             class="iconfont icon-guizeyingyong"
             @click="dataTable"
         ></span>
+        </el-tooltip>
         <span>需补充转换规则的:{{replenishCount}}</span>
       </section>
     </div>