cuiqian2004
2025-09-25 9efd4a80aae58cf36266e774d3c820cc8e115028
pages/map/index.vue
@@ -33,7 +33,9 @@
            v-model:opSceneType="opSceneType" @create-ok="onCreateSceneOk"></SceneCreateInfo> -->
         <view class="map-content" v-show="mapOperationType !='scene_create'">
            <view class="content">
               <view class="fabric" :message="ctxDataStr" :change:message="ctx.receiveMsg" id="canvasMap"></view>
               <view ref="canvasCtx" class="fabric" id="canvasMap" :message="ctxDataStr"
                  :change:message="ctx.receiveMsg">
               </view>
               <view class="loading-overlay" v-if="bgLoading">
                  <view class="loading-content">
                     <view class="loading-spinner"></view>
@@ -386,13 +388,16 @@
   </view>
</template>
<script src="./js/ctx.js" module="ctx" lang="renderjs"></script>
<script>
   import {
      ref
   } from "vue";
   import {
      showToast,
      showModal,
      session,
      showError,
      showInfo
   } from "@/comm/utils.js"
   // import OIFabric from "@/components/oi-fabric/index.vue"
   import {
@@ -438,6 +443,7 @@
               list: []
            },
            sceneList: [],
            ctxDataStr: "[]",
            mapOperationType: "",
            mapOperationStatus: "",
@@ -480,6 +486,9 @@
               img_x: 1,
               img_y: 1
            },
            positioningAgv: false,
            isPageVisible: true,
            destroyFlag: false,
         }
      },
      computed: {
@@ -536,10 +545,29 @@
      },
      onHide() {
         this.isPageVisible = false
      },
      onUnload() {
      async onUnload() {
         this.isPageVisible = false
         console.log("onUnload")
      },
      onBackPress() {
            this.isPageVisible = false
         if (this.destroyFlag)
            return false
         else {
            this.ctxDataStr = JSON.stringify([{
               method: "destroy",
            }])
            return true
         }
      },
      methods: {
         setData(obj) {
            let that = this;
@@ -575,11 +603,15 @@
               this.setData({
                  unlinked: true
               })
               this.showError(ex)
               showError(ex)
            }
         },
         clickShowMenu() {
            // const list = [...this.sceneList]
            // for(let i =0; i < 20;i++){
            //    list.push("test" + i)
            // }
            this.menuPopup = {
               type: "scene",
               list: this.sceneList,
@@ -719,11 +751,12 @@
                  showModal("已记录的路径将会被删除。", "是否要退出示教?").then(async (res) => {
                     if (res) {
                        if (mapOperationStatus == 'end' || mapOperationStatus == 'save') {
                        if (this.mapOperationStatus == 'end' || this.mapOperationStatus ==
                           'save') {
                           try {
                              await delTeachingMode(this.vehicleIp, [_this.teachingModeCur])
                              await delTeachingMode(this.vehicleIp, [this.teachingModeCur])
                           } catch (ex) {
                              this.showError(ex)
                              showError(ex)
                           }
                        }
@@ -782,7 +815,7 @@
                  // this.mapOperationType = 'scene_create'
                  // this.opSceneType = 'add_name'
                  uni.navigateTo({
                     url: `/pages/map/scene?ip=${this.vehicleIp}`,
                     url: `/pages/map/scene?ip=${_this.vehicleIp}`,
                     events: {
                        // 为指定事件添加一个监听器,获取被打开页面传送到当前页面的数据
                        create_finish: function(data) {
@@ -806,7 +839,7 @@
               const info = await getAgvState(this.vehicleIp)
               return info
            } catch (ex) {
               this.showError(ex)
               showError(ex)
               return {}
            }
         },
@@ -815,7 +848,7 @@
               const paths = await getCurrentTeachingData(this.vehicleIp) || []
               return paths
            } catch (ex) {
               this.showError(ex)
               showError(ex)
               return []
            }
         },
@@ -825,7 +858,7 @@
               const info = await stations(this.vehicleIp)
               return info.station_list || []
            } catch (ex) {
               this.showError(ex)
               showError(ex)
               return []
            }
         },
@@ -834,7 +867,7 @@
               const info = await getMapUrl(this.vehicleIp, id)
               return info
            } catch (ex) {
               this.showError(ex)
               showError(ex)
               return {}
            }
         },
@@ -864,20 +897,21 @@
            try {
               this.setData({
                  bgProgressPercent: 0,
                  bgLoading: true
               })
               const infoAgv = await this.loadAgvState()
               const stationLst = await this.loadStations()
               const infoMap = await this.loadMapInfo(id)
               this.curMapInfo = {
                  proportion: infoMap.proportion || 1,
                  img_proportion: infoMap.img_proportion || 1,
                  max_x: infoMap.max_x || 1,
                  max_y: infoMap.max_y || 1,
                  min_x: infoMap.min_x || 0,
                  min_y: infoMap.min_y || 0,
                  img_x: infoMap.img_x || 1,
                  img_y: infoMap.img_y || 1
                  proportion: parseInt(infoMap.proportion) || 1,
                  img_proportion: parseInt(infoMap.img_proportion) || 1,
                  max_x: parseInt(infoMap.max_x) || 1,
                  max_y: parseInt(infoMap.max_y) || 1,
                  min_x: parseInt(infoMap.min_x) || 0,
                  min_y: parseInt(infoMap.min_y) || 0,
                  img_x: parseInt(infoMap.img_x) || 1,
                  img_y: parseInt(infoMap.img_y) || 1
               }
               // getApp().globalData.curScene = infoMap
               this.setData({
@@ -905,35 +939,49 @@
                  },
                  {
                     method: "public_teaching_path",
                     param: this.teachingMode.Public || []
                     param: {
                        list: this.teachingMode.Public || [],
                        show: this.showTeachingPathFlag
                     }
                  },
                  {
                     method: "station_teaching_path",
                     param: this.teachingMode.Stations || []
                     param: {
                        list: this.teachingMode.Stations || [],
                        show: this.showTeachingPathFlag
                     }
                  },
                  {
                     method: "move_canvas",
                     method: "move_pt_center",
                     param: {
                        x: infoAgv.x,
                        y: infoAgv.y
                     }
                  }
               ])
               this.positioningAgv = true
               this.mapShowAgv = true
            } catch (ex) {
               this.setData({
                  bgProgressPercent: 0,
                  bgLoading: false
               })
               this.showError(ex)
               showError(ex)
            }
         },
         receiveRenderData(param) {
            console.log('接收到视图层的数据:', param);
            if (param.method == "set_backgroud_progress") {
            if (param.method === "destroy_complete") {
               if (param.param) {
                  this.destroyFlag = true
                  uni.navigateBack({
                     delta: 1
                  })
               }
            } else if (param.method == "set_backgroud_progress") {
               if (param.type == "start") {
                  this.setData({
                     bgProgressPercent: 50,
@@ -1086,7 +1134,14 @@
               }
               this.$refs.refPopupOperateTeaching.open("bottom")
            } else if (param.method == "cancel_positioning_agv") {
               this.positioningAgv = false
            } else if (param.method == "show_log") {
               const listLog = session.getValue("request_log") || []
               listLog.unshift(param.data)
               session.setValue("request_log", listLog)
            }
         },
         clickMapStation() {
@@ -1116,6 +1171,7 @@
            this.mapOperationType = "edit_map"
         },
         clickExtendMap() {
            const _this = this
            uni.navigateTo({
               url: `/pages/map/scene?ip=${this.vehicleIp}&opType=extend&sceneId=${this.sceneId}`,
               events: {
@@ -1138,11 +1194,9 @@
               mode: "Public",
               main_road: 1,
            }
            this.positioningAgv = true
            this.mapOperationType = "public_teaching"
            this.ctxDataStr = JSON.stringify([{
               method: "set_selectable",
               param: false,
            }, {
               method: "public_teaching",
            }])
@@ -1159,6 +1213,7 @@
         },
         async loadSceneList() {
            try {
               uni.showLoading({
                  title: "加载场景中"
               })
@@ -1190,7 +1245,7 @@
               }
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            } finally {
               uni.hideLoading()
            }
@@ -1208,7 +1263,7 @@
                     if (this.sceneList.length > 0)
                        this.changeMap(this.sceneList[0])
                  } catch (ex) {
                     this.showError(ex)
                     showError(ex)
                  } finally {
                     uni.hideLoading()
                  }
@@ -1263,7 +1318,7 @@
                        param: [this.regionEdit]
                     },
                     {
                        method: "move_canvas",
                        method: "move_pt_center",
                        param: {
                           x: agv.x,
                           y: agv.y
@@ -1272,7 +1327,7 @@
                  ])
               }
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
         async clickPlanProhibitionRegion() {
@@ -1309,7 +1364,7 @@
                        param: [this.regionEdit]
                     },
                     {
                        method: "move_canvas",
                        method: "move_pt_center",
                        param: {
                           x: agv.x,
                           y: agv.y
@@ -1318,7 +1373,7 @@
                  ])
               }
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
@@ -1350,7 +1405,7 @@
                     param: [this.wallEdit]
                  },
                  {
                     method: "move_canvas",
                     method: "move_pt_center",
                     param: {
                        x: agv.x,
                        y: agv.y
@@ -1358,7 +1413,7 @@
                  }
               ])
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
@@ -1387,7 +1442,7 @@
               showToast("场景重命名成功!")
            } catch (ex) {
               this.mapOperationType = "edit_scene_name"
               this.showError(ex)
               showError(ex)
            } finally {
               uni.hideLoading()
               this.loading = false
@@ -1416,12 +1471,13 @@
            this.mapOperationType = ""
         },
         clickStationDelete() {
            const _this = this
            showModal("该站点已绑定任务,删除站点后绑定的任务会停止并删除", "是否确认删除?").then((res) => {
               if (res) {
                  this.stationDelete(this.stationEdit)
               }
            })
            this.stationDelete(this.stationEdit)
            // const _this = this
            // showModal("该站点已绑定任务,删除站点后绑定的任务会停止并删除", "是否确认删除?").then((res) => {
            //    if (res) {
            //    }
            // })
         },
         async stationAdd(item) {
            try {
@@ -1440,7 +1496,7 @@
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            } finally {
               uni.hideLoading()
            }
@@ -1463,7 +1519,7 @@
               }
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            } finally {
               uni.hideLoading()
            }
@@ -1477,6 +1533,7 @@
                  this.stationAdd(this.stationEdit)
                  this.mapOperationType = "public_teaching"
                  this.mapOperationStatus = "teaching"
                  this.positioningAgv = true
                  return
               } else if (this.mapOperationType == "edit_station") {
                  this.stationUpdate(this.stationEdit)
@@ -1487,7 +1544,7 @@
               }])
               this.mapOperationType = ''
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
         async stationDelete(item) {
@@ -1514,7 +1571,7 @@
               }])
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            } finally {
               uni.hideLoading()
            }
@@ -1559,14 +1616,14 @@
         },
         async clickStationNameOK() {
            try {
               this.loading = true
               const name = this.stationEdit.name.trim()
               if (!name) {
                  showToast("站点名称还未输入")
                  return
               }
               if (this.mapOperationType == 'add_station' || this
                  .mapOperationType == "teaching_add_station") {
               this.loading = true
               if (this.mapOperationType == 'add_station' || this.mapOperationType == "teaching_add_station") {
                  const agv = await this.loadAgvState()
                  this.stationEdit = {
                     stationID: this.getMaxStationNo + 1,
@@ -1589,7 +1646,7 @@
                     method: "edit_station_pos",
                     param: this.stationEdit
                  }, {
                     method: "move_canvas",
                     method: "move_pt_center",
                     param: {
                        x: agv.x,
                        y: agv.y
@@ -1613,7 +1670,7 @@
               }
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            } finally {
               this.loading = false
            }
@@ -1639,7 +1696,7 @@
               method: "update_station",
               param: [this.stationEdit]
            }, {
               method: "move_canvas",
               method: "move_pt_center",
               param: {
                  x: this.stationEdit.x,
                  y: this.stationEdit.y
@@ -1654,7 +1711,7 @@
               method: "update_station",
               param: [this.stationEdit]
            }, {
               method: "move_canvas",
               method: "move_pt_center",
               param: {
                  x: this.stationEdit.x,
                  y: this.stationEdit.y
@@ -1667,7 +1724,7 @@
               method: "update_station",
               param: [this.stationEdit]
            }, {
               method: "move_canvas",
               method: "move_pt_center",
               param: {
                  x: this.stationEdit.x,
                  y: this.stationEdit.y
@@ -1680,7 +1737,7 @@
               method: "update_station",
               param: [this.stationEdit]
            }, {
               method: "move_canvas",
               method: "move_pt_center",
               param: {
                  x: this.stationEdit.x,
                  y: this.stationEdit.y
@@ -1766,19 +1823,20 @@
         async clickVehiclePosition() {
            try {
               this.positioningAgv = true
               const infoAgv = await this.loadAgvState()
               this.ctxDataStr = JSON.stringify([{
                  method: "update_agv_state",
                  param: infoAgv
               }, {
                  method: "move_canvas",
                  method: "move_pt_center",
                  param: {
                     x: infoAgv.x,
                     y: infoAgv.y
                  }
               }])
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
         async clickPositionStation() {
@@ -1801,7 +1859,7 @@
                     param: [this.stationEdit]
                  },
                  {
                     method: "move_canvas",
                     method: "move_pt_center",
                     param: {
                        x: infoAgv.x,
                        y: infoAgv.y
@@ -1811,7 +1869,7 @@
               ])
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
         async loadTeachingMode() {
@@ -1825,33 +1883,50 @@
               }
            } catch (ex) {
               this.showError(ex)
               showError(ex)
               return {
                  Public: [],
                  Stations: []
               }
            }
         },
         async reloadTeachingMode() {
         async reloadTeachingMode(finish) {
            try {
               this.teachingMode = await this.loadTeachingMode()
               this.ctxDataStr = JSON.stringify([{
               const list = [{
                     method: "clear_teaching_path",
                  },
                  {
                     method: "public_teaching_path",
                     param: this.teachingMode.Public || []
                     param: {
                        list: this.teachingMode.Public || [],
                        show: this.showTeachingPathFlag
                     }
                  },
                  {
                     method: "station_teaching_path",
                     param: this.teachingMode.Stations || []
                  }, {
                     method: "show_teaching_path",
                     param: {
                        list: this.teachingMode.Stations || [],
                        show: this.showTeachingPathFlag
                     }
                  }
               ])
                  // , {
                  //    method: "show_teaching_path",
                  //    param: {
                  //       show: this.showTeachingPathFlag
                  //    }
                  // }
               ]
               if (finish) {
                  list.push({
                     method: "teaching_finish",
                  })
               }
               this.ctxDataStr = JSON.stringify(list)
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
@@ -1893,14 +1968,13 @@
                  }
               ])
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
         async refreshAgvPosition() {
            try {
               if (this.isPageVisible && this.mapShowAgv) {
                  const agv = await this.loadAgvState()
                  const listCtrData = [{
                     method: "update_agv_state",
                     param: agv
@@ -1917,13 +1991,28 @@
                        }
                     })
                  }
                  if (this.positioningAgv) {
                     listCtrData.push({
                        method: "move_pt_visible",
                        param: {
                           x: agv.x,
                           y: agv.y,
                           width: 80,
                           height: 80,
                        }
                     })
                  }
                  this.ctxDataStr = JSON.stringify(listCtrData)
               }
               setTimeout(this.refreshAgvPosition, 1000);
            } catch (ex) {
               this.showError(ex)
               showError(ex).then((res) => {
                  setTimeout(this.refreshAgvPosition, 1000);
               })
            } finally {
               // 无论成功失败,1 秒后再来
               setTimeout(this.refreshAgvPosition, 1000);
            }
         },
@@ -1946,12 +2035,11 @@
               uni.showLoading({
                  title: "示教结束"
               })
               await teachingModeFlag(this.vehicleIp,
                  teachingMode)
               await teachingModeFlag(this.vehicleIp, teachingMode)
               this.mapOperationStatus = "end"
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            } finally {
               uni.hideLoading()
            }
@@ -1969,7 +2057,7 @@
               await _this.teachingStart("Public")
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            } finally {
               this.loading = false
               uni.hideLoading()
@@ -1996,7 +2084,7 @@
                        _this.mapOperationStatus = ""
                     } catch (ex) {
                        this.showError(ex)
                        showError(ex)
                     } finally {
                        this.loading = false
                     }
@@ -2013,16 +2101,14 @@
            this.mapOperationStatus = "save"
            try {} catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
         clickTeachingFinish() {
            this.mapOperationType = ""
            this.ctxDataStr = JSON.stringify([{
               method: "teaching_finish",
            }])
            this.reloadTeachingMode()
            this.reloadTeachingMode(true)
         },
         async teachingStart(mode) {
@@ -2071,7 +2157,7 @@
               }
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
@@ -2094,41 +2180,27 @@
                  .teachingModeCur
               )
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            } finally {
               this.loading = false
            }
         },
         async onTeachingModeMainRoad(
            val) {
         async onTeachingModeMainRoad(val) {
            try {
               if (this
                  .mapOperationStatus
               ) {
               if (this.mapOperationStatus) {
                  if (this
                     .teachingModeCur
                     .main_road ==
                     val) {
                  if (this.teachingModeCur.main_road == val) {
                     return
                  }
                  this.teachingModeCur
                     .main_road =
                     val
                  this.teachingModeCur
                     .teaching_flag =
                     1
                  this.teachingModeCur
                     .mode =
                     "Public"
                  const res =
                     await teachingModeFlag(
                        this
                        .vehicleIp,
                        this
                        .teachingModeCur
                     )
                  this.teachingModeCur.teaching_flag = 0
                  const oldName = this.teachingModeCur.name
                  await teachingModeFlag(this.vehicleIp, this.teachingModeCur)
                  this.teachingModeCur.main_road = val
                  this.teachingModeCur.teaching_flag = 1
                  this.teachingModeCur.mode = "Public"
                  this.teachingModeCur.name = ""
                  const res = await teachingModeFlag(this.vehicleIp, this.teachingModeCur)
                  if (val == 0)
                     showToast(
                        "已将该路段路径保存为主路示教路线"
@@ -2138,10 +2210,27 @@
                        "已将该路段路径保存为支路示教路线"
                     )
                  if (res?.name)
                     this
                     .teachingModeCur
                     .name = res
                     .name
                     this.teachingModeCur.name = res.name
                  const {
                     data
                  } = await getTeachingMode(this.vehicleIp)
                  const publicList = data.Public || []
                  const curIndex = publicList.findIndex((a) => a.name == oldName)
                  if (curIndex > -1) {
                     this.ctxDataStr = JSON.stringify([{
                        method: "public_teaching_path",
                        param: {
                           list: [publicList[curIndex]],
                           show: true
                        }
                     }])
                  }
               } else {
                  this.teachingModeCur
                     .main_road =
@@ -2149,7 +2238,7 @@
               }
            } catch (ex) {
               this.showError(ex)
               showError(ex)
            }
         },
         clickTeachingDelete() {
@@ -2188,7 +2277,7 @@
                        param: item,
                     }])
            } catch (ex) {
               this.showError(
               showError(
                  ex)
            } finally {
               uni.hideLoading()
@@ -2202,24 +2291,11 @@
               await delTeachingModeData(this.vehicleIp, data)
               this.reloadTeachingMode()
            } catch (ex) {
               this.showError(
                  ex)
               showError(ex)
            } finally {
               uni.hideLoading()
            }
         },
         showError(ex) {
            let exStr = JSON.stringify(ex)
            if (exStr == "{}")
               exStr = ex
            let tip = typeof ex.msg == "string" ? ex.msg : typeof ex.errMsg == "string" ? ex.errMsg : exStr
            showModal(tip,
               "错误",
               false,
               "确定")
         },
      }
   }
@@ -2687,6 +2763,8 @@
         margin-top: 140rpx;
         margin-left: 225rpx;
         width: 300rpx;
         max-height: 50vh;
         overflow: auto;
         align-items: center;
         justify-content: center;
         flex-direction: column;