gbtomr %!s(int64=2) %!d(string=hai) anos
pai
achega
ffa9a78d83

+ 2 - 2
src/apis/ssky.js

@@ -42,7 +42,7 @@ export function GetLdzy() {
 
 export function GetLdkll() {
   return request({
-    url: '/ghjg/kySupRtRtOperation/getLineData',
+    url: '/DigitalTwain/PassengerTraffic/getFerryFlux',
     method: "post",
     data: {
       dataTime: yesday
@@ -52,7 +52,7 @@ export function GetLdkll() {
 
 export function GetThxx() {
   return request({
-    url: 'http://10.83.68.108:8091/ghjgWebServiceTest/DigitalTwain/PassengerTraffic/getDelayLine',
+    url: '/DigitalTwain/PassengerTraffic/getDelayLine',
     method: "post",
     // data: {},
   })

BIN=BIN
src/assets/imgs/header/bg-sw-btn.png


BIN=BIN
src/assets/imgs/header/bg-sw-timepicker.png


+ 32 - 0
src/assets/styles/common.scss

@@ -10,6 +10,9 @@
   font-size: 20px;
   font-family: YSBTH;
   color: #D9EAF5;
+  &.highlight {
+    color: rgb(242, 242, 132);
+  }
 }
 
 .title1-right {
@@ -333,4 +336,33 @@
       filter: brightness(0.7);
     }
   }
+}
+
+// 水深播放倍速弹出
+.speed-content {
+  width: fit-content !important;
+  height: 35px;
+  background-color: rgb(16, 37, 69) !important;
+  border: 1px solid rgba($color: #0084d1, $alpha: 0.7) !important;
+  display: flex;
+  align-items: center;
+  .el-popper__arrow {
+    display: none;
+  }
+  .speed {
+    display: block;
+    width: 40px;
+    height: 22px;
+    margin: 0 5px;
+    background: rgba(0,0,0,0.15);
+    font-size: 14px;
+    font-family: BarlowBold;
+    color: #ddd;
+    text-align: center;
+    line-height: 22px;
+    cursor: pointer;
+    &.selected {
+      background: rgba(48, 131, 182, 0.4);
+    }
+  }
 }

+ 6 - 0
src/components/UeVideo.vue

@@ -63,6 +63,12 @@ export default {
             case 'boat_fock_clear':
               bus.emit('ueRec_boatFockClear',dataObj.data)
               break
+            case 'query_water_finish':
+              bus.emit('ueRec_QueryWaterFinish')
+              break
+            case 'water_finish':
+              bus.emit('ueRec_WaterFinish')
+              break
 
           }
 

+ 87 - 0
src/utils/UIInteractions.js

@@ -13,6 +13,51 @@ export function ueCallFlyToHsx() {
   })
 }
 
+export function ueCallPositionByType(position_type, position_name) {
+  callUIInteraction({
+    "ActionName":"position_by_type",
+    "Parameters": {
+      position_type, position_name
+    }
+  })
+}
+
+export function ueCallShowLine() {
+  callUIInteraction({
+    "ActionName":"show_line"
+  })
+}
+
+export function ueCallCloseLine() {
+  callUIInteraction({
+    "ActionName":"close_line"
+  })
+}
+
+export function ueCallShowMt() {
+  callUIInteraction({
+    "ActionName":"show_mt"
+  })
+}
+
+export function ueCallCloseMt() {
+  callUIInteraction({
+    "ActionName":"close_mt"
+  })
+}
+
+export function ueCallShowLymt() {
+  callUIInteraction({
+    "ActionName":"show_lymt"
+  })
+}
+
+export function ueCallCloseLymt() {
+  callUIInteraction({
+    "ActionName":"close_lymt"
+  })
+}
+
 export function ueCallClickBoat(mmsi) {   //船舶跟随
   callUIInteraction({
     'ActionName': 'click_boat',
@@ -166,3 +211,45 @@ export function ueCallRunOpZhuanhang() {    //浦江游览专航航线模拟暂
     "ActionName":"run_op_zhuanhang"
   })
 }
+
+export function ueCallQueryWater(startTime, endTime) {    // 查询水位数据
+  callUIInteraction({
+    'ActionName':'query_water',
+    'Parameters':{
+      startTime, endTime
+    }
+  })
+}
+
+export function ueCallPlayWater() {    // 开始水位动画
+  callUIInteraction({
+    "ActionName":"play_water"
+  })
+}
+
+export function ueCallStopWater() {    // 停止水位动画
+  callUIInteraction({
+    "ActionName":"stop_water"
+  })
+}
+
+export function ueCallContinueWater() {    // 继续水位动画
+  callUIInteraction({
+    "ActionName":"continue_water"
+  })
+}
+
+export function ueCallResetWater() {    // 重置水位
+  callUIInteraction({
+    "ActionName":"reset_water"
+  })
+}
+
+export function ueCallSetWaterSpeed(speed) {    // 水位播放速度
+  callUIInteraction({
+    "ActionName":"set_water_speed",
+    'Parameters':{
+      speed
+    }
+  })
+}

+ 150 - 4
src/views/home/Header.vue

@@ -35,6 +35,47 @@
         </li>
       </ul>
     </div>
+    <div class="panel-water-deep" v-if="waterDeepShow">
+      <el-date-picker
+        v-model="timeRange.time1"
+        type="datetime"
+        placeholder="请选择"
+        size="small"
+        popper-class="date-popper"
+        class="date-picker-custom1"
+        value-format="YYYY-MM-DD HH:mm:ss"
+        @change="handlePickTime"
+      />
+      <span class="time-select-divider">至</span>
+      <el-date-picker
+        v-model="timeRange.time2"
+        type="datetime"
+        placeholder="请选择"
+        size="small"
+        popper-class="date-popper"
+        class="date-picker-custom1"
+        value-format="YYYY-MM-DD HH:mm:ss"
+        @change="handlePickTime"
+      />
+      <span class="play-btn" :class="{'btn-disabled': playState===-1}" v-show="playState<1" @click="water_play">播放</span>
+      <span class="play-btn" v-show="playState===1||playState===2" @click="water_stop">结束</span>
+      <span class="play-btn" v-show="playState===1" @click="water_pause">暂停</span>
+      <span class="play-btn" v-show="playState===2" @click="water_resume">继续</span>
+      <el-popover
+        placement="bottom"
+        trigger="click"
+        popper-class="speed-content"
+        effect="dark"
+      >
+        <span class="speed" :class="{'selected': playSpeed===1}" @click="water_speed(1)">x1.0</span>
+        <span class="speed" :class="{'selected': playSpeed===2}" @click="water_speed(2)">x2.0</span>
+        <span class="speed" :class="{'selected': playSpeed===3}" @click="water_speed(3)">x3.0</span>
+        <template #reference>
+          <span class="play-btn" :class="{'btn-disabled': playState===-1}">倍速调整</span>
+        </template>
+      </el-popover>
+
+    </div>
 
   </div>
 </template>
@@ -51,6 +92,10 @@ export default {
   import bus from '@/utils/bus'
   import { GetWeather } from '@/apis/other'
   import { ueCallfullExtent } from '@/utils/UIInteractions'
+  import { ElDatePicker, ElPopover } from 'element-plus'
+  import 'element-plus/es/components/date-picker/style/css'
+  import 'element-plus/es/components/popover/style/css'
+  import { ueCallQueryWater, ueCallPlayWater, ueCallStopWater, ueCallContinueWater, ueCallResetWater, ueCallSetWaterSpeed } from '@/utils/UIInteractions'
 
   onMounted(() => [
     getWeather()
@@ -74,9 +119,9 @@ export default {
 
   const subList = reactive([
     { name: '码头', status: false },
-    { name: '航道', status: true },
-    { name: '岸线', status: false },
-    { name: '船舶', status: false },
+    { name: '航道', status: false },
+    { name: '水深', status: false },
+    { name: '船舶', status: true },
     { name: '视频', status: false },
     { name: '水下地形', status: false },
   ])
@@ -85,12 +130,21 @@ export default {
     subList[index].status = !subList[index].status
     if(subList[index].status===true) {
       switch(index) {
+        case 2:
+          timeRange.time1 = useDateFormat((new Date).getTime() - 24 * 60 * 60 * 1000, 'YYYY-MM-DD HH:mm:00').value
+          timeRange.time2 = useDateFormat((new Date).getTime(), 'YYYY-MM-DD HH:mm:00').value
+          handlePickTime()
+          waterDeepShow.value = true
+          break
         case 5:
           bus.emit('toggle_sxdx', true)
           break
       }
     } else {
       switch(index) {
+        case 2:
+          waterDeepShow.value = false
+          break
         case 5:
           bus.emit('toggle_sxdx', false)
           break
@@ -99,11 +153,57 @@ export default {
   }
 
   const temperature = ref('8')
-  const humidity = ref('77')
   const time = useDateFormat(useNow(), 'HH:mm')
   const date = useDateFormat(useNow(), 'YYYY.MM.DD')
   const day = useDateFormat(useNow(), 'ddd', { locales: 'en-US' })
 
+  const waterDeepShow = ref(false)
+
+  const timeRange = reactive({
+    time1: '',
+    time2: ''
+  })
+
+  const playSpeed = ref(1)
+  const playState = ref(0)    /* 0--未开始/已结束; 1--播放中; 2--已暂停; -1--禁用状态 */
+
+  function handlePickTime() {
+    if(timeRange.time1&&timeRange.time2) {
+      playState.value = -1
+      ueCallQueryWater(timeRange.time1, timeRange.time2)
+    }
+  }
+
+  bus.on('ueRec_WaterFinish', () => {
+    playState.value = 0
+    ueCallResetWater()
+  })
+
+  bus.on('ueRec_QueryWaterFinish', () => {
+    playState.value = 0
+  })
+
+  function water_speed(s) {
+    playSpeed.value = s
+    ueCallSetWaterSpeed(playSpeed.value)
+  }
+  function water_play() {
+    ueCallPlayWater()
+    playState.value = 1
+  }
+  function water_stop() {
+    ueCallResetWater()
+    playState.value = 0
+  }
+  function water_pause() {
+    ueCallStopWater()
+    playState.value = 2
+  }
+  function water_resume() {
+    ueCallContinueWater()
+    playState.value = 1
+  }
+
 </script>
 
 <style lang="scss" scoped>
@@ -623,5 +723,51 @@ export default {
     } */
 
   }
+
+  .panel-water-deep {
+    position: absolute;
+    height: 40px;
+    bottom: -10px;
+    left: 50%;
+    transform: translateX(-50%);
+    display: flex;
+    align-items: center;
+
+    .time-select-divider {
+      margin: 0 10px;
+      font-size: 16px;
+    }
+
+    .play-btn {
+      width: 100px;
+      height: 40px;
+      margin-left: 10px;
+      background: url('../../assets/imgs/header/bg-sw-btn.png');
+      background-size: 100% 100%;
+      cursor: pointer;
+      line-height: 40px;
+      font-size: 18px;
+      font-family: YSBTH;
+      color: #a9c1d8;
+      &.btn-disabled {
+        filter: brightness(0.5);
+        cursor: not-allowed;
+      }
+    }
+
+    :deep(.date-picker-custom1) {
+      height: 40px;
+      .el-input__wrapper {
+        box-sizing: border-box;
+        width: 209px;
+        height: 40px;
+        padding-left: 20px;
+        border: none;
+        background: url('../../assets/imgs/header/bg-sw-timepicker.png');
+        background-size: 100% 100%;
+      }
+    }
+    
+  }
 }
 </style>

+ 1 - 0
src/views/home/Tab.vue

@@ -438,6 +438,7 @@ export default {
       bottom: 16px;
       width: 35px;
       height: 59px;
+      cursor: pointer;
       &.scroll-left {
         left: 70px;
         background: url('../../assets/imgs/navi/sxdx-arrow-left.png');

+ 4 - 0
src/views/kkjk/cpns/BoatInfo.vue

@@ -122,6 +122,7 @@ export default {
   import 'element-plus/es/components/carousel-item/style/css'
   import bus from '@/utils/bus'
   import { ueCallBoatGuiji, ueCallSetBoatDriveSpeed, ueCallBoatDrive, ueCallBoatCloseDrive, ueCallBoatStop, ueCallBoatContinue } from '@/utils/UIInteractions'
+  import { useDateFormat } from '@vueuse/core'
 
   const props = defineProps(['boat-info'])
   const boatDetail = reactive({value: {
@@ -165,6 +166,9 @@ export default {
             sjrhData.RFID = +i
         }
       })
+      timeRange.time1 = useDateFormat((new Date).getTime() - 30 * 60 * 1000, 'YYYY-MM-DD HH:mm:00').value
+      timeRange.time2 = useDateFormat((new Date).getTime(), 'YYYY-MM-DD HH:mm:00').value
+      handlePickTime()
     })
   },{immediate:true})
 

+ 21 - 14
src/views/ssky/Index.vue

@@ -151,7 +151,10 @@ export default {
   import bus from '@/utils/bus'
   import BoatInfoPjyl from './cpns/BoatInfoPjyl.vue'
   import BoatInfo from './cpns/BoatInfo.vue'
-  import { ueCallCloseBoat, ueCallClickBoat } from '@/utils/UIInteractions'
+  import {
+    ueCallCloseBoat, ueCallClickBoat,
+    ueCallShowLine, ueCallCloseLine, ueCallShowMt, ueCallCloseMt, ueCallShowLymt, ueCallCloseLymt
+  } from '@/utils/UIInteractions'
 
   let timer
 
@@ -176,9 +179,6 @@ export default {
   const boatDockListShow = ref(false)
 
   function handleBDListShow(name) {
-    // if(name.indexOf('ldzy')!==-1 && name!==boatDockListShow.value) {
-    //   bus.emit('hideToolBox');
-    // }
     boatDockListShow.value = boatDockListShow.value===name? false: name
   }
 
@@ -243,7 +243,13 @@ export default {
       ldklData.value.forEach(i => {
         i.value = res.data[i.fieldName]
       })
-      ldklLineData.value = res.data.lineList
+      let ldklLineTemp = []
+      res.data.lineList.forEach((row,index) => {
+        if(index%2!==0) {
+          ldklLineTemp.push(row)
+        }
+      })
+      ldklLineData.value = ldklLineTemp
       nextTick(() => {
         ldklListScroll()
       })
@@ -258,8 +264,8 @@ export default {
   ]})
 
   const ldklLineData = reactive({value: [
-    {name: "-", num1: "0", num2: "0", num3: "0", sum: "0"},
-    {name: "-", num1: "0", num2: "0", num3: "0", sum: "0"},
+    {name: "-", walkingCount: "0", bicycleCount: "0", motorCount: "0", count: "0"},
+    {name: "-", walkingCount: "0", bicycleCount: "0", motorCount: "0", count: "0"},
   ]})
 
   function ldklListScroll() {
@@ -347,9 +353,9 @@ export default {
   function handleLineClick() {
     lineSelected.value = !lineSelected.value
     if(lineSelected.value) {
-      lineOn()
+      ueCallShowLine()
     } else {
-      lineOff()
+      ueCallCloseLine()
     }
   }
 
@@ -358,9 +364,9 @@ export default {
   function handlePjylClick() {
     pjylSelected.value = !pjylSelected.value
     if(pjylSelected.value) {
-      lymtOn()
+      ueCallShowLymt()
     } else {
-      lymtOff()
+      ueCallCloseLymt()
     }
   }
 
@@ -369,9 +375,9 @@ export default {
   function handleDjldClick() {
     djldSelected.value = !djldSelected.value
     if(djldSelected.value) {
-      mtOn()
+      ueCallShowMt()
     } else {
-      mtOff()
+      ueCallCloseMt()
     }
   }
 
@@ -789,7 +795,8 @@ export default {
         top: 0;
       }
       &.highlight {
-        border: 2px solid yellow;
+        border: 2px solid rgba(254, 254, 56, 0.5);
+        filter: contrast(1.3);
       }
     }
   }

+ 21 - 3
src/views/ssky/cpns/BoatDockList.vue

@@ -4,7 +4,7 @@
     <span class="title-dialog">{{props.listTitle}}</span>
     <template v-if="props.listData.length>0">
       <ul class="boat-list" v-if="props.listData[0].mmsi" ref="list">
-        <li v-for="item, index in listSlice.value" class="list-item">
+        <li v-for="item, index in listSlice.value" class="list-item" @click="handleClick(item)">
           <span>{{ formatIndex(index+1) }}</span>
           <div>
             <span>{{item.shipName}}</span>
@@ -14,7 +14,7 @@
         </li>
       </ul>
       <ul class="dock-list" v-else ref="list">
-        <li v-for="item, index in listSlice.value" class="list-item">
+        <li v-for="item, index in listSlice.value" class="list-item" @click="handleClick(item)">
           <span>{{ formatIndex(index+1) }}</span>
           <span>{{item.pierName}}</span>
         </li>
@@ -36,9 +36,9 @@ export default {
 </script>
 
 <script setup>
-
   import { defineProps, onMounted, reactive, ref } from 'vue'
   import { useInfiniteScroll } from '@vueuse/core'
+  import { ueCallPositionByType } from '@/utils/UIInteractions'
 
   const props = defineProps(['list-data', 'list-title'])
 
@@ -70,6 +70,24 @@ export default {
     { distance: 10 }
   )
 
+  function handleClick(item) {
+    let position_type; let position_name;
+    switch(props.listTitle) {
+      case '码头信息':
+        position_type = 'lymt'
+        position_name = item.pierName
+        break
+      case '渡口信息':
+        position_type = 'mt'
+        position_name = item.pierName
+        break
+      default:
+        position_type = 'boat'
+        position_name = item.mmsi
+    }
+    ueCallPositionByType(position_type, position_name)
+  }
+
   const emit = defineEmits(['closeBoatList'])
 
   function handleClose() {

+ 5 - 2
src/views/ssky/cpns/BoatInfo.vue

@@ -78,6 +78,7 @@ export default {
   import { ElDatePicker } from 'element-plus'
   import 'element-plus/es/components/date-picker/style/css'
   import bus from '@/utils/bus';
+  import { useDateFormat } from '@vueuse/core'
 
   const props = defineProps(['boat-info'])
 
@@ -131,8 +132,10 @@ export default {
     ueCallBoatContinue()
   }
 
-  watch(()=>props.entData, (n, o) => {
-    
+  watch(()=>props.boatInfo, (val) => {
+    timeRange.time1 = useDateFormat((new Date).getTime() - 30 * 60 * 1000, 'YYYY-MM-DD HH:mm:00').value
+    timeRange.time2 = useDateFormat((new Date).getTime(), 'YYYY-MM-DD HH:mm:00').value
+    handlePickTime()
   }, { immediate: true })
 
   const emit = defineEmits(['closeBoatInfo'])

+ 7 - 3
src/views/ssky/cpns/BoatInfoPjyl.vue

@@ -111,11 +111,12 @@ export default {
     ueCallInitAll, ueCallFindJinghua, ueCallRunJinghua, ueCallRunOpJinghua, ueCallFindZhuanhang, ueCallRunZhuanhang, ueCallRunOpZhuanhang,
     ueCallCloseBoat
   } from '@/utils/UIInteractions'
-
+  import { useDateFormat } from '@vueuse/core'
+  
   const props = defineProps(['boat-info'])
-
+  
   const currentTab = ref('cbxx')
-
+  
   const timeRange = reactive({
     time1: '',
     time2: ''
@@ -243,6 +244,9 @@ export default {
   watch(()=>props.boatInfo.mmsi, (val) => {
     GetLshb(val).then(res => {
       historyList.value = res.data.Rows.slice(0,4)
+      timeRange.time1 = useDateFormat((new Date).getTime() - 30 * 60 * 1000, 'YYYY-MM-DD HH:mm:00').value
+      timeRange.time2 = useDateFormat((new Date).getTime(), 'YYYY-MM-DD HH:mm:00').value
+      handlePickTime()
     })
   }, { immediate: true })
 

+ 3 - 3
src/views/ssky/cpns/ListBoxLdkll.vue

@@ -10,15 +10,15 @@
       </div>
       <div>
         <i class="icon icon-xr"></i>
-        <span>--</span>
+        <span>{{props.listData.walkingCount}}</span>
       </div>
       <div>
         <i class="icon icon-llc"></i>
-        <span>--</span>
+        <span>{{props.listData.bicycleCount}}</span>
       </div>
       <div>
         <i class="icon icon-slc"></i>
-        <span>--</span>
+        <span>{{props.listData.motorCount}}</span>
       </div>
     </div>
   </div>

+ 4 - 2
src/views/yyjg/Index.vue

@@ -317,7 +317,7 @@ export default {
     GetWggj().then(res => {
       listData_wggj.data.forEach(i => {
         i.value = res.data[i.fieldName]
-        if(i.value_ent) {
+        if('value_ent' in i) {
           i.value_ent = res.data['overGradeUnit']
         }
       })
@@ -360,7 +360,9 @@ export default {
     GetCbwgyj().then(res => {
       listData_cdjkb.ship = res.data.Rows
     })
-    entWarningListShow.value = false
+    if(entWarningListShow.value===true) {
+      handleCloseWarningEnt()
+    }
     shipWarningListShow.value = true
   }
 

+ 1 - 0
src/views/yyjg/cpns/WarningShipList.vue

@@ -78,6 +78,7 @@ export default {
     box-sizing: border-box;
     margin-top: 18px;
     overflow-y: auto;
+    padding-right: 10px;
 
     .list-item {
       display: flex;