admin/.env.development
@@ -3,13 +3,6 @@ # 项ç®ä¸ä¸æè·¯å¾ VUE_APP_CONTEXT_PATH = './' #VUE_APP_API_URL = 'http://localhost:10010' VUE_APP_API_URL = 'http://localhost:10010' # VUE_APP_API_URL = 'http://192.168.0.143:10010' # VUE_APP_API_URL = 'https://dmtest.ahapp.net/fn_admin' # VUE_APP_API_URL = 'http://10.50.250.253:8088/gateway_interface' VUE_APP_API_URL = 'https://zhcg.fnwtzx.com/gateway_interface' #VUE_APP_API_URL = 'https://zhcg.fnwtzx.com/gateway_interface' admin/src/api/business/device.js
@@ -12,9 +12,13 @@ return request.post('/visitsAdmin/cloudService/business/hksync/syncDevices', data) } // è·åé¨ç¦éå-æä¾ç»é¨ç¦ç» export function getList (data) { return request.post('/visitsAdmin/cloudService/business/device/getList', data) } export function allList (data) { return request.post('/visitsAdmin/cloudService/business/device/list', data) } export function getDeviceRoleList (data) { return request.post('/visitsAdmin/cloudService/business/deviceRole/list', data) @@ -24,12 +28,44 @@ export function updateById (data) { return request.post('/visitsAdmin/cloudService/business/device/updateById', data) } export function create (data) { return request.post('/visitsAdmin/cloudService/business/device/create', data) } export function dianbiaoData(data) { return request.post('/visitsAdmin/cloudService/business/device/dianbiaoData', data) } // ä¿®æ¹æ¯å¦é¨ç¦å ¥å£ export function updateEntranceById (data) { return request.post('/visitsAdmin/cloudService/business/device/updateEntranceById', data) } export function updateUsedById (data) { return request.post('/visitsAdmin/cloudService/business/device/updateUsedById', data) } export function duanluqiCmd (data) { return request.post('/visitsAdmin/cloudService/business/device/duanluqiCmd', data) } export function dianbaoCmd (data) { return request.post('/visitsAdmin/cloudService/business/device/dianbaoCmd', data) } // åçledå±å 容 export function setLedContent (data) { return request.post('/visitsAdmin/cloudService/business/hksync/setLedContent', data) } export function sendBobao (data) { return request.post('/visitsAdmin/cloudService/business/hksync/sendBobao', data) } // å é¤ export function deleteById (id) { return request.get(`/visitsAdmin/cloudService/business/device/delete/${id}`) } // æ¹éå é¤ export function deleteByIdInBatch (ids) { return request.get('/visitsAdmin/cloudService/business/device/delete/batch', { params: { ids } }) } admin/src/api/business/deviceData.js
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,8 @@ import request from '../../utils/request' // æ¥è¯¢ export function fetchList (data) { return request.post('/visitsAdmin/cloudService/business/deviceData/page', data, { trim: true }) } admin/src/components/business/OperaDeviceDianbiaoWindow.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,147 @@ <template> <GlobalWindow :title="title" :visible.sync="visible" width="65%" :confirm-working="isWorking" @confirm="confirm" > <el-form :model="form" ref="form" :rules="rules"> <p class="tip-header" >åºæ¬ä¿¡æ¯</p> <el-form-item label="设å¤åç§°" prop="name"> <el-input v-model="form.name" placeholder="请è¾å ¥åç§°" v-trim/> </el-form-item> <el-form-item label="设å¤å°åå" prop="no"> <el-input v-model="form.no" placeholder="请è¾å ¥è®¾å¤æ è¯ç¬¦" v-trim/> </el-form-item> <el-form-item label="设å¤å·" prop="doorNo"> <el-input v-model="form.doorNo" placeholder="请è¾å ¥åºåå·" v-trim/> </el-form-item> <el-form-item label="åå" prop="manufature"> <el-input v-model="form.manufature" placeholder="请è¾å ¥åå" v-trim/> </el-form-item> <el-form-item label="å®è£ ä½ç½®" prop="regionPathName"> <el-input v-model="form.regionPathName" placeholder="请è¾å ¥è®¾å¤ä½ç½®" v-trim/> </el-form-item> <el-form-item label="è¿æ¥IP" prop="ip"> <el-input v-model="form.ip" placeholder="请è¾å ¥è®¾å¤è¿æ¥IPå°å" v-trim/> </el-form-item> <el-form-item label="è¿æ¥ç«¯å£" prop="port"> <el-input v-model="form.port" placeholder="请è¾å ¥è¿æ¥ç«¯å£" v-trim/> </el-form-item> <el-form-item label="çµæµæ¯" prop="channelNo"> <el-input v-model="form.channelNo" type="number" placeholder="请è¾å ¥çµæµæ¯" v-trim> <template slot="append">/5A</template> </el-input> </el-form-item> <el-form-item label="å¯ç ç级" prop="pwdLevel"> <el-input v-model="form.doorNameObj.pwdLevel" placeholder="请è¾å ¥å¯ç ç级" v-trim/> </el-form-item> <el-form-item label="å¯ç " prop="pwd"> <el-input v-model="form.doorNameObj.pwd" placeholder="请è¾å ¥è¿æ¥å¯ç " v-trim/> </el-form-item> <el-form-item label="æä½è 代ç " prop="userCode"> <el-input v-model="form.doorNameObj.userCode" placeholder="请è¾å ¥è®¾å¤æä½è 代ç " v-trim/> </el-form-item> </el-form> </GlobalWindow> </template> <script> import BaseOpera from '@/components/base/BaseOpera' import GlobalWindow from '@/components/common/GlobalWindow' export default { name: 'OperaDeviceDuanluqiWindow', extends: BaseOpera, components: { GlobalWindow }, data () { return { // è¡¨åæ°æ® form: { id: null, name: '', regionPathName: '', doorNo: '', no: '', type: 6, ip: '', port: '', level: '', doorName: '', doorId: '', doorNameObj: { pwdLevel: '', pwd: '', userCode: '' }, channelInfo: '', manufature: '', channelNo: '' }, // éªè¯è§å rules: { name: [ { required: true, message: '请è¾å ¥è®¾å¤åç§°' } ], doorName: [ { required: true, message: '请è¾å ¥è®¾å¤è¿æ¥å¯ç ' } ], channelNo: [ { required: true, message: '请è¾å ¥å¼å ³åºå·' } ], doorNo: [ { required: true, message: '请è¾å ¥è®¾å¤å·' } ], no: [ { required: true, message: '请è¾å ¥è®¾å¤æ è¯ç¬¦' } ] } } }, created () { this.config({ api: '/business/device', 'field.id': 'id' }) }, methods: { open (title, target) { this.title = title this.visible = true this.form.doorName = '' this.form.doorNameObj = { userCode: '', pwd: '', pwdLevel: '' } // debugger // æ°å»º if (target == null) { this.$nextTick(() => { this.$refs.form.resetFields() this.form[this.configData['field.id']] = null }) if(!this.form.doorNameObj){ this.form.doorNameObj = { pwdLevel: '', pwd: '', userCode: '' } } return } // ç¼è¾ this.$nextTick(async () => { if(!target.doorNameObj){ target.doorNameObj={ pwdLevel: '', pwd: '', userCode: ''} } for (const key in this.form) { this.form[key] = target[key] } }) } } } </script> admin/src/components/business/OperaDianbiaoDataListWindow.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,177 @@ <template> <GlobalWindow :title="title" width="100%" :visible.sync="visible" > <TableLayout > <!-- æç´¢è¡¨å --> <el-form ref="searchForm" slot="search-form" :model="searchForm" label-width="100px" inline> <div style="display: block;margin-bottom: 60px;padding: 20px; border: 1px solid #f2f2f2;"> <div style="display: block;font-size: 16px;font-weight: 600;margin-bottom: 20px;">设å¤ä¿¡æ¯</div> <div style="display: flex;"> <div style="flex: 1"><span class="label">åç§°ï¼</span>{{model.name ||''}}</div> <div style="flex: 1"><span class="label">å°ååï¼</span>{{model.no ||''}}</div> <div style="flex: 1"><span class="label">设å¤å·ï¼</span>{{model.doorNo ||'-'}}</div> </div> <div style="display: flex;margin-top: 20px;"> <div style="flex: 1"><span class="label">IPï¼</span>{{ model.ip ||'' }}</div> <div style="flex: 1"><span class="label">端å£ï¼</span>{{ model.port ||''}}</div> <div style="flex: 3"> <span class="label">æè¿æ§å¶æä½ï¼</span> <span class="orange" >{{model.remark||''}}</span> </div> </div> </div> <div class="platgroup_tabs"> <div class="tab" :class="{ active: activeGroup === item.id }" @click="groupClick(item)" v-for="(item, i) in groupList" :key="i"> {{ item.name }} </div> </div> </el-form> <!-- è¡¨æ ¼åå页 --> <template v-slot:table-wrap> <el-table v-if="activeGroup===0" v-loading="isWorking.search" :data="tableData.list" stripe> <el-table-column prop="happenTime" label="è¯»åæ¶é´" min-width="150px"></el-table-column> <el-table-column prop="val1" label="çµè½ï¼KWHï¼" min-width="120px"></el-table-column> <el-table-column prop="val2" label="ç¶æ" min-width="120px"> <template slot-scope="{row}"> <span v-if=" row.val2 === '0000'" class="green">åé¸</span> <span v-else-if=" row.val2 === '0050'" class="red">åé¸</span> <span v-else>-</span> </template> </el-table-column> <el-table-column prop="val3" label="çµè¡¨æ¶é´" min-width="120px"></el-table-column> </el-table> <el-table v-if="activeGroup===1" v-loading="isWorking.search" :data="tableData.list" stripe> <el-table-column prop="createDate" label="æä½æ¶é´" min-width="150px"></el-table-column> <el-table-column prop="val4" label="æä½äºº" min-width="100px" ></el-table-column> <el-table-column prop="val3" label="æä½å 容" min-width="100px"> <template slot-scope="{row}"> <span v-if=" row.val3 === 'ãåé¸ã'" class="green">{{row.val3||''}}</span> <span v-else-if=" row.val3 === 'ãåé¸ã'" class="red">{{row.val3||''}}</span> <span v-else>{{row.val3||''}}</span> </template> </el-table-column> <el-table-column prop="val2" label="å 容" min-width="300px" show-overflow-tooltip></el-table-column> </el-table> <pagination @size-change="handleSizeChange" @current-change="handlePageChange" :pagination="tableData.pagination" > </pagination> </template> </TableLayout> <template v-slot:footer> <el-button @click="visible=false">è¿å</el-button> </template> </GlobalWindow> </template> <script> import BaseTable from '@/components/base/BaseTable' import TableLayout from '@/layouts/TableLayout' import Pagination from '@/components/common/Pagination' import GlobalWindow from '@/components/common/GlobalWindow' export default { name: 'OperaJkSketchCustomerWindow', extends: BaseTable, components: { GlobalWindow, TableLayout, Pagination }, data () { return { // è¡¨åæ°æ® visible: false, title: '', activeGroup:0, model:{doorNameObj:{}}, groupList: [{ id: 0, name: 'æ°æ®ä¸æ¥è®°å½', type: 0 }, { id: 1, name: 'è¿ç¨æ§å¶è®°å½', type: 1 }], searchForm: { deviceId: null, val1: '', dataType:0 } } }, created () { this.config({ module: 'è®¾å¤æ°æ®ä¿¡æ¯è¡¨', api: '/business/deviceData', 'field.id': 'id', 'field.main': 'id' }) this.search() }, methods: { groupClick (item) { this.activeGroup = item.id this.searchForm.val1 = '' this.searchForm.dataType = item.type this.search() }, open (title, row) { this.title = title +' ã'+ (row.name)+'ã' this.searchForm.deviceId = row.id if(!row.doorNameObj) { row.doorNameObj = {} } this.model=row this.visible = true this.tableData = { // å·²éä¸çæ°æ® selectedRows: [], // æåºçåæ®µ sorts: [], // å½åé¡µæ°æ® list: [], // å页 pagination: { pageIndex: 1, pageSize: 10, total: 0 } } this.groupClick(this.groupList[0]) } } } </script> <style> .platgroup_tabs { flex: 1; display: flex; border-bottom: 1px solid #dfe2e8; margin-bottom:30px; .tab { color: #666666; margin-right: 40px; cursor: pointer; padding-bottom: 18px; border-bottom: 2px solid #fff; } .active { font-weight: 500; font-size: 15px; color: #2080f7; border-bottom: 2px solid $primary-color; } } .label{ /* width: 80px; text-align: right;*/ color: rgb(102, 102, 102); display: inline-block; } </style> admin/src/views/business/deviceDianbiao.vue
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,211 @@ <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 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="doorNameObj.pwdLevel" label="å¯ç ç级" align="center" min-width="150"></el-table-column> <el-table-column prop="doorNameObj.pwd" label="å¯ç " align="center"> <template slot-scope="{row}"> <span :class=" 'blue'">{{row.showPwd?row.doorNameObj.pwd:'******'}}</span> <el-button style="margin-left: 10px" v-if="row.doorNameObj.pwd!=null" @click.native.p.prevent="showPassward(row)" type="text"> <i class="el-icon-view" :class="row.showPwd?'red':'blue'" :title="row.showPwd?'éè':'æ¾ç¤º'"></i> </el-button> </template> </el-table-column> <el-table-column prop="doorNameObj.userCode" label="æä½è 代ç " align="center" min-width="150"></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="readData(row)" 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="cmdDate"> <el-date-picker type="datetime" v-model="form.cmdDate" value-format="yyyy-MM-dd HH:mm:ss" placeholder="è¯·éæ©æææ¶é´" /> </el-form-item> <!-- <p class="tip-warn" style="width: 100%;"><i class="el-icon-warning"></i></p> --> </el-form> <template v-slot:footer > <el-button @click="sendAction(0)" type="primary" v-if="form.status === 1" :loading="isWorkSending">确认å¼é¸</el-button> <el-button @click="sendAction(1)" type="danger" v-if="form.status !== 1" :loading="isWorkSending">ç¡®è®¤å ³é¸</el-button> <el-button @click="sendClose()">è¿å</el-button> </template> </el-dialog> <!-- æ°å»º/ä¿®æ¹ --> <OperaDeviceDianbiaoWindow 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/OperaDianbiaoDataListWindow' import OperaDeviceDianbiaoWindow from '@/components/business/OperaDeviceDianbiaoWindow' export default { name: 'DeviceDuanluqi', extends: BaseTable, components: { TableLayout, Pagination, OperaDeviceDianbiaoWindow, OperaDeviceDataListWindow }, data () { return { // æç´¢ searchForm: { doorNo: '', no: '', name: '', type: 6 }, isWorkSending: false, form: { id: '', status: null, name:null, cmdDate: null }, visibleSend: false, options: [], rules: { cmdDate: [{ required: true, message: 'è¯·éæ©æä½æææ¶é´' }] } } }, 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 (status) { this.form.status = status this.$dialog.actionConfirm('确认è¿è¡çµè¡¨ã' + (this.form.status === 1 ? 'å¼é¸' : 'å ³é¸') + 'ãæä½åï¼', 'æä½ç¡®è®¤æé') .then(() => { console.log(this.form) this.isWorkSending = true this.api.dianbaoCmd(this.form) .then(res => { this.$tip.apiSuccess(res || 'è¯·æ±æå') this.handlePageChange() }) .catch(e => { }) .finally(() => { this.isWorkSending = false }) }) .catch(() => {}) }, readData (row) { this.api.dianbiaoData({ id: row.id }) .then(res => { this.$tip.apiSuccess(res || 'è¯·æ±æå') this.handlePageChange() }) .catch(e => { }) .finally(() => { this.isWorkSending = false }) }, send (row, type) { this.visibleSend = true this.form = { id: row.id, name: row.name, cmdDate: null, status: type} }, sendClose () { this.visibleSend = false this.isWorkSending = false this.form = { id: '', name: '', status: '', cmdDate: '' } } } } </script> admin/src/views/roomStatus/index.vue
@@ -288,7 +288,7 @@ </div> </div> <div class="xm_house_list_right"> <template v-for="(child, i) in item.roomsList" :key="i"> <template v-for="(child, i) in item.roomsList" > <div class="xm_house_list_right_row" v-for="(childThree, a) in child" :key="a" :style="{ width: childThree.width + 'px', backgroundColor: ifBackground(childThree.roomStatus) }"> <div class="ft"> <span>{{childThree.roomCode}}</span> @@ -305,7 +305,6 @@ <div class="xm_house_list_right_row_day" v-if="childThree.roomStatus === 0">æªåºç§ï½ç©ºç½®{{childThree.freeDayAmount}}天</div> </div> </template> </div> </div> </div> @@ -498,7 +497,7 @@ <el-table :data="tableData" border v-lading="loading" v-loading="loading" style="width: 100%"> <el-table-column prop="categoryName" @@ -687,6 +686,7 @@ label: 'é»éç³' }], value: '', ids:[], form: { name: '', status: '', server/system_gateway/src/main/resources/application-dev.yml
@@ -1,9 +1,9 @@ spring: # æ°æ®æºé ç½® datasource: url: jdbc:mysql://112.26.66.25:3306/funingyunwei?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: Doumee@168&QWERT password: Doumee@168 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource server/system_gateway/src/main/resources/application-test.yml
@@ -1,9 +1,9 @@ spring: # æ°æ®æºé ç½® datasource: url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: doumee password: rtjgfEr@&0c0m url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: Doumee@168 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource server/system_gateway/src/main/resources/bootstrap-dev.yml
@@ -1,13 +1,13 @@ spring: cloud: nacos: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å username: nacos password: nacos discovery: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å # namespace: dmvisit namespace: dev_renkang namespace: funingyunwei_dev username: nacos password: nacos gateway: server/system_gateway/src/main/resources/bootstrap-test.yml
@@ -1,12 +1,12 @@ spring: cloud: nacos: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å username: nacos password: nacos discovery: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å namespace: funing_test server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å namespace: funingyunwei_test # namespace: dev_renkang username: nacos password: nacos server/system_service/src/main/java/com/doumee/core/utils/Constants.java
@@ -50,6 +50,8 @@ public static final String HK_HOST ="HK_HOST" ; public static final String HK_APPKEY ="HK_APPKEY" ; public static final String LOGIN_OUT_URL ="LOGIN_OUT" ; public static boolean DEALING_DUANLUQI_CLOSE = false; public static final String HK_APPSECRET ="HK_APPSECRET" ; public static final String HK_HTTPS ="HK_HTTPS" ; public static final String HK_PUSH_URL = "HK_PUSH_URL"; @@ -108,7 +110,16 @@ public static final String INTERVAL = "INTERVAL"; public static final String USE_CAR_TAKE_CARE = "USE_CAR_TAKE_CARE"; //ç±»å 0é¨ç¦ 1è½¦åº 2LED 3广æç¹ 4广æè®¾å¤ 5æè·¯å¨ç©ºå¼ 6çµè¡¨ public interface DEVICE_TYPE{ public static final int door = 0; public static final int park = 1; public static final int led = 2; public static final int broadcaset = 3; public static final int broadcasetChannel = 4; public static final int duanluqi = 5; public static final int dianbiao = 6; } // å³å¡æ¥è®¿é ç½® server/system_timer/src/main/resources/application-dev.yml
@@ -1,9 +1,9 @@ spring: # æ°æ®æºé ç½® datasource: url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: doumee password: rtjgfEr@&0c0m url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: Doumee@168 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource redis: server/system_timer/src/main/resources/application-pro.yml
@@ -11,10 +11,7 @@ time-zone: GMT+8 date-format: yyyy-MM-dd HH:mm:ss debug_model: false captcha_check: true # Swaggeré ç½® server/system_timer/src/main/resources/application-test.yml
@@ -1,9 +1,9 @@ spring: # æ°æ®æºé ç½® datasource: url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: doumee password: rtjgfEr@&0c0m url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: Doumee@168 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource redis: server/system_timer/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@ # ææ¶å ³éç¼å enabled: false nacos: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å username: nacos password: nacos # config: @@ -22,7 +22,7 @@ # group: dev # data-id: com.doumee.meeting.admin discovery: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å namespace: dev_renkang server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å namespace: funingyunwei_dev username: nacos password: nacos server/system_timer/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@ # ææ¶å ³éç¼å enabled: false nacos: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å username: nacos password: nacos # config: @@ -22,7 +22,7 @@ # group: dev # data-id: com.doumee.meeting.admin discovery: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å namespace: funing_test server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å namespace: funingyunwei_test username: nacos password: nacos server/system_timer/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@ spring: profiles: active: pro active: dev application: name: systemTimer # å®å ¨é ç½® server/visits/admin_timer/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@ # ææ¶å ³éç¼å enabled: false nacos: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å username: nacos password: nacos # config: @@ -22,7 +22,7 @@ # group: dev # data-id: com.doumee.meeting.admin discovery: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å namespace: dev_renkang server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å namespace: funingyunwei_dev username: nacos password: nacos server/visits/admin_timer/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@ # ææ¶å ³éç¼å enabled: false nacos: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å username: nacos password: nacos # config: @@ -22,7 +22,7 @@ # group: dev # data-id: com.doumee.meeting.admin discovery: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å namespace: funing_test server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å namespace: funingyunwei_test username: nacos password: nacos server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceCloudController.java
@@ -19,6 +19,7 @@ import java.util.ArrayList; import java.util.Date; import java.util.List; /** * @author æ±è¹è¹ * @date 2023/11/30 15:33 @@ -36,6 +37,7 @@ @PostMapping("/create") @CloudRequiredPermission("business:device:create") public ApiResponse create(@RequestBody Device device,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){ device.setLoginUserInfo(this.getLoginUser(token)); return ApiResponse.success(deviceService.create(device)); } @@ -43,18 +45,47 @@ @GetMapping("/delete/{id}") @CloudRequiredPermission("business:device:delete") public ApiResponse deleteById(@PathVariable Integer id,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){ deviceService.deleteById(id); deviceService.deleteById(id,this.getLoginUser(token)); return ApiResponse.success(null); } @ApiOperation("ä¿®æ¹æ¯å¦é¨ç¦å ¥å£") @PostMapping("/updateEntranceById") @CloudRequiredPermission("business:company:update") @CloudRequiredPermission("business:device:update") public ApiResponse updateStatusById(@RequestBody Device param,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){ Device d = new Device(); d.setId(param.getId()); d.setEditDate(new Date()); d.setIsEntrance(Constants.formatIntegerNum(param.getIsEntrance())); d.setLoginUserInfo(this.getLoginUser(token)); deviceService.updateById(d); return ApiResponse.success(null); } @ApiOperation("ä¿®æ¹æ¯å¦ç³»ç»ä½¿ç¨") @PostMapping("/updateUsedById") @CloudRequiredPermission("business:device:update") public ApiResponse updateUsedById(@RequestBody Device param,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){ Device d = new Device(); d.setId(param.getId()); d.setEditDate(new Date()); d.setLoginUserInfo(this.getLoginUser(token)); d.setIsUsed(Constants.formatIntegerNum(param.getIsUsed())); deviceService.updateUsedById(d); return ApiResponse.success(null); } @ApiOperation("æ§è¡çµè¡¨å¼å ³é¸æä½") @PostMapping("/dianbaoCmd") @CloudRequiredPermission("business:device:update") public ApiResponse dianbaoCmd(@RequestBody Device param,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){ param.setLoginUserInfo(this.getLoginUser(token)); deviceService.dianbaoCmd(param); return ApiResponse.success(null); } @ApiOperation("读åçµè¡¨æ°æ®ï¼çµè½ãæ¶é´åç¶æï¼") @PostMapping("/dianbiaoData") @CloudRequiredPermission("business:device:update") public ApiResponse dianbiaoData(@RequestBody Device param,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){ param.setLoginUserInfo(this.getLoginUser(token)); deviceService.dianbiaoData(param); return ApiResponse.success(null); } @@ -67,7 +98,7 @@ for (String id : idArray) { idList.add(Integer.valueOf(id)); } deviceService.deleteByIdInBatch(idList); deviceService.deleteByIdInBatch(idList,this.getLoginUser(token)); return ApiResponse.success(null); } @@ -75,6 +106,8 @@ @PostMapping("/updateById") @CloudRequiredPermission("business:device:update") public ApiResponse updateById(@RequestBody Device device,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){ device.setLoginUserInfo(this.getLoginUser(token)); deviceService.updateById(device); return ApiResponse.success(null); } @@ -85,6 +118,12 @@ public ApiResponse<PageData<Device>> findPage (@RequestBody PageWrap<Device> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){ return ApiResponse.success(deviceService.findPage(pageWrap)); } @ApiOperation("æ¥è¯¢å ¨é¨") @PostMapping("/list") @CloudRequiredPermission("business:device:query") public ApiResponse<List<Device>> findPage (@RequestBody Device model,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){ return ApiResponse.success(deviceService.findList(model)); } @ApiOperation("导åºExcel") @PostMapping("/exportExcel") server/visits/dmvisit_admin/src/main/java/com/doumee/cloud/admin/DeviceDataCloudController.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,45 @@ package com.doumee.cloud.admin; import com.doumee.api.BaseController; import com.doumee.config.annotation.CloudRequiredPermission; import com.doumee.core.annotation.excel.ExcelExporter; import com.doumee.core.utils.Constants; import com.doumee.dao.business.model.DeviceData; import com.doumee.service.business.DeviceDataService; import com.doumee.core.model.ApiResponse; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import io.swagger.annotations.Api; import io.swagger.annotations.ApiOperation; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.*; import javax.servlet.http.HttpServletResponse; /** * @author æ±è¹è¹ * @date 2023/11/30 15:33 */ @Api(tags = "è®¾å¤æ°æ®ä¿¡æ¯è¡¨") @RestController @RequestMapping(Constants.CLOUD_SERVICE_URL_INDEX+"/business/deviceData") public class DeviceDataCloudController extends BaseController { @Autowired private DeviceDataService deviceDataService; @ApiOperation("å页æ¥è¯¢") @PostMapping("/page") @CloudRequiredPermission("business:device:query") public ApiResponse<PageData<DeviceData>> findPage (@RequestBody PageWrap<DeviceData> pageWrap,@RequestHeader(Constants.HEADER_USER_TOKEN) String token){ return ApiResponse.success(deviceDataService.findPage(pageWrap)); } @ApiOperation("导åºExcel") @PostMapping("/exportExcel") @CloudRequiredPermission("business:device:exportExcel") public void exportExcel (@RequestBody PageWrap<DeviceData> pageWrap, HttpServletResponse response, @RequestHeader(Constants.HEADER_USER_TOKEN) String token){ ExcelExporter.build(DeviceData.class).export(deviceDataService.findPage(pageWrap).getRecords(), "设å¤ä¿¡æ¯è¡¨", response); } } server/visits/dmvisit_admin/src/main/resources/bootstrap-dev.yml
@@ -10,7 +10,7 @@ # ææ¶å ³éç¼å enabled: false nacos: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å username: nacos password: nacos # config: @@ -22,9 +22,9 @@ # group: dev # data-id: com.doumee.meeting.admin discovery: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å # namespace: dmvisit namespace: dev_renkang namespace: funingyunwei_dev username: nacos password: nacos # swaggeré ç½® server/visits/dmvisit_admin/src/main/resources/bootstrap-test.yml
@@ -10,7 +10,7 @@ # ææ¶å ³éç¼å enabled: false nacos: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å username: nacos password: nacos # config: @@ -22,7 +22,7 @@ # group: dev # data-id: com.doumee.meeting.admin discovery: server-addr: http://175.27.187.84:8848 #é ç½®Nacoså°å namespace: funing_test server-addr: http://192.168.0.7:8848 #é ç½®Nacoså°å namespace: funingyunwei_test username: nacos password: nacos server/visits/dmvisit_admin/src/main/resources/bootstrap.yml
@@ -1,6 +1,6 @@ spring: profiles: active: pro active: dev application: name: visitsAdmin # å®å ¨é ç½® server/visits/dmvisit_service/src/main/java/com/doumee/core/device/WaterElectricityUtil.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,600 @@ package com.doumee.core.device; 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); // è§£æååºæ°æ® 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åèçBCDå°åï¼å°ç«¯åºï¼ */ 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); } // 注æï¼ä¸é¢ç循ç¯é¡ºåºå·²ç»æ¯å°ç«¯åºï¼result[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 addByte(String value, byte add) { byte b = (byte) Integer.parseInt(value, 16); int result = (b & 0xFF) + (add & 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); // åååå¨ï¼nArr[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:æ£å¸¸)ï¼ * Y0.B1ãéé¨ç¶æ (1:æ é,0:æ£å¸¸)ï¼ * Y0.B2ãä¿¡å·ç¶æ (1:æ é,0:æ£å¸¸)ï¼ * Y0.B3ãçµæ± ç¶æ (1:æ é,0:æ£å¸¸)ï¼ * Y0.B4ãä¿çï¼ * Y0.B5ãä¿çï¼ * Y0.B6ãæ°´è¡¨éè®¯ç¶æï¼ 1:æ é,0:æ£å¸¸ï¼ï¼ * 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); } /** * çµè¡¨è·³é¸ãåé¸ * @param ip * @param port * @param addressBuf * @param type ï¼0è·³é¸ 1åé¸ï¼ * @param date æææªæ¢æ¶é´ * @throws IOException */ private static boolean electricityControl(String ip, int port, byte[] addressBuf,int type, String date) { /** * N1为æ§å¶å½ä»¤ç±»åï¼N1=1AH代表跳é¸4Dï¼N1=1BH代表åé¸4Få 许N2ä¿ç * æéå¯ç æä½ä»£ç ï¼PAP2P1P0C3C2C1C0(02/223203/111111H) * 4F * TCP/IPç´æ¥å鏿令[2026å¹´03æ09æ¥ 10:57:39] * Tx ->FEFEFEFE68615121010000681C1035366555776655444F33568843433659E016 * TCP/IPç´æ¥å鏿令[2026å¹´03æ09æ¥ 10:57:40] * Rx <-FEFEFEFE68615121010000689C004016 * ç´æ¥å鏿§è¡æåï¼ 9C */ try { byte control = 0x1C; byte n1 = 0x4D; if(type==1){ n1 = 0x4F; } // byte[] data0 = {0x02, 0x03, 0x32, 0x22,0x44,0x33,0x22,0x11}; byte[] data = {0x35, 0x36, 0x65, 0x55,0x77,0x66,0x55,0x44,n1,0x33,0,0,0,0,0,0}; byte[] data2 = getDateBytes(date); for (int i = 0; i < data2.length; i++) { data[10+i]=data2[i]; } byte[] bufReq = getRequestParam(4, addressBuf, control, data); String reqt = bytesToHex(bufReq); System.out.println(reqt); byte[] respBuf = readDeviceData(ip, port, bufReq); String resp = bytesToHex(respBuf); System.out.println(resp); //FEFEFEFE68379707010000689C004216 String msg = resp.substring(24, 26); return msg.equals("9C"); }catch (Exception e){ } return false; } private static byte[] getDateBytes(String dateStr) { // String dateStr = new SimpleDateFormat("yyyyMMddHHmmss").format(date); dateStr = dateStr.substring(2); // 1. éªè¯è¾å ¥ if (dateStr == null || dateStr.length() != 12) { throw new IllegalArgumentException("æ¶é´å¿ é¡»æ¯12ä½åè¿å¶æ°"); } if (!dateStr.matches("\\d{12}")) { throw new IllegalArgumentException("æ¶é´å¿ é¡»å ¨é¨æ¯æ°å"); } // 2. åå¤ç»ææ°ç»ï¼6åèï¼ byte[] result = new byte[6]; // 3. ä»å³åå·¦æ¯2ä½ä¸ç»å¤çï¼å°ç«¯åºï¼ byte add = 0x33; for (int i = 0; i < 6; i++) { // 计ç®å¨å符串ä¸çä½ç½®ï¼ä»å³åå·¦ï¼ int strIndex = 10 - (i * 2); // å 为è¦å两ä½ï¼æä»¥æ¯10,8,6,4,2,0 String twoDigits = dateStr.substring(strIndex, strIndex + 2); // å°ä¸¤ä½åè¿å¶æ°è½¬æ¢ä¸ºBCDåè // ä¾å¦ï¼"25" -> 0x25 int t = Integer.parseInt(twoDigits, 16); int t1 = ( t& 0xFF) + (add & 0xFF); System.out.println(t1+":"); result[i] =(byte) t1 ; } // 注æï¼ä¸é¢ç循ç¯é¡ºåºå·²ç»æ¯å°ç«¯åºï¼result[0]åçæ¯æä½ä¸¤ä½ return result; } 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); System.out.println( formatData(date)); // String resp = "FEFEFEFE 68 615121010000 68 91 06 36383337 3333 7916"; map.put("time", date); // 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å¹´MMæddæ¥HHæ¶mmåssç§"); try { return df.format(date); } catch (Exception e) { } return null; } public static Map<String, Object> electricityData(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; } public static boolean electricityAct(String ip, int port, String address,int type,String dateStr) { Map<String, Object> r = new HashMap<>(); byte[] addressBuf = convertToBCDAddress(address); return electricityControl(ip,port,addressBuf,type,dateStr); } 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 = electricityData("192.168.1.78", 1030, "000001215161"); // System.out.println(JSONObject.toJSONString(map)); electricityAct("192.168.1.78", 1030, "000001215161",0,"20260309162655"); // FEFEFE6899254652010068810 843C3333433333333 E9 16 // FEFEFE6899254652010068810 84 3C3333433333333E916 // Map<String, Object> map1 = water("192.168.1.78", 1030, "000152462599"); // System.out.println(JSONObject.toJSONString(map1)); } } server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/DeviceDataMapper.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,12 @@ package com.doumee.dao.business; import com.baomidou.mybatisplus.core.mapper.BaseMapper; import com.doumee.dao.business.model.DeviceData; /** * @author æ±è¹è¹ * @date 2025/12/25 10:04 */ public interface DeviceDataMapper extends BaseMapper<DeviceData> { } server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/Device.java
@@ -1,5 +1,7 @@ package com.doumee.dao.business.model; import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.annotation.TableField; import com.doumee.core.annotation.excel.ExcelColumn; import com.doumee.core.model.LoginUserModel; import io.swagger.annotations.ApiModel; @@ -8,9 +10,9 @@ import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import lombok.Data; import com.fasterxml.jackson.annotation.JsonFormat; import java.util.Date; import java.math.BigDecimal; import java.util.Date; /** * 设å¤ä¿¡æ¯è¡¨ @@ -71,8 +73,8 @@ @ExcelColumn(name="æåºç ") private Integer sortnum; @ApiModelProperty(value = "ç±»å 0é¨ç¦ 1è½¦åº 2LED 3广æ", example = "1") @ExcelColumn(name="ç±»å 0é¨ç¦ 1è½¦åº 2LED 3广æ") @ApiModelProperty(value = "ç±»å 0é¨ç¦ 1è½¦åº 2LED 3广æç¹ 4广æè®¾å¤ 5æè·¯å¨ç©ºå¼ 6海康çµè¡¨", example = "1") @ExcelColumn(name="ç±»å 0é¨ç¦ 1è½¦åº 2LED 3广æç¹ 4广æè®¾å¤ 5æè·¯å¨ç©ºå¼ 6海康çµè¡¨") private Integer type; @ApiModelProperty(value = "æ¯å¦ååºåºå ¥å£ 0䏿¯ 1æ¯", example = "1") @ExcelColumn(name="æ¯å¦ååºåºå ¥å£ 0䏿¯ 1æ¯") @@ -154,12 +156,14 @@ @ApiModelProperty(value = "é¨ç¦ç¹åç§°") @ExcelColumn(name="é¨ç¦ç¹åç§°") private String doorName; @ApiModelProperty(value = "ææ¥å 容") @TableField(exist = false) private String sendInfo; @ApiModelProperty(value = "è¿ç¨æä½æ¶é´åæ°") @TableField(exist = false) private Date cmdDate; @ApiModelProperty(value = "é ç½®åæ°") @TableField(exist = false) private JSONObject doorNameObj; } server/visits/dmvisit_service/src/main/java/com/doumee/dao/business/model/DeviceData.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,95 @@ package com.doumee.dao.business.model; import com.baomidou.mybatisplus.annotation.IdType; import com.baomidou.mybatisplus.annotation.TableId; import com.baomidou.mybatisplus.annotation.TableName; import com.doumee.core.annotation.excel.ExcelColumn; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; import lombok.Data; import java.util.Date; /** * é¨ç¦äºä»¶æ¨éè®°å½è¡¨ * @author æ±è¹è¹ * @date 2025/12/25 10:04 */ @Data @ApiModel("é¨ç¦äºä»¶æ¨éè®°å½è¡¨") @TableName("`device_data`") public class DeviceData { @TableId(type = IdType.AUTO) @ApiModelProperty(value = "主é®", example = "1") @ExcelColumn(name="主é®") private Integer id; @ApiModelProperty(value = "å建人ç¼ç ", example = "1") @ExcelColumn(name="å建人ç¼ç ") private Integer creator; @ApiModelProperty(value = "å建æ¶é´") @ExcelColumn(name="å建æ¶é´") private Date createDate; @ApiModelProperty(value = "æ´æ°äººç¼ç ", example = "1") @ExcelColumn(name="æ´æ°äººç¼ç ") private Integer editor; @ApiModelProperty(value = "æ´æ°æ¶é´") @ExcelColumn(name="æ´æ°æ¶é´") private Date editDate; @ApiModelProperty(value = "æ¯å¦å é¤0å¦ 1æ¯", example = "1") @ExcelColumn(name="æ¯å¦å é¤0å¦ 1æ¯") private Integer isdeleted; @ApiModelProperty(value = "夿³¨") @ExcelColumn(name="夿³¨") private String remark; @ApiModelProperty(value = "æ°æ®json对象", example = "1") @ExcelColumn(name="æ°æ®json对象") private String dataJson; @ApiModelProperty(value = "设å¤ç¼ç ï¼å ³èdevice)") @ExcelColumn(name="设å¤ç¼ç ï¼å ³èdevice)") private String deviceId; @ApiModelProperty(value = "åçæ¶é´") @ExcelColumn(name="åçæ¶é´") private String happenTime; @ApiModelProperty(value = "屿§å¼1") @ExcelColumn(name="屿§å¼1") private String val1; @ApiModelProperty(value = "屿§å¼2") @ExcelColumn(name="屿§å¼2") private String val2; @ApiModelProperty(value = "屿§å¼3") @ExcelColumn(name="屿§å¼3") private String val3; @ApiModelProperty(value = "屿§å¼4") @ExcelColumn(name="屿§å¼4") private String val4; @ApiModelProperty(value = "屿§å¼5") @ExcelColumn(name="屿§å¼5") private String val5; @ApiModelProperty(value = "屿§å¼6") @ExcelColumn(name="屿§å¼6") private String val6; @ApiModelProperty(value = "屿§å¼7") @ExcelColumn(name="屿§å¼7") private String val7; @ApiModelProperty(value = "æ°æ®æ¥æº 0mqtt䏿¥ç»¼åç¶æ 1è¿ç¨æ§å¶ 2TCPè¯»åæ°æ® ", example = "1") @ExcelColumn(name="æ°æ®æ¥æº 0mqtt䏿¥ç»¼åç¶æ 1è¿ç¨æ§å¶ 2TCPè¯»åæ°æ®") private Integer dataType; } server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceDataService.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,98 @@ package com.doumee.service.business; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.business.model.DeviceData; import java.util.List; /** * é¨ç¦äºä»¶æ¨éè®°å½è¡¨Serviceå®ä¹ * @author æ±è¹è¹ * @date 2025/12/25 10:04 */ public interface DeviceDataService { /** * å建 * * @param deviceData å®ä½å¯¹è±¡ * @return Integer */ Integer create(DeviceData deviceData); /** * 主é®å é¤ * * @param id ä¸»é® */ void deleteById(Integer id); /** * å é¤ * * @param deviceData å®ä½å¯¹è±¡ */ void delete(DeviceData deviceData); /** * æ¹é主é®å é¤ * * @param ids 主é®é */ void deleteByIdInBatch(List<Integer> ids); /** * 䏻鮿´æ° * * @param deviceData å®ä½å¯¹è±¡ */ void updateById(DeviceData deviceData); /** * æ¹é䏻鮿´æ° * * @param deviceDatas å®ä½é */ void updateByIdInBatch(List<DeviceData> deviceDatas); /** * 䏻鮿¥è¯¢ * * @param id ä¸»é® * @return DeviceData */ DeviceData findById(Integer id); /** * æ¡ä»¶æ¥è¯¢åæ¡è®°å½ * * @param deviceData å®ä½å¯¹è±¡ * @return DeviceData */ DeviceData findOne(DeviceData deviceData); /** * æ¡ä»¶æ¥è¯¢ * * @param deviceData å®ä½å¯¹è±¡ * @return List<DeviceData> */ List<DeviceData> findList(DeviceData deviceData); /** * å页æ¥è¯¢ * * @param pageWrap å页对象 * @return PageData<DeviceData> */ PageData<DeviceData> findPage(PageWrap<DeviceData> pageWrap); /** * æ¡ä»¶ç»è®¡ * * @param deviceData å®ä½å¯¹è±¡ * @return long */ long count(DeviceData deviceData); } server/visits/dmvisit_service/src/main/java/com/doumee/service/business/DeviceService.java
@@ -1,11 +1,12 @@ package com.doumee.service.business; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.doumee.core.haikang.model.param.request.AcsDeviceListRequest; import com.doumee.core.haikang.model.param.request.TransparentChannelSingleRequest; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.dao.business.model.Device; import org.eclipse.paho.client.mqttv3.MqttMessage; import java.util.List; /** @@ -14,6 +15,7 @@ * @date 2023/11/30 15:33 */ public interface DeviceService { /** * å建 @@ -28,7 +30,7 @@ * * @param id ä¸»é® */ void deleteById(Integer id); void deleteById(Integer id, LoginUserInfo userInfo); /** * å é¤ @@ -42,7 +44,7 @@ * * @param ids 主é®é */ void deleteByIdInBatch(List<Integer> ids); void deleteByIdInBatch(List<Integer> ids, LoginUserInfo userInfo); /** * 䏻鮿´æ° @@ -106,4 +108,11 @@ long count(Device device); void setLedContent(TransparentChannelSingleRequest body); void setBroadcaseBobao(Device body); void updateUsedById(Device d); void dianbaoCmd(Device param); void dianbiaoData(Device param); } server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceDataServiceImpl.java
¶Ô±ÈÐÂÎļþ @@ -0,0 +1,161 @@ package com.doumee.service.business.impl; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Utils; import com.doumee.dao.business.DeviceDataMapper; import com.doumee.dao.business.model.DeviceData; import com.doumee.service.business.DeviceDataService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.util.CollectionUtils; import java.util.List; /** * é¨ç¦äºä»¶æ¨éè®°å½è¡¨Serviceå®ç° * @author æ±è¹è¹ * @date 2025/12/25 10:04 */ @Service public class DeviceDataServiceImpl implements DeviceDataService { @Autowired private DeviceDataMapper deviceDataMapper; @Override public Integer create(DeviceData deviceData) { deviceDataMapper.insert(deviceData); return deviceData.getId(); } @Override public void deleteById(Integer id) { deviceDataMapper.deleteById(id); } @Override public void delete(DeviceData deviceData) { UpdateWrapper<DeviceData> deleteWrapper = new UpdateWrapper<>(deviceData); deviceDataMapper.delete(deleteWrapper); } @Override public void deleteByIdInBatch(List<Integer> ids) { if (CollectionUtils.isEmpty(ids)) { return; } deviceDataMapper.deleteBatchIds(ids); } @Override public void updateById(DeviceData deviceData) { deviceDataMapper.updateById(deviceData); } @Override public void updateByIdInBatch(List<DeviceData> deviceDatas) { if (CollectionUtils.isEmpty(deviceDatas)) { return; } for (DeviceData deviceData: deviceDatas) { this.updateById(deviceData); } } @Override public DeviceData findById(Integer id) { return deviceDataMapper.selectById(id); } @Override public DeviceData findOne(DeviceData deviceData) { QueryWrapper<DeviceData> wrapper = new QueryWrapper<>(deviceData); return deviceDataMapper.selectOne(wrapper); } @Override public List<DeviceData> findList(DeviceData deviceData) { QueryWrapper<DeviceData> wrapper = new QueryWrapper<>(deviceData); return deviceDataMapper.selectList(wrapper); } @Override public PageData<DeviceData> findPage(PageWrap<DeviceData> pageWrap) { IPage<DeviceData> page = new Page<>(pageWrap.getPage(), pageWrap.getCapacity()); QueryWrapper<DeviceData> queryWrapper = new QueryWrapper<>(); Utils.MP.blankToNull(pageWrap.getModel()); if (pageWrap.getModel().getId() != null) { queryWrapper.lambda().eq(DeviceData::getId, pageWrap.getModel().getId()); } if (pageWrap.getModel().getCreator() != null) { queryWrapper.lambda().eq(DeviceData::getCreator, pageWrap.getModel().getCreator()); } if (pageWrap.getModel().getCreateDate() != null) { queryWrapper.lambda().ge(DeviceData::getCreateDate, Utils.Date.getStart(pageWrap.getModel().getCreateDate())); queryWrapper.lambda().le(DeviceData::getCreateDate, Utils.Date.getEnd(pageWrap.getModel().getCreateDate())); } if (pageWrap.getModel().getEditor() != null) { queryWrapper.lambda().eq(DeviceData::getEditor, pageWrap.getModel().getEditor()); } if (pageWrap.getModel().getEditDate() != null) { queryWrapper.lambda().ge(DeviceData::getEditDate, Utils.Date.getStart(pageWrap.getModel().getEditDate())); queryWrapper.lambda().le(DeviceData::getEditDate, Utils.Date.getEnd(pageWrap.getModel().getEditDate())); } if (pageWrap.getModel().getIsdeleted() != null) { queryWrapper.lambda().eq(DeviceData::getIsdeleted, pageWrap.getModel().getIsdeleted()); } if (pageWrap.getModel().getRemark() != null) { queryWrapper.lambda().eq(DeviceData::getRemark, pageWrap.getModel().getRemark()); } if (pageWrap.getModel().getDataJson() != null) { queryWrapper.lambda().eq(DeviceData::getDataJson, pageWrap.getModel().getDataJson()); } if (pageWrap.getModel().getDeviceId() != null) { queryWrapper.lambda().eq(DeviceData::getDeviceId, pageWrap.getModel().getDeviceId()); } if (pageWrap.getModel().getHappenTime() != null) { queryWrapper.lambda().eq(DeviceData::getHappenTime, pageWrap.getModel().getHappenTime()); } if (pageWrap.getModel().getVal1() != null) { queryWrapper.lambda().eq(DeviceData::getVal1, pageWrap.getModel().getVal1()); } if (pageWrap.getModel().getVal2() != null) { queryWrapper.lambda().eq(DeviceData::getVal2, pageWrap.getModel().getVal2()); } if (pageWrap.getModel().getVal3() != null) { queryWrapper.lambda().eq(DeviceData::getVal3, pageWrap.getModel().getVal3()); } if (pageWrap.getModel().getVal4() != null) { queryWrapper.lambda().eq(DeviceData::getVal4, pageWrap.getModel().getVal4()); } if (pageWrap.getModel().getVal5() != null) { queryWrapper.lambda().eq(DeviceData::getVal5, pageWrap.getModel().getVal5()); } if (pageWrap.getModel().getVal6() != null) { queryWrapper.lambda().eq(DeviceData::getVal6, pageWrap.getModel().getVal6()); } if (pageWrap.getModel().getDataType() != null) { queryWrapper.lambda().eq(DeviceData::getDataType, pageWrap.getModel().getDataType()); } queryWrapper.lambda().orderByDesc(DeviceData::getHappenTime); for(PageWrap.SortData sortData: pageWrap.getSorts()) { if (sortData.getDirection().equalsIgnoreCase(PageWrap.DESC)) { queryWrapper.orderByDesc(sortData.getProperty()); } else { queryWrapper.orderByAsc(sortData.getProperty()); } } return PageData.from(deviceDataMapper.selectPage(page, queryWrapper)); } @Override public long count(DeviceData deviceData) { QueryWrapper<DeviceData> wrapper = new QueryWrapper<>(deviceData); return deviceDataMapper.selectCount(wrapper); } } server/visits/dmvisit_service/src/main/java/com/doumee/service/business/impl/DeviceServiceImpl.java
@@ -2,29 +2,36 @@ import com.alibaba.fastjson.JSONObject; import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.exception.BusinessException; import com.doumee.core.haikang.model.HKConstants; import com.doumee.core.haikang.model.param.BaseResponse; import com.doumee.core.haikang.model.param.request.*; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Constants; import com.doumee.core.utils.Utils; import com.doumee.dao.business.DeviceMapper; import com.doumee.dao.business.PlatformBroadcastLogMapper; import com.doumee.dao.business.model.Device; import com.doumee.dao.business.model.PlatformBroadcastLog; import com.doumee.service.business.DeviceService; import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper; import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper; import com.baomidou.mybatisplus.core.metadata.IPage; import com.baomidou.mybatisplus.extension.plugins.pagination.Page; import com.doumee.biz.system.SystemDictDataBiz; import com.doumee.core.constants.ResponseStatus; import com.doumee.core.device.WaterElectricityUtil; import com.doumee.core.exception.BusinessException; import com.doumee.core.haikang.model.HKConstants; import com.doumee.core.haikang.model.param.BaseResponse; import com.doumee.core.haikang.model.param.request.CustomBroadcastRequest; import com.doumee.core.haikang.model.param.request.TransparentChannelSingleRequest; import com.doumee.core.haikang.service.HKService; import com.doumee.core.model.LoginUserInfo; import com.doumee.core.model.PageData; import com.doumee.core.model.PageWrap; import com.doumee.core.utils.Constants; import com.doumee.core.utils.DateUtil; import com.doumee.core.utils.Utils; import com.doumee.dao.business.*; import com.doumee.dao.business.model.Device; import com.doumee.dao.business.model.DeviceData; import com.doumee.dao.business.model.PlatformBroadcastLog; import com.doumee.service.business.DeviceService; import com.doumee.service.business.impl.hksync.HkSyncPushServiceImpl; import lombok.extern.slf4j.Slf4j; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Service; import org.springframework.transaction.annotation.Transactional; import org.springframework.util.CollectionUtils; import java.util.*; @@ -35,25 +42,54 @@ * @date 2023/11/30 15:33 */ @Service @Slf4j public class DeviceServiceImpl implements DeviceService { @Autowired private DeviceMapper deviceMapper; @Autowired private DeviceDataMapper deviceDataMapper; @Autowired private PlatformMapper platformMapper; @Autowired private PlatformDeviceMapper platformDeviceMapper; @Autowired private SystemDictDataBiz systemDictDataBiz; @Autowired private PlatformBroadcastLogMapper platformBroadcastLogMapper; @Autowired private InterfaceLogMapper interfaceLogMapper; @Override public Integer create(Device device) { deviceMapper.insert(device); return device.getId(); public Integer create(Device model) { model.setCreator(model.getLoginUserInfo().getId()+""); model.setEdirot(model.getCreator()); model.setIsdeleted(Constants.ZERO); model.setEditDate(new Date()); model.setCreateDate(model.getEditDate()); if(model.getDoorNameObj()!=null && (Constants.equalsInteger(model.getType(),Constants.DEVICE_TYPE.duanluqi) ||Constants.equalsInteger(model.getType(),Constants.DEVICE_TYPE.dianbiao))){ model.setDoorName(JSONObject.toJSONString(model.getDoorNameObj())); if(StringUtils.isNotBlank(model.getLevel())){ if(getNumberByStr(model.getLevel()) <300){ throw new BusinessException(ResponseStatus.BAD_REQUEST.getCode(),"对ä¸èµ·ï¼æ§å¶æ¶é¿å¿ 须大äºçäº300ç§"); } } } deviceMapper.insert(model); return model.getId(); } @Override public void deleteById(Integer id) { deviceMapper.deleteById(id); public void deleteById(Integer id, LoginUserInfo userInfo) { Device update = new Device(); update.setEdirot(userInfo.getId()+""); update.setEditDate(new Date()); update.setIsdeleted(Constants.ONE); update.setId(id); deviceMapper.updateById(update); } @Override @@ -63,16 +99,30 @@ } @Override public void deleteByIdInBatch(List<Integer> ids) { public void deleteByIdInBatch(List<Integer> ids, LoginUserInfo userInfo) { if (CollectionUtils.isEmpty(ids)) { return; } deviceMapper.deleteBatchIds(ids); for(Integer id :ids){ deleteById(id,userInfo); } } @Override public void updateById(Device device) { device.setEdirot(device.getLoginUserInfo().getId()+""); device.setEditDate(new Date()); if(device.getDoorNameObj()!=null && (Constants.equalsInteger(device.getType(),Constants.DEVICE_TYPE.duanluqi) ||Constants.equalsInteger(device.getType(),Constants.DEVICE_TYPE.dianbiao))){ device.setDoorName(JSONObject.toJSONString(device.getDoorNameObj())); } Device model = deviceMapper.selectById(device.getId()); if(model ==null){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } deviceMapper.updateById(device); } @Override @@ -87,7 +137,16 @@ @Override public Device findById(Integer id) { return deviceMapper.selectById(id); Device d = deviceMapper.selectById(id); if(StringUtils.isNotBlank(d.getDoorName()) &&Constants.equalsInteger(d.getType(),Constants.DEVICE_TYPE.duanluqi)){ try { //æè·¯å¨è®¾å¤åæ° d.setDoorNameObj(JSONObject.parseObject(d.getDoorName())); }catch (Exception e){ } } return d; } @Override @@ -98,6 +157,7 @@ @Override public List<Device> findList(Device device) { device.setIsdeleted(Constants.ZERO); QueryWrapper<Device> wrapper = new QueryWrapper<>(device); return deviceMapper.selectList(wrapper); } @@ -110,7 +170,20 @@ .eq(null !=param.getIsdeleted(),Device::getIsdeleted,param.getIsdeleted()) .eq(Objects.isNull(param.getIsdeleted()),Device::getIsdeleted,Constants.ZERO) .eq(null != param.getHkStatus(),Device::getHkStatus,param.getHkStatus()); return deviceMapper.selectList(wrapper); List<Device> list = deviceMapper.selectList(wrapper); if(list!=null){ for(Device d : list){ if(StringUtils.isNotBlank(d.getDoorName()) &&Constants.equalsInteger(d.getType(),Constants.DEVICE_TYPE.duanluqi)){ try { //æè·¯å¨è®¾å¤åæ° d.setDoorNameObj(JSONObject.parseObject(d.getDoorName())); }catch (Exception e){ } } } } return list; } @Override @@ -147,6 +220,12 @@ } if (pageWrap.getModel().getName() != null) { queryWrapper.lambda().like(Device::getName, pageWrap.getModel().getName()); } if (pageWrap.getModel().getDoorNo() != null) { queryWrapper.lambda().like(Device::getDoorNo, pageWrap.getModel().getDoorNo()); } if (pageWrap.getModel().getNo() != null) { queryWrapper.lambda().like(Device::getNo, pageWrap.getModel().getNo()); } if (pageWrap.getModel().getDoorName() != null) { queryWrapper.lambda().like(Device::getDoorName, pageWrap.getModel().getDoorName()); @@ -219,7 +298,22 @@ queryWrapper.orderByAsc(sortData.getProperty()); } } return PageData.from(deviceMapper.selectPage(page, queryWrapper)); IPage<Device> result = deviceMapper.selectPage(page, queryWrapper); if(result!=null){ for(Device d : result.getRecords()){ if(StringUtils.isNotBlank(d.getDoorName()) && (Constants.equalsInteger(d.getType(),Constants.DEVICE_TYPE.duanluqi)|| Constants.equalsInteger(d.getType(),Constants.DEVICE_TYPE.dianbiao))){ try { //æè·¯å¨è®¾å¤åæ° d.setDoorNameObj(JSONObject.parseObject(d.getDoorName())); }catch (Exception e){ } } } } return PageData.from(result); } @Override @@ -227,6 +321,123 @@ QueryWrapper<Device> wrapper = new QueryWrapper<>(device); return deviceMapper.selectCount(wrapper); } @Override public void setBroadcaseBobao(Device model){ List<String> ids = new ArrayList<>(); ids.add(model.getHkId()); CustomBroadcastRequest request = new CustomBroadcastRequest(); request.setAudioPointIndexCode(ids); request.setPlayDuration(15);//åä½ç§ request.setBroadCastMode("tts"); request.setPriority(1); request.setState(1);//ææ¾/忢æ è¯ 1-ææ¾ï¼0-忢 request.setPlayTtsContent(model.getSendInfo()); BaseResponse response = HKService.customBroadcast(request); if(response == null || !StringUtils.equals(response.getCode(), HKConstants.RESPONSE_SUCCEE)){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"åé失败ï¼"+ JSONObject.toJSONString(response)); } } @Override public void updateUsedById(Device param){ Device model = deviceMapper.selectById(param.getId()); if(model ==null && Constants.equalsInteger(param.getType(),Constants.DEVICE_TYPE.duanluqi)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } this.updateById(param); } @Override public void dianbaoCmd(Device param){ Device model = deviceMapper.selectById(param.getId()); if(model ==null && Constants.equalsInteger(param.getType(),Constants.DEVICE_TYPE.dianbiao)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } if (param.getStatus() == null || param.getCmdDate() == null ||param.getCmdDate().getTime() <= System.currentTimeMillis()) { //妿æ¯å¼é¸ throw new BusinessException(ResponseStatus.BAD_REQUEST); } boolean r ; String date = DateUtil.formatDate(new Date(),"yyyyMMddHHmmss"); if(Constants.equalsInteger(param.getStatus(),Constants.ONE)) { //妿æ¯å¼é¸ r = WaterElectricityUtil.electricityAct(param.getIp(),Integer.parseInt(param.getPort()),param.getNo(),0,date); }else { //妿æ¯åé¸ r = WaterElectricityUtil.electricityAct(param.getIp(),Integer.parseInt(param.getPort()),param.getNo(),1,date); } if(!r){ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"è¿ç¨æ§å¶çµè¡¨å¤±è´¥ï¼è¯·ç¨åéè¯ï¼"); } String curremak = "ã"+param.getLoginUserInfo().getRealname() +"ãäº"+ DateUtil.getPlusTime2(new Date()) +"è¿è¡äº"+(Constants.equalsInteger(param.getStatus(),Constants.ONE)?"ãåé¸ã":"ãåé¸ã")+"æä½,å¼å ³ã"+param.getChannelNo()+"ãï¼"; deviceMapper.update(null,new UpdateWrapper<Device>().lambda() .set(Device::getRemark,curremak) .set(Device::getEditDate,new Date()) .set(Device::getEdirot,param.getLoginUserInfo().getId()) .eq(Device::getId,param.getId())); DeviceData data = new DeviceData(); data.setCreateDate(new Date()); data.setEditDate(new Date()); data.setCreator(param.getLoginUserInfo().getId()); data.setEditor(param.getLoginUserInfo().getId()); data.setDeviceId(param.getId()+""); data.setDataType(Constants.ONE);// data.setVal1("è¿ç¨æ§å¶"); data.setVal2(curremak); data.setHappenTime(DateUtil.getPlusTime2(data.getCreateDate())); data.setVal3((Constants.equalsInteger(param.getStatus(),Constants.ONE)?"ãåé¸ã":"ãåé¸ã")); data.setVal4(param.getLoginUserInfo().getRealname()); data.setVal5(param.getChannelNo()); deviceDataMapper.insert(data); } @Override @Transactional public void dianbiaoData(Device param){ Device model = deviceMapper.selectById(param.getId()); if(model ==null && Constants.equalsInteger(param.getType(),Constants.DEVICE_TYPE.dianbiao)){ throw new BusinessException(ResponseStatus.DATA_EMPTY); } try { Map<String, Object> readData= WaterElectricityUtil.electricityData(model.getIp(),Integer.parseInt(model.getPort()),model.getNo()); if(readData!=null){ String curremak = "ã"+param.getLoginUserInfo().getRealname() +"ãäº"+ DateUtil.getPlusTime2(new Date()) +"è¿è¡äºæ°æ®è¯»åæä½"; Date time =(Date) readData.get("time"); String total = (Double) readData.get("total")+""; String status = (String) readData.get("status"); model.setHkDate(new Date());//æè¿åæ¥æ¶é´ model.setOnline(Constants.ONE);//æ è¯è®¾å¤å¨çº¿ model.setRemark(curremak); DeviceData data = new DeviceData(); data.setCreateDate(new Date()); data.setEditDate(new Date()); data.setCreator(param.getLoginUserInfo().getId()); data.setEditor(param.getLoginUserInfo().getId()); data.setDeviceId(param.getId()+""); data.setDataType(Constants.ZERO);// data.setVal1(total); data.setVal2(status); data.setHappenTime(DateUtil.getPlusTime2(data.getCreateDate())); data.setVal3(DateUtil.getPlusTime2(time)); data.setVal4(param.getLoginUserInfo().getRealname()); data.setVal5(param.getNo());//å°åå deviceDataMapper.insert(data); deviceMapper.updateById(model); } }catch (Exception e){ e.printStackTrace(); log.error("çµè¡¨æ°æ®è¯»å失败ï¼"+e.getMessage()); throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(),"读åçµè¡¨æ°æ®å¤±è´¥ï¼"); } } @Override public void setLedContent(TransparentChannelSingleRequest model) { @@ -250,4 +461,28 @@ throw new BusinessException(ResponseStatus.SERVER_ERROR.getCode(), "对ä¸èµ·ï¼å±å¹å 容设置失败"+(log!=null?log.getHkInfo():"")); } } private DeviceData getLastDataByVal1(String b, List<DeviceData> dataList,double limit) { List<DeviceData> list = new ArrayList<>(); for(DeviceData d :dataList){ if(StringUtils.equals(d.getVal1(),b)){ if(limit <= getNumberByStr(d.getVal2())){ //妿æå®æ¶çµæµå¼å¤§äºç©ºé²éå¼ï¼å表示工ä½ä¸ï¼ä¸åå¤ç return null; } list.add(d); } } return list.size()>0?list.get(0):null; } private double getNumberByStr(String level) { try { return Double.parseDouble(level); }catch (Exception e){ } return 0; } } server/visits/dmvisit_service/src/main/resources/application-dev.yml
@@ -1,9 +1,9 @@ spring: # æ°æ®æºé ç½® datasource: url: jdbc:mysql://112.26.66.25:3306/funingyunwei?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8 url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: Doumee@168&QWERT password: Doumee@168 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource redis: server/visits/dmvisit_service/src/main/resources/application-test.yml
@@ -1,9 +1,9 @@ spring: # æ°æ®æºé ç½® datasource: url: jdbc:mysql://sh-cdb-aiskr3vy.sql.tencentcdb.com:62443/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: doumee password: rtjgfEr@&0c0m url: jdbc:mysql://192.168.0.211:3306/funingyunwei?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai username: root password: Doumee@168 driver-class-name: com.mysql.cj.jdbc.Driver type: com.alibaba.druid.pool.DruidDataSource redis: