From c5542acf1dcd86b03ebff0ca7cfef212cb847fb2 Mon Sep 17 00:00:00 2001
From: doum <doum>
Date: 星期五, 06 三月 2026 10:08:09 +0800
Subject: [PATCH] 更改头部

---
 admin/src/views/business/deviceDianbiao.vue                                                                                |  186 ++++++++++
 server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/SensorStatusStatisticResponse.java |   12 
 server/visits/device_service/src/main/java/com/doumee/tcp/WaterElectricityUtil.java                                        |  507 ++++++++++++++++++++++++++++
 screen/src/assets/images/default_nowarning.png                                                                             |    0 
 server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/response/WmsCarInParkDataResponse.java               |   27 +
 admin/src/views/business/screenBoard.vue                                                                                   |  328 ++++++++++++++++++
 server/startsh/service_start.sh                                                                                            |   13 
 7 files changed, 1,073 insertions(+), 0 deletions(-)

diff --git a/admin/src/views/business/deviceDianbiao.vue b/admin/src/views/business/deviceDianbiao.vue
new file mode 100644
index 0000000..f1483af
--- /dev/null
+++ b/admin/src/views/business/deviceDianbiao.vue
@@ -0,0 +1,186 @@
+<template>
+    <TableLayout :permissions="['business:device:query']">
+        <!-- 鎼滅储琛ㄥ崟 -->
+        <el-form ref="searchForm"  slot="search-form" :model="searchForm" label-width="100px" inline>
+            <el-form-item title="鍚嶇О" prop="name">
+                <el-input v-model="searchForm.name" placeholder="璇疯緭鍏ュ悕绉�" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item title="鏍囪瘑绗�" prop="no">
+                <el-input v-model="searchForm.no" placeholder="璇疯緭鍏ヨ澶囨爣璇嗙" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <el-form-item title="璁惧鍙�" prop="doorNo">
+                <el-input v-model="searchForm.doorNo" placeholder="璇疯緭鍏ヨ澶囧彿" @keypress.enter.native="search"></el-input>
+            </el-form-item>
+            <section>
+                <el-button type="primary" @click="search">鎼滅储</el-button>
+                <el-button @click="reset">閲嶇疆</el-button>
+            </section>
+        </el-form>
+        <!-- 琛ㄦ牸鍜屽垎椤� -->
+        <template v-slot:table-wrap>
+          <ul class="toolbar" v-permissions="['business:device:create', 'business:device:delete']">
+            <li><el-button type="primary" @click="$refs.operaDeviceWindow.open('鏂板缓鐢佃〃')" icon="el-icon-plus" v-permissions="['business:device:create']">鏂板缓</el-button></li>
+            <li><el-button @click="deleteByIdInBatch" icon="el-icon-delete" v-permissions="['business:device:delete']">鍒犻櫎</el-button></li>
+          </ul>
+            <el-table
+                :height="tableHeightNew"
+                v-loading="isWorking.search"
+                :data="tableData.list"
+                stripe >
+              <el-table-column type="selection" width="55"></el-table-column>
+              <el-table-column prop="name" label="鍚嶇О" fixed min-width="150" align="center"></el-table-column>
+              <el-table-column prop="no" label="鐢佃〃鍦板潃鍩�" min-width="100" align="center" ></el-table-column>
+              <el-table-column prop="doorNo" label="璁惧鍙�"  min-width="120" align="center" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="channelNo" label="寮�鍏冲簭鍙�" align="center" min-width="100"></el-table-column>
+              <el-table-column prop="manufature" label="鍘傚晢" align="center" min-width="100" show-overflow-tooltip></el-table-column>
+              <el-table-column prop="regionPathName" align="center"  min-width="100" label="鎵�鍦ㄤ綅缃�"></el-table-column>
+              <el-table-column prop="ip" label="IP"  min-width="150" align="center" show-overflow-tooltip ></el-table-column>
+              <el-table-column prop="port" label="绔彛" align="center"  ></el-table-column>
+              <el-table-column prop="isUsed" label="鏄惁浣跨敤">
+                <template slot-scope="{row}">
+                  <el-switch @change="changeUsed($event, row)" v-model="row.isUsed" active-color="#13ce66"
+                             inactive-color="#ff4949" :active-value="0" :inactive-value="1">
+                  </el-switch>
+                </template>
+              </el-table-column>
+              <el-table-column prop="editDate" label="鏈�杩戞洿鏂版椂闂�" align="center" min-width="150"></el-table-column>
+              <el-table-column
+                  label="鎿嶄綔"
+                  align="center"
+                  min-width="280"
+                  fixed="right"
+              >
+                  <template slot-scope="{row}">
+                    <el-button type="text" @click="$refs.operaDeviceWindow.open('缂栬緫鐢佃〃', row)" icon="el-icon-edit" v-permissions="['business:device:update']">缂栬緫</el-button>
+                    <el-button type="text" @click="$refs.operaDeviceDataWindow.open('鏌ョ湅鐢佃〃鏁版嵁', row)" icon="el-icon-view" v-permissions="['business:device:update']">鏁版嵁</el-button>
+                    <el-button type="text" @click="send(row,1)" icon="el-icon-circle-check"  v-permissions="['business:device:update']">寮�闂�</el-button>
+                    <el-button type="text" class="red" @click="send(row,0)" icon="el-icon-circle-close"  v-permissions="['business:device:update']">鍏抽椄</el-button>
+                    <el-button type="text" class="red" @click="deleteById(row)" icon="el-icon-delete" v-permissions="['business:device:delete']">鍒犻櫎</el-button>
+                  </template>
+                </el-table-column>
+            </el-table>
+            <pagination
+                @size-change="handleSizeChange"
+                @current-change="handlePageChange"
+                :pagination="tableData.pagination"  >
+            </pagination>
+        </template>
+      <el-dialog
+          :visible.sync="visibleSend"
+          style="z-index: 100000"
+          append-to-body
+          width="50%"
+          height="50%"
+          :title="'鎺у埗鐢佃〃-銆�'+ form.name+'銆�'"
+      >
+        <el-form :model="form" ref="form"  :rules="rules">
+          <el-form-item label="鎵ц鎿嶄綔锛�"  >
+            <b class="green" v-if="form.status ===1">寮�闂�</b>
+            <b class="red" v-else>鍏抽椄</b>
+          </el-form-item>
+          <el-form-item label="寮�鍏冲簭鍙�" prop="channelNo">
+            <el-input v-model="form.channelNo" type="text" placeholder="璇疯緭鍏ュ紑鍏冲簭鍙� 锛屽涓敤鑻辨枃閫楀彿闅斿紑锛屽 1,2,3" v-trim/>
+          </el-form-item>
+          <p class="tip-warn" style="width: 100%;"><i class="el-icon-warning"></i>璁惧鍘熷寮�鍏冲簭鍙蜂俊鎭細{{form.channelNo1}}锛屾帶鍒跺涓紑鍏筹紝璇风敤鑻辨枃閫楀彿闅斿紑锛屽 1,2;</p>
+        </el-form>
+        <template  v-slot:footer  >
+          <el-button @click="sendAction()" type="primary" v-if="form.status === 1" :loading="isWorkSending">纭寮�闂�</el-button>
+          <el-button @click="sendAction()" type="danger" v-if="form.status !== 1" :loading="isWorkSending">纭鍏抽椄</el-button>
+          <el-button @click="sendClose()">杩斿洖</el-button>
+        </template>
+      </el-dialog>
+        <!-- 鏂板缓/淇敼 -->
+    <OperaDeviceDuanluqiWindow ref="operaDeviceWindow" @success="handlePageChange"/>
+    <OperaDeviceDataListWindow ref="operaDeviceDataWindow" @success="handlePageChange"/>
+    </TableLayout>
+</template>
+<script>
+import BaseTable from '@/components/base/BaseTable'
+import TableLayout from '@/layouts/TableLayout'
+import Pagination from '@/components/common/Pagination'
+import OperaDeviceDataListWindow from '@/components/business/OperaDeviceDataListWindow'
+import OperaDeviceDuanluqiWindow from '@/components/business/OperaDeviceDuanluqiWindow'
+export default {
+  name: 'DeviceDuanluqi',
+  extends: BaseTable,
+  components: { TableLayout, Pagination, OperaDeviceDuanluqiWindow ,OperaDeviceDataListWindow},
+  data () {
+    return {
+      // 鎼滅储
+      searchForm: {
+        doorNo: '',
+        no: '',
+        name: '',
+        type: 6
+      },
+      isWorkSending: false,
+      form: {
+        id: '',
+        name: '',
+        channelNo: '',
+        channelNo1: '',
+        status: null
+      },
+      visibleSend: false,
+      options: [],
+      rules: {
+        channelNo: [{ required: true, message: '璇疯緭鍏ラ渶瑕佹搷浣滅殑寮�鍏冲簭鍙�', trigger: 'blur' }],
+      }
+    }
+  },
+  created () {
+    this.config({
+      module: '璁惧淇℃伅琛�',
+      api: '/business/device',
+      'field.id': 'id',
+      'field.main': 'id'
+    })
+    this.search()
+  },
+  methods: {
+    changeUsed (e, row) {
+      this.api.updateUsedById({
+        id: row.id,
+        isUsed: e
+      })
+    },
+    showPassward (row) {
+      if (!row.showPwd) {
+        this.$set(row, 'showPwd', true)
+      } else {
+        this.$set(row, 'showPwd', false)
+      }
+    },
+    sendAction () {
+      if (!this.form.channelNo) {
+        return
+      }
+      this.$dialog.actionConfirm('纭杩涜鐢佃〃銆�' + (this.form.status === 1 ? '寮�闂�' : '鍏抽椄') + '銆戞搷浣滃悧锛�', '鎿嶄綔纭鎻愰啋')
+        .then(() => {
+          this.isWorkSending = true
+          this.api.duanluqiCmd(this.form)
+            .then(res => {
+              this.$tip.apiSuccess(res || '璇锋眰鎴愬姛')
+              this.sendClose()
+            })
+            .catch(e => {
+            })
+            .finally(() => {
+              this.isWorkSending = false
+            })
+        })
+        .catch(() => {})
+    },
+    send (row, type) {
+      this.visibleSend = true
+      this.form = { id: row.id, name: row.name, channelNo: row.channelNo, status: type ,channelNo1:row.channelNo}
+    },
+    sendClose () {
+      this.visibleSend = false
+      this.isWorkSending = false
+      this.form = { id: '', name: '', channelNo: '', status: '',channelNo1:'' }
+    }
+
+  }
+}
+</script>
diff --git a/admin/src/views/business/screenBoard.vue b/admin/src/views/business/screenBoard.vue
new file mode 100644
index 0000000..2f385e3
--- /dev/null
+++ b/admin/src/views/business/screenBoard.vue
@@ -0,0 +1,328 @@
+<template>
+    <div class="main_app1" >
+        <div class="main_head">
+            <div class="main_head_bottom">
+                <div class="main_head_item blue">
+                    <span :class="index==0?'active':''" @click="showPage('LogisticsCenter',0)">鏁版櫤鎴愬搧绠℃帶</span>
+                </div>
+                <div class="main_head_item red">
+                    <span :class="index==1?'active':''"  @click="showPage('LogisticsEfficiency',1)">璋冨害鑳芥晥璺熻釜</span>
+                </div>
+                <div class="main_head_item yellow">
+                    <span :class="index==2?'active':''"  @click="showPage('TaskEfficiency',2)">浣滀笟鏁堣兘缁熺</span>
+                </div>
+                <div class="main_head_item orange">
+                    <span :class="index==3?'active':''"  @click="showPage('SecurityControl',3)">鏅鸿兘瀹夐槻绠℃帶</span>
+                </div>
+                <div class="main_head_item darkBlue">
+                    <span :class="index==4?'active':''"  @click="showPage('FireFighting',4)">鏅烘収娑堥槻绠℃帶</span>
+                </div>
+                <div class="main_head_item yellow">
+                    <span :class="index==5?'active':''"  @click="showPage('EnergyConsum',5)">缁胯壊浣庣⒊杩愯惀</span>
+                </div>
+            </div>
+        </div>
+        <div class="main_table">
+          <div style="display: block; position: fixed;right: 60px;bottom: 60px;"><el-button icon="el-icon-view" style="background : #002138;border: #002138;color: white;" @click="newWIn">鏂扮獥鍙f墦寮�</el-button></div>
+          <iframe :src="pageUrl" width="100%" style="min-height: 900px;"></iframe>
+        </div>
+    </div>
+</template>
+
+<script>
+import BaseOpera from '@/components/base/BaseOpera';
+export default {
+  name: 'screenBoard',
+  extends: BaseOpera,
+  data () {
+    return {
+      prefix: process.env.VUE_APP_SCREEN_URL_PREFIX,
+      pageUrl: process.env.VUE_APP_SCREEN_URL_PREFIX,
+      index: 0,
+      pages: []
+    }
+  },
+  mounted () {
+  },
+  methods: {
+    showPage (url,index) {
+      this.index = index
+      this.pageUrl = this.prefix + url
+      // window.open(this.prefix + url)
+    },
+    newWIn () {
+      window.open(this.pageUrl)
+    }
+  }
+}
+</script>
+
+<style lang="scss" scoped>
+    .main_app1 {
+        width: 100%;
+        height: calc(100% - 44px);
+        overflow-y: auto;
+        overflow-x: hidden;
+        padding: 15px;
+        box-sizing: border-box;
+        background-color: #F4F7FC;
+        .main_head {
+            width: 100%;
+            display: flex;
+            align-items: center;
+            flex-direction: column;
+            margin-bottom: 10px;
+            background-color: #ffffff;
+            padding: 20px;
+            box-sizing: border-box;
+            .main_head_title {
+                width: 100%;
+                display: flex;
+                align-items: center;
+                margin-bottom: 20px;
+                span {
+                    font-weight: 500;
+                    font-size: 18px;
+                    color: #222222;
+                    margin-right: 30px;
+                }
+            }
+            .main_head_bottom {
+                width: 100%;
+                display: flex;
+                align-items: center;
+                justify-content: space-between;
+                .blue {
+                    border-left: 8px solid #12BB8B;
+                }
+                .red {
+                    border-left: 8px solid #F6CF46;
+                }
+                .yellow {
+                    border-left: 8px solid #5DC9FB;
+                }
+                .orange {
+                    border-left: 8px solid #FF9E56;
+                }
+                .darkBlue {
+                    border-left: 8px solid #6B6EFF;
+                }
+                .active{
+                  font-size: 18px !important;
+                  font-weight: 800 !important;
+                  color: #5DC9FB !important;
+                }
+                .main_head_item {
+                    width: 19%;
+                    height: 60px;
+                    display: flex;
+                    flex-direction: column;
+                    align-items: center;
+                    justify-content: center;
+                    cursor: pointer;
+                    box-sizing: border-box;
+                    border-radius: 5px;
+                    background-color: #F4F7FC;
+                    span {
+                        &:nth-child(1) {
+                            font-weight: 600;
+                            font-size: 16px;
+                            color: #222222;
+                        }
+                        &:nth-child(2) {
+                            font-weight: 400;
+                            font-size: 14px;
+                            color: #222222;
+                        }
+                    }
+                }
+            }
+        }
+
+        .main_table {
+            display: flex;
+            align-items: flex-start;
+            justify-content: space-between;
+            margin-top: 10px;
+            .main_table_list {
+                background-color: #ffffff;
+                padding: 20px;
+                box-sizing: border-box;
+                width: 69%;
+                .title {
+                    display: flex;
+                    align-items: center;
+                    span {
+                        font-weight: 500;
+                        font-size: 18px;
+                        color: #222222;
+                    }
+                }
+                .list_wu {
+                    width: 100%;
+                    height: 100px;
+                    line-height: 100px;
+                    text-align: center;
+                    font-size: 16px;
+                    color: #222222;
+                }
+                .list_head {
+                    width: 100%;
+                    height: 50px;
+                    display: flex;
+                    align-items: center;
+                    background-color: #F7F7F7;
+                    border-left: 1px solid #DFE2E8;
+                    border-top: 1px solid #DFE2E8;
+                    margin-top: 15px;
+                    .list_head_item {
+                        flex: 1;
+                        height: 100%;
+                        display: flex;
+                        align-items: center;
+                        justify-content: center;
+                        font-size: 13px;
+                        color: #222222;
+                        font-weight: 500;
+                        border-right: 1px solid #DFE2E8;
+                    }
+                }
+                .table_box {
+                    width: 100%;
+                    border-bottom: 1px solid #DFE2E8;
+                    .list_content {
+                        width: 100%;
+                        height: 50px;
+                        display: flex;
+                        align-items: center;
+                        border-left: 1px solid #DFE2E8;
+                        border-top: 1px solid #DFE2E8;
+                        .list_head_item {
+                            flex: 1;
+                            height: 100%;
+                            display: flex;
+                            border-right: 1px solid #DFE2E8;
+                            align-items: center;
+                            justify-content: center;
+                            font-size: 13px;
+                            color: #222222;
+                        }
+                    }
+                }
+            }
+            .main_table_list1 {
+                margin-left: 10px;
+                width: 30%;
+                padding: 20px;
+                box-sizing: border-box;
+                flex-shrink: 0;
+                background-color: #ffffff;
+                .title {
+                    font-weight: 500;
+                    font-size: 18px;
+                    color: #222222;
+                }
+                .list_wu {
+                    width: 100%;
+                    height: 100px;
+                    line-height: 100px;
+                    text-align: center;
+                    font-size: 16px;
+                    color: #222222;
+                }
+                .list_head {
+                    width: 100%;
+                    height: 50px;
+                    display: flex;
+                    align-items: center;
+                    background-color: #F7F7F7;
+                    border-left: 1px solid #DFE2E8;
+                    border-top: 1px solid #DFE2E8;
+                    margin-top: 15px;
+                    .list_head_item {
+                        flex: 1.8;
+                        height: 100%;
+                        display: flex;
+                        align-items: center;
+                        justify-content: center;
+                        font-size: 13px;
+                        color: #222222;
+                        font-weight: 500;
+                        border-right: 1px solid #DFE2E8;
+                        &:last-child {
+                            flex: 1;
+                        }
+                    }
+                }
+                .table_box {
+                    width: 100%;
+                    border-bottom: 1px solid #DFE2E8;
+                    .list_content {
+                        width: 100%;
+                        height: 50px;
+                        display: flex;
+                        align-items: center;
+                        border-left: 1px solid #DFE2E8;
+                        border-top: 1px solid #DFE2E8;
+                        .list_head_item {
+                            flex: 1.8;
+                            height: 100%;
+                            display: flex;
+                            align-items: center;
+                            border-right: 1px solid #DFE2E8;
+                            justify-content: center;
+                            text-align: center;
+                            font-size: 13px;
+                            color: #222222;
+                            &:last-child {
+                                flex: 1;
+                            }
+                        }
+                    }
+                }
+            }
+        }
+
+        .main_content {
+            display: flex;
+            align-items: center;
+            justify-content: space-between;
+            height: 350px;
+
+            .title {
+                font-weight: 500;
+                font-size: 18px;
+                color: #222222;
+            }
+
+            .type_wrap {
+                flex: 1;
+                height: 100%;
+                background-color: #ffffff;
+                padding: 20px;
+                box-sizing: border-box;
+                /*border-right: 12px solid #f7f7f7;*/
+
+                .echart1 {
+                    width: 100%;
+                    height: 100%;
+                    margin-top: 18px;
+                }
+            }
+
+            .dept_wrap {
+                width: 520px;
+                flex-shrink: 0;
+                height: 100%;
+                background-color: #ffffff;
+                padding: 20px;
+                box-sizing: border-box;
+                margin-left: 10px;
+                #echart2 {
+                    width: 100%;
+                    height: 100%;
+                }
+            }
+        }
+    }
+</style>
diff --git a/screen/src/assets/images/default_nowarning.png b/screen/src/assets/images/default_nowarning.png
new file mode 100644
index 0000000..52636d6
--- /dev/null
+++ b/screen/src/assets/images/default_nowarning.png
Binary files differ
diff --git a/server/startsh/service_start.sh b/server/startsh/service_start.sh
new file mode 100644
index 0000000..2fa55f1
--- /dev/null
+++ b/server/startsh/service_start.sh
@@ -0,0 +1,13 @@
+#!/bin/bash
+
+killall java
+redis-server &
+/usr/local/nginx/sbin/nginx
+/usr/local/nacos/nacos/bin/startup.sh -m standalone
+
+nohup java -jar /usr/local/jars/system_gateway.jar > /dev/null 2>&1 &
+nohup java -jar /usr/local/jars/admin_timer.jar > /dev/null 2>&1 &
+nohup java -jar /usr/local/jars/system_timer.jar > /dev/null 2>&1 &
+nohup java -jar /usr/local/jars/admin_interface.jar > /dev/null 2>&1 &
+nohup java -jar /usr/local/jars/meeting_admin.jar > /dev/null 2>&1 &
+
diff --git a/server/visits/device_service/src/main/java/com/doumee/tcp/WaterElectricityUtil.java b/server/visits/device_service/src/main/java/com/doumee/tcp/WaterElectricityUtil.java
new file mode 100644
index 0000000..ebbfc0f
--- /dev/null
+++ b/server/visits/device_service/src/main/java/com/doumee/tcp/WaterElectricityUtil.java
@@ -0,0 +1,507 @@
+package com.doumee.tcp;
+
+import com.alibaba.fastjson.JSONObject;
+
+import java.io.ByteArrayOutputStream;
+import java.io.IOException;
+import java.net.Socket;
+import java.text.DateFormat;
+import java.text.SimpleDateFormat;
+import java.util.*;
+
+public class WaterElectricityUtil {
+
+
+    private static double parseBcdToDouble(byte[] bcdBytes) {
+        StringBuilder sb = new StringBuilder();
+        for (byte b : bcdBytes) {
+            sb.append(String.format("%02X", b));
+        }
+        try {
+            return Double.parseDouble(sb.toString());
+        } catch (NumberFormatException e) {
+            return 0.0;
+        }
+    }
+
+    private static byte[] reverseAddress(String address) {
+        byte[] result = new byte[6];
+        for (int i = 0; i < 6; i++) {
+            if (i * 2 + 1 < address.length()) {
+                String hex = address.substring(i * 2, Math.min((i + 1) * 2, address.length()));
+                result[i] = (byte) Integer.parseInt(hex, 16);
+            }
+        }
+        return result;
+    }
+
+    private static byte calculateChecksum(byte[] data, int offset, int length) {
+        int sum = 0;
+        for (int i = offset; i < offset + length; i++) {
+            sum += data[i] & 0xFF;
+        }
+        return (byte) (sum & 0xFF);
+    }
+
+    private static byte[] hexStringToByteArray(String hex) {
+        int len = hex.length();
+        byte[] data = new byte[len / 2];
+        for (int i = 0; i < len; i += 2) {
+            data[i / 2] = (byte) ((Character.digit(hex.charAt(i), 16) << 4) + Character.digit(hex.charAt(i + 1), 16));
+        }
+        return data;
+    }
+
+    public static byte calcCS(byte[] data) {
+        int sum = 0;
+        for (byte b : data) {
+            sum += b & 0xFF;
+        }
+        return (byte) (sum & 0xFF);
+    }
+
+    public static byte[] getRequestParam(int feCount, byte[] address, byte control, byte[] data) throws IOException {
+
+        ///FEFEFE    68  999999999999    68  01  02  65  F3C1  16
+//        byte b = (byte) 0xFE;
+//        byte[] msg = {(byte) 0xFE,0x68};
+        ByteArrayOutputStream frame = new ByteArrayOutputStream();
+        for (int i = 0; i < feCount; i++) {
+            frame.write(0xFE);
+        }
+        // 2. 甯ц捣濮嬬
+        frame.write(0x68);
+        // 3. 鍦板潃鍩�
+        frame.write(address);
+        // 4. 鍐嶆甯ц捣濮嬬
+        frame.write(0x68);
+        // 5. 鎺у埗鐮�
+        frame.write(control);
+        // 6. 鏁版嵁闀垮害
+        frame.write(data.length);
+        // 7. 鏁版嵁鍩�
+        frame.write(data);
+        // 8. 璁$畻 CS锛堜粠绗竴涓� 68 寮�濮嬶級
+        byte[] csData = frame.toByteArray();
+        int start = feCount; // 绗竴涓� 68 鐨勪綅缃�
+        byte cs = calcCS(Arrays.copyOfRange(csData, start, csData.length));
+        frame.write(cs);
+        // 9. 缁撴潫绗�
+        frame.write(0x16);
+        return frame.toByteArray();
+    }
+
+
+    private static byte[] readDeviceData(String ip, int port, byte[] data) {
+        Socket socket = null;
+        try {
+            socket = new Socket(ip, port);
+            socket.setSoTimeout(5000);
+            java.io.OutputStream out = socket.getOutputStream();
+            java.io.InputStream in = socket.getInputStream();
+            out.write(data);
+            out.flush();
+            // 璇诲彇鍝嶅簲
+            byte[] buffer = new byte[2048];
+            int bytesRead = in.read(buffer);
+            byte[] response = Arrays.copyOf(buffer, bytesRead);
+            // 瑙f瀽鍝嶅簲鏁版嵁
+            return response;
+        } catch (Exception e) {
+//            e.printStackTrace();
+            throw new RuntimeException("Failed to read from device", e);
+        } finally {
+            if (socket != null) {
+                try {
+                    socket.close();
+                } catch (IOException e) {
+                }
+            }
+        }
+    }
+
+    private static String bytesToHex(byte[] bytes) {
+        StringBuilder hexString = new StringBuilder();
+        for (byte b : bytes) {
+            String hex = String.format("%02X", b & 0xFF);
+            hexString.append(hex);
+        }
+        return hexString.toString();
+    }
+
+    /**
+     * 灏�12浣嶅崄杩涘埗鍦板潃杞崲涓�6瀛楄妭BCD灏忕搴忓湴鍧�
+     *
+     * @param decimalAddress 12浣嶅崄杩涘埗鍦板潃瀛楃涓�
+     * @return 6瀛楄妭鐨凚CD鍦板潃锛堝皬绔簭锛�
+     */
+    private static byte[] convertToBCDAddress(String decimalAddress) {
+        // 1. 楠岃瘉杈撳叆
+        if (decimalAddress == null || decimalAddress.length() != 12) {
+            throw new IllegalArgumentException("鍦板潃蹇呴』鏄�12浣嶅崄杩涘埗鏁�");
+        }
+        if (!decimalAddress.matches("\\d{12}")) {
+            throw new IllegalArgumentException("鍦板潃蹇呴』鍏ㄩ儴鏄暟瀛�");
+        }
+        // 2. 鍑嗗缁撴灉鏁扮粍锛�6瀛楄妭锛�
+        byte[] result = new byte[6];
+        // 3. 浠庡彸鍚戝乏姣�2浣嶄竴缁勫鐞嗭紙灏忕搴忥級
+        for (int i = 0; i < 6; i++) {
+            // 璁$畻鍦ㄥ瓧绗︿覆涓殑浣嶇疆锛堜粠鍙冲悜宸︼級
+            int strIndex = 10 - (i * 2);  // 鍥犱负瑕佸彇涓や綅锛屾墍浠ユ槸10,8,6,4,2,0
+            String twoDigits = decimalAddress.substring(strIndex, strIndex + 2);
+            // 灏嗕袱浣嶅崄杩涘埗鏁拌浆鎹负BCD瀛楄妭
+            // 渚嬪锛�"25" -> 0x25
+            result[i] = (byte) Integer.parseInt(twoDigits, 16);
+        }
+        // 娉ㄦ剰锛氫笂闈㈢殑寰幆椤哄簭宸茬粡鏄皬绔簭锛宺esult[0]瀛樼殑鏄渶浣庝袱浣�
+        return result;
+    }
+
+
+    private static String subByte(String value, byte sub) {
+        byte b = (byte) Integer.parseInt(value, 16);
+        int result = (b & 0xFF) - (sub & 0xFF);
+        // 纭繚缁撴灉鍦�0-255鑼冨洿鍐咃紙澶勭悊璐熸暟锛�
+        if (result < 0) {
+            result += 256;
+        }
+        String hexResult = String.format("%02X", result & 0xFF);
+        return hexResult;
+
+    }
+
+
+    private static String[] parseSub33Reverse(String msg, int n) {
+        //33333333  3333
+        String[] nArr = new String[n];
+
+        byte _33 = 0x33;
+        for (int i = 0; i < n; i++) {
+            int index = i * 2;
+            String twoDigits = msg.substring(index, index + 2);
+            String hexResult = subByte(twoDigits, _33);
+            // 鍙嶅悜瀛樺偍锛歯Arr[n - i - 1] 瀹炵幇鍙嶈浆
+            nArr[n - i - 1] = hexResult;
+        }
+        return nArr;
+    }
+
+
+    public static Map<String, Object> water(String ip, int port, String address) throws IOException {
+        byte[] address_buf = convertToBCDAddress(address);
+        byte control = 0x01;
+        byte[] data = {0x43, (byte) 0xC3};
+        byte[] bufReq = getRequestParam(3, address_buf, control, data);
+        byte[] resp = readDeviceData(ip, port, bufReq);
+        String hex = bytesToHex(resp);
+
+        //FEFEFE6899254652010068810843C3333433333333E916
+//        System.out.println(hex);
+        String msg = hex.substring(30, 30 + 8 + 4);
+
+        String[] nArr = parseSub33Reverse(msg, 4);
+        Double total = strArrNum(nArr);
+        Map<String, Object> r = new HashMap<>();
+        r.put("total", total);
+
+        msg = hex.substring(40, 40 + 2);
+        byte sub = 0x33;
+        String hexResult = subByte(msg, sub);
+        String v = hexToBinary(hexResult);
+        /**
+         * Y0.B0銆�瀛樺偍鍣ㄧ姸鎬� (1:鏁呴殰,0:姝e父)锛�
+         * Y0.B1銆�闃�闂ㄧ姸鎬� (1:鏁呴殰,0:姝e父)锛�
+         * Y0.B2銆�淇″彿鐘舵�� (1:鏁呴殰,0:姝e父)锛�
+         * Y0.B3銆�鐢垫睜鐘舵�� (1:鏁呴殰,0:姝e父)锛�
+         * Y0.B4銆�淇濈暀锛�
+         * Y0.B5銆�淇濈暀锛�
+         * Y0.B6銆�姘磋〃閫氳鐘舵�侊紙 1:鏁呴殰,0:姝e父锛夛紱
+         * Y0.B7銆�闃�闂ㄥ紑鍏崇姸鎬� (1: 鍚�,0:寮�)锛�
+         * 娉ㄦ剰锛氱姸鎬佷綅鏃犳椂涓� 0锛堟甯革級
+         * 绾㈣壊锛氭棤璁板繂鐩磋琛ㄧ殑鐘舵��
+         */
+
+        r.put("status", v);
+        return r;
+    }
+
+
+    private static void electricityTotal(String ip, int port, byte[] addressBuf, Map<String, Object> map) throws IOException {
+        byte control = 0x11;
+        byte[] data = {0x33, 0x33, 0x33, 0x33};
+
+        byte[] bufReq = getRequestParam(4, addressBuf, control, data);
+        byte[] respBuf = readDeviceData(ip, port, bufReq);
+        String resp = bytesToHex(respBuf);
+        String msg = resp.substring(28 + 8, 28 + 8 + 8);
+        String[] nArr = parseSub33Reverse(msg, 4);
+        Double total = strArrNum(nArr);
+        map.put("total", total);
+    }
+
+    private static void electricityStatus(String ip, int port, byte[] addressBuf, Map<String, Object> map) throws IOException {
+        byte control = 0x11;
+        byte[] data = {0x36, 0x38, 0x33, 0x37};
+        byte[] bufReq = getRequestParam(4, addressBuf, control, data);
+        byte[] respBuf = readDeviceData(ip, port, bufReq);
+        String resp = bytesToHex(respBuf);
+        String msg = resp.substring(36, 36 + 4);
+        System.out.println(resp);
+        String[] nArr = parseSub33Reverse(msg, 2);
+        String status = hexToBinary1(nArr);
+//        String resp = "FEFEFEFE   68  615121010000    68  91  06  36383337    3333    7916";
+        map.put("status", status);
+    }
+
+    private static void electricityTime(String ip, int port, byte[] addressBuf, Map<String, Object> map) throws IOException {
+        byte control = 0x11;
+        byte[] data = {0x3F, 0x34, 0x33, 0x37};
+        byte[] bufReq = getRequestParam(4, addressBuf, control, data);
+        byte[] respBuf = readDeviceData(ip, port, bufReq);
+        String resp = bytesToHex(respBuf);
+        String msg = resp.substring(36, 36 + 14);
+//        System.out.println(msg);
+        String[] nArr = parseSub33Reverse(msg, 7);
+        String ts = hexToBinary1(nArr);
+        String time = "20"+ts.substring(0,6)+ts.substring(8);
+        Date date = getDateByStr(time);
+//        String resp = "FEFEFEFE   68  615121010000    68  91  06  36383337    3333    7916";
+        map.put("currentTime", formatData(date));
+    }
+    public static Date getDateByStr(String date)  {
+        TimeZone tz = TimeZone.getTimeZone("Asia/Shanghai");
+        if(date!=null ){
+            int i = date.indexOf("+");
+            if(i >0){
+                date = date.substring(0,i);
+            }
+        }
+        DateFormat df = new SimpleDateFormat("yyyyMMddHHmmss");
+        df.setTimeZone(tz);
+        Date dates = null;
+        try {
+            dates = df.parse(date);
+        } catch (Exception e) {
+            e.printStackTrace();
+        }
+        return dates;
+    }
+    public static String formatData(Date date)  {
+        DateFormat df = new SimpleDateFormat("yyyy骞碝M鏈坉d鏃H鏃秏m鍒唖s绉�");
+        try {
+            return  df.format(date);
+        } catch (Exception e) {
+        }
+        return null;
+    }
+
+    public static Map<String, Object> electricity(String ip, int port, String address) throws IOException {
+        Map<String, Object> r = new HashMap<>();
+        byte[] addressBuf = convertToBCDAddress(address);
+        electricityTotal(ip, port, addressBuf, r);
+        electricityStatus(ip, port, addressBuf, r);
+        electricityTime(ip, port, addressBuf, r);
+        return r;
+    }
+
+    private static String hexToBinary(String hex) {
+        StringBuilder sb = new StringBuilder();
+        for (char c : hex.toCharArray()) {
+            int val = Integer.parseInt(String.valueOf(c), 16);
+            sb.append(String.format("%4s", Integer.toBinaryString(val)).replace(' ', '0'));
+        }
+        return sb.toString();
+    }
+
+    private static String hexToBinary(String[] hexArr) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < hexArr.length; i++) {
+            sb.append(hexToBinary(hexArr[i]));
+        }
+        return sb.toString();
+    }
+    private static String hexToBinary1(String[] hexArr) {
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < hexArr.length; i++) {
+            sb.append(hexArr[i]);
+        }
+        return sb.toString();
+    }
+
+
+    private static String addHex(String hex1, String hex2) {
+        int num1 = Integer.parseInt(hex1.replace("0x", ""), 16);
+        int num2 = Integer.parseInt(hex2.replace("0x", ""), 16);
+        int sum = num1 + num2;
+        return "0x" + Integer.toHexString(sum).toUpperCase();
+    }
+
+    private static void testWater() throws IOException {
+        //"00000152462599"; 000152462599
+        //FEFEFE    68  999999999999    68  01(C)  02(L)  65(DI0) F3(DI1)  C1(CS鏍¢獙鐮�)  16(缁撴潫绗�)
+        //FEFEFE6899254652010068010243C33016
+        //FEFEFE6899254652010068810843C3333333333333E816
+
+//        FEFEFE6899254652010068810843C3333333333333E816
+        String ip = "192.168.1.78";
+        int port = 1030;
+//        DeviceData d = readDeviceData(ip, port, "00000152462599");
+//        System.out.println(d);
+//        String address = "000152462599";
+        String address = "000152462599";
+        //00000152462599
+        byte[] address_buf = convertToBCDAddress(address);
+//        byte[] address_buf = hexStringToByteArray(address);
+//        System.out.println(buf);
+        /**
+         *
+         * FEFEFE   68  000152462599  68010243C33016
+         * FEFEFE   68  992546520100  68010243C33016
+         */
+        byte control = 0x01;
+        byte[] data = {0x43, (byte) 0xC3};
+        byte[] datas = getRequestParam(3, address_buf, control, data);
+        System.out.println(bytesToHex(datas));
+        System.out.println("FEFEFE6899254652010068010243C33016");
+//         datas = hexStringToByteArray("FEFEFE6899254652010068010243C33016");
+        byte[] resp = readDeviceData(ip, port, datas);
+        String r = bytesToHex(resp);
+        System.out.println(r);
+
+        /**
+         *
+         * FEFEFE   68  992546520100    68  01  02  43C3    30  16
+         * FEFEFE   68  992546520100    68  81  08  43C3    33333333    3333    E8  16
+         */
+//        String r = "FEFEFE6899254652010068810843C3333333333333E816";
+        String msg = r.substring(30, 30 + 8 + 4);
+        System.out.println(msg);
+        String[] nArr = parseSub33Reverse(msg, 4);
+        System.out.println(strArrNum(nArr));
+//        byte d10 = 0x10;
+//        byte add = 0x33;
+//        String hex = String.format("%02X", (d10 + add) & 0xFF);
+//        System.out.println(hex);
+
+//        r = addHex("0x10", "0x33");
+//        System.out.println(r);
+//
+//        r = addHex("0x90", "0x33");
+//        System.out.println(r);
+        msg = r.substring(40, 40 + 2);
+        System.out.println(msg);
+
+        byte sub = 0x33;
+        String hexResult = subByte(msg, sub);
+        String v = hexToBinary(hexResult);
+        System.out.println(v);
+    }
+
+
+    /**
+     * 鏈�鍚庝竴浣嶆槸灏忔暟鐐�
+     *
+     * @param nArr
+     * @return
+     */
+    private static Double strArrNum(String[] nArr) {
+        if (nArr == null || nArr.length == 0) {
+            return 0.0;
+        }
+        // 灏嗘墍鏈夐儴鍒嗘嫾鎺ヨ捣鏉�
+        StringBuilder sb = new StringBuilder();
+        for (int i = 0; i < nArr.length; i++) {
+            sb.append(nArr[i]);
+        }
+
+        // 鍦ㄩ�傚綋浣嶇疆鎻掑叆灏忔暟鐐�
+        String combined = sb.toString();
+        int totalLength = combined.length();
+        int decimalLength = nArr[nArr.length - 1].length();
+        // 鎻掑叆灏忔暟鐐�
+        String numberStr = combined.substring(0, totalLength - decimalLength) + "." + combined.substring(totalLength - decimalLength);
+        return Double.parseDouble(numberStr);
+    }
+
+
+    public static void electricityTest() throws IOException {
+        //000001215161
+//        FEFEFEFE  68  615121010000    68  11  04  33333333    8516
+//        FEFEFEFE6861512101000068910833333333A93333334B16
+//        FEFEFEFE6861512101000068910833333333AC3333334E16
+        String ip = "192.168.1.78";
+        int port = 1030;
+
+        String address = "000001215161";
+        byte[] addressBuf = convertToBCDAddress(address);
+
+//        byte control = 0x11;
+//        byte[] data = {0x33, 0x33, 0x33, 0x33};
+////
+//        byte[] bufReq = getRequestParam(4, addressBuf, control, data);
+////        String req = bytesToHex(bufReq);
+//////        String param = "FEFEFE68615121010000681104333333338516";
+////        System.out.println(req);
+//////        System.out.println(param);
+////        byte[] buf = hexStringToByteArray(param);
+//        byte[] respBuf = readDeviceData(ip, port, bufReq);
+//        String hex = bytesToHex(respBuf);
+////        System.out.println(hex);
+//        String resp = "FEFEFEFE6861512101000068910833333333AC3333334E16";
+////                     FEFEFEFE68615121010000   68  91  08 33333333 A9  333333    4B16
+//
+//        String msg = resp.substring(28, 28 + 8);
+//        System.out.println(msg);
+//
+//        String[] nArr = parseSub33Reverse(msg, 4);
+//        System.out.println(strArrNum(nArr));
+//        msg = resp.substring(28 + 8, 28 + 8 + 8);
+//        System.out.println(msg);
+//
+//        nArr = parseSub33Reverse(msg, 4);
+////        parseSub33Reverse
+//        System.out.println(strArrNum(nArr));
+
+
+//        String msgStatus = "FEFEFEFE 68 379707010000 68 11 04 36383337 9316";
+//        String msgStatus = "FEFEFEFE68379707010000681104363833379316";
+//        byte control = 0x11;
+//        byte[] data = {0x36, 0x38, 0x33, 0x37};
+//        byte[] bufReq = getRequestParam(4, addressBuf, control, data);
+//        String req = bytesToHex(bufReq);
+//        System.out.println(req);
+//        System.out.println(msgStatus);
+//        byte[] respBuf = readDeviceData(ip, port, bufReq);
+//        String resp = bytesToHex(respBuf);
+//        System.out.println(resp);
+//        FEFEFEFE  68  615121010000  68  91  06  36383337  3333  79  16
+//        FEFEFEFE  68  615121010000    68  91  06  36383337    3333    79  16
+        String resp = "FEFEFEFE686151210100006891063638333733337916";
+        String msg = resp.substring(36, 36 + 4);
+        System.out.println(msg);
+        String[] nArr = parseSub33Reverse(msg, 2);
+//        System.out.println(strArrNum(nArr));
+        String v = hexToBinary(nArr);
+        v="0000000000010000";
+        System.out.println(v);
+        System.out.println(v.charAt(11));
+
+
+    }
+
+
+    public static void main(String[] args) throws IOException {
+//        testWater();
+//        electricityTest();
+        water("192.168.1.78",1030,"000152462599");
+        Map<String, Object> map = electricity("192.168.1.78", 1030, "000001215161");
+        System.out.println(JSONObject.toJSONString(map));
+//        FEFEFE6899254652010068810 843C3333433333333   E9 16
+//        FEFEFE6899254652010068810 84  3C3333433333333E916
+
+//        Map<String, Object> map1 = water("192.168.1.78", 1030, "000152462599");
+//        System.out.println(JSONObject.toJSONString(map1));
+    }
+
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/SensorStatusStatisticResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/SensorStatusStatisticResponse.java
new file mode 100644
index 0000000..d1c83ae
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/haikang/model/param/respose/SensorStatusStatisticResponse.java
@@ -0,0 +1,12 @@
+package com.doumee.core.haikang.model.param.respose;
+
+import lombok.Data;
+
+@Data
+public class SensorStatusStatisticResponse {
+
+private Integer  sensorNum	;//	Number	false	浼犳劅鍣ㄦ�绘暟
+   private Integer  sensorMainNum	;//	Number	false	浼犳劅鍣ㄧ淮淇濇暟
+   private Integer  sensorMainRate	;//	Number	false	浼犳劅鍣ㄧ淮淇濈巼
+   private Integer  sensorMainMonthNum	;//	Number	false	浼犳劅鍣ㄦ湰鏈堟柊澧炵淮淇濇暟
+}
diff --git a/server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/response/WmsCarInParkDataResponse.java b/server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/response/WmsCarInParkDataResponse.java
new file mode 100644
index 0000000..e5032e4
--- /dev/null
+++ b/server/visits/dmvisit_service/src/main/java/com/doumee/core/wms/model/response/WmsCarInParkDataResponse.java
@@ -0,0 +1,27 @@
+package com.doumee.core.wms.model.response;
+
+import io.swagger.annotations.ApiModel;
+import io.swagger.annotations.ApiModelProperty;
+import lombok.Data;
+
+import java.util.Date;
+import java.util.List;
+
+/**
+ * @author 姹熻箘韫�
+ * @date 2023/11/23 14:03
+ */
+@Data
+@ApiModel("WMS鎺ュ彛澶勭悊鑾峰彇杞﹁締鏄惁鍏ュ洯杩斿洖data鍙傛暟")
+public class WmsCarInParkDataResponse {
+
+    @ApiModelProperty(value = "鍏ュ巶鏃堕棿" ,example = "1")
+    private Date eventDate;
+
+    @ApiModelProperty(value = "杞︾墝鍙�" ,example = "1")
+    private String carNo;
+
+    @ApiModelProperty(value = "鏄惁鍦ㄥ洯" ,example = "1")
+    private Boolean inPark;
+
+}

--
Gitblit v1.9.3